【MySQL】——数据查询_进阶操作(超详细)!!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 聚合查询,联合查询,内外连接,子查询,合并查询爽歪歪

  image.gif 编辑

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:聚合查询:行操作

1:count

2:sum

3:min()

4:avg() 和 gruop by

5:having

二:联合查询--多表查询(重点)

1:笛卡尔积:排列组合

2:笛卡尔积的精简

3:多表查询另一种写法(join... on...)

4:联合查询和聚合查询的结合使用

5:三个表进行笛卡尔+聚合

(1)三表笛卡尔

(2)指定连接条件

(3)指定其它条件

(4)针对列进行精简

三:内外连接

1:外连接

(1)左外连接

(2)右外连接:

(3)全外连接

2:内连接

3:自连接

四:子查询

1:套娃结构

五:合并查询

1:关键字union


一:聚合查询:行操作

聚合查询就是“行与行”之间的运算,这里的运算限制,只能通过:“聚合函数”来进行操作,可以理解成SQL提供的一些“库函数”。

image.gif 编辑

1:count

select count(*) from 表名

image.gif 编辑

(*)替换成具体的列(列名),如果该列中含有null,不计入count

image.gif 编辑

(*)查询,就算表里全为null的行,也会记录起来

image.gif 编辑

2:sum

①select sum(chinese) from exam_result;

chinese那一列全部相加,sum()函数中null会忽略掉,但在SQL中null与其他数字进行运算时,结果一般都是null。

image.gif 编辑

image.gif 编辑

②select sum(name)  from exam_result;

sql把字符串当做数字进行算术运算,都会尝试把字符串转化为数字,但是汉字不行

image.gif 编辑

警告,但是不影响程序能继续跑

image.gif 编辑

3:min()

查询整个表里语文成绩最低的同学 :select  min(chinese) from exam_result;

等价写法:select chinese from exam_result where chinese not null order by limit 1;

image.gif 编辑

4:avg() 和 gruop by

误区:没有“使用聚合的列”也可以和聚合函数完的列成为同一行数据

例如,按照职业计算其平均薪资

select role,avg(salary) from emp group by role; //这里的显示顺序不能认为是否存在任何顺序

image.gif 编辑

image.gif 编辑

5:having

分组之前(group by)的条件用where 来表示 , 分组之后用having来表示,用法同where

①:select role , avg(salary) from emp where name != '张三' gruop by role; //句意:把“张三”剔除后,各职业的平均薪资(分组前剔除)

image.gif 编辑

②:select role avg(salary) from emp where name != '张三' group by role having avg(salary) < 20000;             //句意:去除'张三'后,分组后,平均薪资水平低于20000的role

image.gif 编辑

总结使用:举例,分组操作往往都是跟聚合函数一同使用的

image.gif 编辑

二:联合查询--多表查询(重点)

注:多表联合核心操作就是笛卡尔积,比如两个表进行联合查询,那么就先让这两个表进行笛卡尔积,再加以限制条件,来实现一些需求中的查询结果,如果使用两个大号的表来进行笛卡尔积,危险操作,会产生大量的运算和IO,容易把数据库搞挂。

进行笛卡尔积的两个表,至少有一列是相关的,不然无意义

1:笛卡尔积:排列组合

select * from student , class;

image.gif 编辑

image.gif 编辑

image.gif 编辑

显而易见,上述表中是一张由两张小表组合成的大表,但其中有一些不合理的数据,现在我们加以约束条件

select * from student , class where  student.classId = class.classId ;

image.gif 编辑

如果有两个以上的表进行笛卡尔积,那么就两两进行,ABC中 :A和B先进行笛卡尔积,(AB)在和C进行。

2:笛卡尔积的精简

(1)笛卡尔积:select * from student , score; image.gif 编辑

(2)指定连接条件,精简结果 : select * from student , score where student.id = score.student_id;

image.gif 编辑

(3):再根据需求,补充其他条件

select * froms student , score   where   student.id = score.student_id    and   student.name = ‘许仙’;

image.gif 编辑

(4):针对上面的列,在进行精简

select student.name , score.name from student , score where student.id = score.student_id and student.name = ‘许仙’;

image.gif 编辑

3:多表查询另一种写法(join... on...)

(1)计算笛卡尔积:select * from student join  score;

(2)指定连接条件:select * from student join score on student.id = score.student_id;

(3)指定其他条件:select * from student join score on student.id = score.student_id and student.name = '许仙';

(4)针对列进行精简:select student.name ,  score.score  from  student  join  score  on  student.id = score.student_id and student.name = '许仙';

4:联合查询和聚合查询的结合使用

(1):

image.gif 编辑

写法①:select student.name , sum(score.score) as tatal from student , score where student.id = score.student_id gruop by student.name;

写法②:select student.name ,sum(score.score) as total  from student join score on student.id = score.student_id group by student.name;

//as tatal 是为了让表显示更简洁

image.gif 编辑

(2):错误写法

select * from student , score where student.id = score.student_id group by student.name;

image.gif 编辑

分组后,不对列进行调整,得到的结果就是每个分组的第一条记录,无意义。切记切记。

5:三个表进行笛卡尔+聚合

(1)三表笛卡尔

image.gif 编辑

(2)指定连接条件

A,B,C    找一个桥梁   比如B表:B中不仅含有跟A相关联的列,B也含有与C相关联的列,那么就让B作为一个桥梁来建立三者的联系。

即:表student  和  表score先笛卡尔     连接条件 student.id = score.student_id

上述结果,再和course表计算笛卡尔积 连接条件 score.course_id = course.id

select * from student , score , course where student.id = score.student_id and score.course _id = course.id;

结果如下表:显示行数大大减少

image.gif 编辑

(3)指定其它条件

此处无

(4)针对列进行精简

写法①:select student.name , course.name , score.score  from student , score , course where student.id = score.student_id and score.course _id = course.id;

写法②:select student.name , course.name ,score.score from student   join score on student.id = score.student_id and join course on score.course_id = course.id;

image.gif 编辑

三:内外连接

1:外连接

image.gif 编辑

两个表的数据是一一对应的,学生表的任何一个记录都能在分数表中体现出来,反之亦如此,此时内连接和外连接的结果是一样的(因为两个表的id可以一一对的上,如果此处不理解是什么意思往下看)

对这两个表进行修改:

image.gif 编辑 image.gif 编辑

(1)左外连接

select * from student left join score on student.id = score.studentId;

解释:左外连接就是以左表为主,保证左侧的表的每一个记录都显示在最终的结果中,如果这个记录在右表中没有匹配,那就把对应的列填充成NULL;

image.gif 编辑

image.gif 编辑

(2)右外连接:

select * from studnet right join score on student.id = score.studentId;

解释:与左外连接相反

image.gif 编辑

image.gif 编辑

(3)全外连接

MySQL不支持全外连接,甲骨文公司的oracle才可以,此处不做详细介绍

image.gif 编辑

2:内连接

写法①:select * from student , score where student.id = score.studnetId;

写法②:select * from student  (inner)  join score on student.id  = score.studentId;  

// inner  join 就是内连接额意思,此处的inner可以省略 image.gif 编辑 image.gif 编辑

(1)以下面两张表为例:内连接,得到的结果必然是两个表的交集

image.gif 编辑 image.gif 编辑

image.gif 编辑

image.gif 编辑

3:自连接

解释:表自己与自己进行笛卡尔积

作用:有时候想要进行查询,但条件是行与行之间,此时就可以通过自连接把行关系转化为列关系

利弊:在开发过程当中,如果某个地方一定要用到自连接才能解决问题,就要思考一下是否是表设计的不合理。

应用场景:显示  “课程3”  比  “课程1”   分数高的   同学 的 信息

(1):查表

select * from score;

image.gif 编辑

想要完成这个应用场景的实现(不同科目的比较),就需要比较行与行之间的大小(sql中无法做到),就只能把行转化为列了

(2):select * from score,score;

image.gif 编辑

查询的表名相同,我们要给这个表起不同的别名可以

(3):select * from score as s1 ,score as s2 where  s1.student_id = s2.student_id ;

image.gif 编辑

(4):再进一步去筛选

select * from score as s1 ,score as s2 where  s1.student_id = s2.student_id  and s1.course _id = 3 and s2.course_id = 1;

image.gif 编辑

(5):select * from score as s1 ,score as s2 where  s1.student_id = s2.student_id  and s1.course _id = 3 and s2.course_id = 1 and s1.score > s2.score;

image.gif 编辑

(6):如果还想知道同学的姓名,那就,在此基础上在笛卡尔积一个学生表

select student.name from score as s1 ,score as s2 ,  student where  s1.student_id = s2.student_id  and s1.course _id = 3 and s2.course_id = 1 and s1.score > s2.score;

(7):总结——在这个笛卡尔积的过程中,过程记录太冗杂了,用到了三个表,实际开发中不建议这么搞,容易搞挂数据库。

四:子查询

1:套娃结构

解释:把多个简单的sql,合并成一个复杂的sql,俄罗斯套娃,实际开发非常不建议这么去做,但是我们得看得懂

应用举例:查询与“不想毕业”同学的同班同学

(1)select * from student;

image.gif 编辑

(2)先找到“不想毕业”的 班级id,再拿着这个班级id来进行查询其它同学

select classes_id from student where name = '不想毕业';

(3)再找同学

select name from student where name = '不想毕业' and classes_id = (select classes_id from student where name = '不想毕业');

image.gif 编辑

有点像数学中的参数带入的感觉。

五:合并查询

1:关键字union

select 1 union select 2;

解释:要求两个select 查询的结果集,列数和类型要匹配,列名不影响,最终的列名就是第一个select 的列名

应用举例:查询id < 3 ,或者名字为“英文”的课程

select * from course where name = '英文' union select * from course where id < 3;

image.gif 编辑

注:

①:在这个场景中,我们可以发现用关键字or也可以解决,但是如果所查询的是两个不同的表就必须要用union这个关键字了

②:union 还可以对自动查询的结果进行去重,union all 不会去重。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路 | 基础篇】DML之操作数据表
【MySQL进阶之路 | 基础篇】DML之操作数据表
|
SQL 关系型数据库 MySQL
MySQL数据查询语言
MySQL数据查询语言
132 0
|
存储 SQL 安全
三、MySQL之数据查询语言(一)
三、MySQL之数据查询语言(一)
82 0
|
SQL Oracle 关系型数据库
四、MySQL之数据查询语言(二)
四、MySQL之数据查询语言(二)
83 0
|
存储 SQL Oracle
3.MySQL——数据查询语言的学习
3.MySQL——数据查询语言的学习
162 0
|
存储 SQL 关系型数据库
mysql中SQL查询优化方法总结
mysql中SQL查询优化方法总结
117 0
|
关系型数据库 MySQL 大数据
【大数据系列之MySQL】(十二):MySQL的条件查询语句
【大数据系列之MySQL】(十二):MySQL的条件查询语句
78 0
【大数据系列之MySQL】(十二):MySQL的条件查询语句
|
关系型数据库 MySQL 大数据
【大数据系列之MySQL】(二十三):MySQL中sql92语法连接操作
【大数据系列之MySQL】(二十三):MySQL中sql92语法连接操作
160 0
【大数据系列之MySQL】(二十三):MySQL中sql92语法连接操作
|
SQL Java 关系型数据库
MySQL进阶查询
MySQL进阶查询
158 0
MySQL进阶查询
|
关系型数据库 MySQL 大数据
【大数据系列之MySQL】(十四):MySQL中的排序查询语句
【大数据系列之MySQL】(十四):MySQL中的排序查询语句
166 0

热门文章

最新文章