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 分钟前
APM(一):Skywalking 与 Easyearch 集成
数据库·云原生
饕餮争锋24 分钟前
SQL条件中WHERE 1=1 的功能
数据库·sql
玄斎1 小时前
MySQL 单表操作通关指南:建库 / 建表 / 插入 / 增删改查
运维·服务器·数据库·学习·程序人生·mysql·oracle
编织幻境的妖1 小时前
SQL查询连续登录用户方法详解
java·数据库·sql
编程小Y2 小时前
MySQL 与 MCP 集成全解析(核心原理 + 实战步骤 + 应用场景)
数据库·mysql·adb
零度@2 小时前
SQL 调优全解:从 20 秒到 200 ms 的 6 步实战笔记(附脚本)
数据库·笔记·sql
Miss_Chenzr2 小时前
Springboot优卖电商系统s7zmj(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
lvbinemail3 小时前
Grafana模板自动复制图表
数据库·mysql·zabbix·grafana·监控
Miss_Chenzr3 小时前
Springboot旅游景区管理系统9fu3n(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·旅游
小虾米vivian3 小时前
dmetl5 运行失败,提示违反协议?
数据库·达梦数据库