MySQL初阶:查询进阶

查询可以搭配插入操作进行使用:

创建一个class表(id int,varchar(10) classname),和一个student表(id int,varchar(10) studentname),class表中有三条记录,student表无记录:

此时使用查询和搭配操作就可以实现将class表中的记录全部插入到student表中:

注意事项:可以进行实行多次插入;插入表和被插入表的参数列表的列和类型要相同,否则会报错。

聚合查询

表达式查询是针对列和列之间进行运算,聚合查询是在行和行之间进行运算。

sql中通过-- 或 # 的方式代表注释

聚合函数

sql中提供了一些"聚合函数"来完成行和行之间的运算。

count([distinct] 列名):用于计算行数。

先计算select*,再针对结果集合进行统计。

注意事项:如果是count(*),当有null时也不会有影响;但是如果针对某一行,例如count(name),中出现null,null这一行记录就不会被计入,被直接忽略。

也可以用distinct进行去重。

sum([distinct] 列名):把这一列的若干行进行相加,但是只能针对数字类型(byte,int....)。

例如想求出所有同学的数学成绩:

同样的可以在括号内进行一些运算:

注意事项:如果有null,null会被排除不会进行相加。

如果进行字符串相加,结果是0,这是因为sql会尝试将字符串强转成数字,转不成功会有警告;如果插入的值是'07'这样的数,显示结果就是7。

avg([distinct] 列名):和sum类似,同样只能针对数字类型进行操作,是针对数字类型的行进行求相加后的平均值。

当遇到非数字类型就会进行强转,不成功警告。

max([distinct] 列名)和 min([distinct] 列名):分别求这一列中的最大/最小值,也是和sum一样,针对数字类型。

聚合查询

使用group by进行分组,针对每一个分组,再分别进行聚合查询。

创建一个表:

进行分组聚合查询:

使用group by时还可以搭配条件,但是要区分出条件是在分组之前还是在分组之后。

1) 如果是分组之前,使用where,一般在group by的前面。

2) 如果是分组后,使用having,在group by 后使用。

**3)**如果两个条件都要执行,则where和having可以一起使用。

注意事项:如果针对分组之后不使用聚合函数(此处的avg),此时的结果就是每一组的某一个代表数据。

这里的group by指定的这一列,每一组记录的列相同。

联合查询/多表查询

前面的查询,都是针对一个表,但是有些查询,则是一次性要从多表中进行查询。

笛卡尔积

笛卡尔积是简单的排列组合,把可能的的情况呢穷举了一遍,其中包含一些不合法的数据,所以在进行多表查询的时候要进行筛选。

排列组合

有两个表:class(id ,name),student(id,name,classid)

笛卡尔积就是取第一张表的每一条记录,和student中的记录进行匹配,得到的新记录就是5列:

id ,name,id,name,classid。

新表的记录数就是class表记录数和student表数之积,列数就是两表之和。

连接条件:通过sql条件筛选的条件是连接条件。

联合查询步骤

例如现在有一个score表,一个student表

现在要查询张三的成绩

1)先将两表进行笛卡尔积:

select * from score,student;

2)添加连接条件:

select * from score,student where class.id = student.student_id;

这里查询到的是class中id等于student中student_id的所有记录。

再进一步添加连接条件:

select * from score,student where class.id = student.student_id and student.name = '张三';

此时就完成了一次联合查询。

内连接和外链接

向上面这样的查询方法是内连接。

当两个表中的记录都有对应关系,查询结果就是内连接,但是当出现不对应关系时就要使用外连接。

但是将score中的3改成4,此时就student表中就没有数据对应。

左连接:select * from student left join score on student.id = score.student_id;

此时查询就会显示左边的值,而右边的值全部为null。

自连接

自连接是表自己和自己进行笛卡尔积。

sql中只能进行列和列之间的比较,但是可以使用自连接的方式进行行和行之间的比较。

使用时要给表起别名:select * from score as s1,score as s2;

合并查询

相关推荐
清幽竹客19 分钟前
redis数据结构-09 (ZADD、ZRANGE、ZRANK)
数据结构·数据库·redis
A~taoker24 分钟前
django扩展练习记录
数据库·django·sqlite
敲上瘾1 小时前
MySQL数据库表的约束
linux·数据库·sql·mysql·数据库开发·数据库架构·数据库系统
努力的搬砖人.1 小时前
SQLite 转换为 MySQL 数据库
数据库·mysql·sqlite
2301_803297752 小时前
Shell编程值正则表达式和文本处理器
数据库·mysql·正则表达式
老李不敲代码2 小时前
榕壹云搭子系统技术解析:基于Spring Boot+MySQL+UniApp的同城社交平台开发实践
spring boot·mysql·微信小程序·uni-app·软件需求
zhou1852 小时前
MySQL保姆级安装教程(附资源包+5分钟极速配置+环境变量调试技巧)
java·python·mysql·php
TDengine (老段)2 小时前
基于 TSBS 标准数据集下 TimescaleDB、InfluxDB 与 TDengine 性能对比测试报告
java·大数据·开发语言·数据库·时序数据库·tdengine·iotdb
TDengine (老段)3 小时前
TDengine 在金融领域的应用
大数据·数据库·物联网·金融·时序数据库·tdengine·涛思数据
标贝科技3 小时前
标贝科技:大模型领域数据标注的重要性与标注类型分享
数据库·人工智能