一、子查询
- 外面的查询被称为父查询,括号中的查询称为子查询。
- 子查询为父查询提供查询条件。
- 子查询返回多个值就不能用“=”,需要用“in”
01、语法:
1 | select 语句 where 条件(select...from 表) |
例子:
1 | select * from stuInfo where stuNo=(select stuNo from stuMarks where writenExam=80); # 子查询 select stuNo from stuMarks where writenExam=80 的结果 为父查询提供查询条件 |
1 | select stuNo from stuMarks order by writtenExam desc limit 1; # 查找笔试最高分的学生的学号 |
1 | select * from stuInfo where stuNo=(select stuNo from stuMarks order by writtenExam desc limit 1); # 查找笔试最高分的学生的学生信息 |
02、in | not in 子查询
- 用于子查询的返回结果多个值。
1 | select * from stuMarks where writenExam>=60; # 结果返回的值有四个 |
1 | select * from stuInfo where stuNo in (select * from stuMarks where writenExam>=60); # 没有及格的学生 |
1 | select * from stuInfo where stuNo not in (select * from stuMarks where writenExam<60); # 没有不及格的学生 |
1 | select * from stuInfo where stuNo not in (select * from stuMarks where writenExam>=60); # 没有通过的学生(不及格+缺考null) |
03、exists 和 not exists
- 存在/不存在
1 | select * from stuInfo where exists (select * from stuMarks where writenExam>=80); # 判断子查询的条件为真或假 |
1 | select * from stuInfo where not exists (select * from stuMarks where writenExam>=80); # 判断子查询的条件为真或假 |
04、子查询的分类
- 标量子查询
- 子查询返回的结果就一个
- 列子查询
- 子查询查询的结果是一个列表。 ——–子查询返回一个值
- 行子查询
- 子查询返回的结果是一行。 ——–子查询返回多个值
- 表子查询
- 子查询返回的结果当成一个表
- 子查询的结果当表来看待,需要将子查询的结果取别名。
表子查询 –注意⚠️:from后面是一个表,如果子查询的结果当成表 来看,必须将子查询的结果取别名。
例子:查询成绩最高的男生和女生
列子查询:
1 | # select stuName,ch from stu where ch in (select stuSex,max(ch) from stu group by stuSex); # 子查询返回一个值 |
行子查询:
1 | select stuSex,max(ch) from stu group by stuSex; # 返回的结果是一行,返回了两个值。 |
1 | select stuName,stuSex,ch from stu where (stuSex, ch) in (select stuSex,max(ch) from stu group by stuSex); # 进阶版--- 行子查询 |
表子查询:
1 | select * from (select * from stu order by ch desc) group by stuSex; |
1 | select stuName, stuSex, ch from (select * from stu order by ch desc) as t group by stuSex; |
二、union 合并查询
- 将多个select语句结果集 纵向合并起来
- 个数需要一样
1、语法
1 | select 语句 |
例子:
1 | select stuNo, stuName from stu |
1 | select * from t1,t2; # 横向组合 |
2、union的选项
- all : 显示所有数据,不去重
- distinct : 去除重复的数据【默认】
3、union的注意事项
- Union 两边的select 语句的字段个数必须一致
- Union 两边的select语句的字段名可以不一致,最终按第一个select语句的字段名。
- Union 两边的select语句中的数据类型可以不一致。
- 本文作者: 梁俊可
- 本文链接: http://ljk3d.com/2021/10/19/mySqlNote/07_MySQL_第六课_数据库查询03_子查询、union合并查询/
- 版权声明: 梁俊可工作室