联合查询和子查询

时间:2021-05-05 00:24:52

联合查询
联合查询:将多次查询(多条select 语句),在记录上进行拼接(字段不会增加)

基本语法
多条select语句构成:每一条select语句获取的字段数必须严格一致(但是字段类型无关)
select 语句1
Union [union 选项]
select 语句2
Union 选项:与select 选项一样有两个
All:保留所有(不管重复)
Distinct:去重(整个重复):默认的

联合查询和子查询

联合查询只要求字段一样,跟数据类型 无关

联合查询和子查询

联合查询意义
联合查询的意义分为两种:
1.查询同一张表,但是需求不同:如查询学生信息,男生身高升序,女生身高降序。
2.多表查询:多张表的结构是完全一样的,保存的数据(结构)也是一样的。

order by 使用
在联合查询中:order by 不能直接使用,需要对查询语句使用括号才行

联合查询和子查询

若要order by 生效:必须搭配limit:limit使用限定的最大数即可

 联合查询和子查询

子查询

子查询:sub query,查询是在某个查询结果之上进行的(一条select 语句内部包含了另外一条select语句)

子查询分类
子查询有两种分类方式:按位置分类;按结果分类
按位置分类:子查询(select 语句) 在外部查询(select语句)中出现的位置
from 子查询:子查询跟在from之后
where子查询:子查询出现where条件中
exists子查询:子查询出现在exists里面

按结果分类:根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)
标量子查询:子查询得到的结果是一行一列
列子查询:子查询得到的结果是一列多行
行子查询:子查询得到的结果是多列一行(多行多列)
上面几个出现的位置都是在where之后
表子查询:子查询得到的结果是多行多列(出现的位置是在from之后)

标量子查询
需求:知道班级名字为PHP0710,想获取该班的所有学生

1.确定数据源:获取所有的学生
select * from my_student where c_id=?;
2.获取班级ID:可以通过班级名字确定
select id from my_class where name='PHP0810'; -- id一定只有一个值(一行一列)
标量子查询实现

联合查询和子查询


列子查询
需求:查询所有在读班级的学生(班级中存在的班级)
1. 确定数据源:学生
select * from my_student where c_id in(?);
2.确定有效班级的 ID:所有班级id
select id from my_class;

列子查询实现

联合查询和子查询

列子查询返回的结果会比较:一列多行,需要使用in 作为条件匹配:其实在mysql中还有几个类似的条件:all ,some ,any

联合查询和子查询

行子查询
行子查询:返回的结果可以是多行多列(一行多列)
需求:要求查询整个学生中,年龄最大且身高是最高的学生
1.确定数据源
select * from my_student where age=? and height =?;
2.确定最大的年龄和最高的身高
select max(age),max(height) from my_student;

行子查询:需要构造行元素,

联合查询和子查询

表子查询

表子查询:子查询返回的结果是多行多列的二维表:子查询返回的结果是当做二维表来使用
需求:找出每个班最高的一个学生
1.确定数据源,先将学生按照身高进行降序排序
selelct * from my_student order by height desc;
2.从每个班选出第一个学生
selelct * from my_student group by c_id; -- 每个班选出第一个学生
表子查询:from子查询:得到的结果作为from的数据源

联合查询和子查询

Exists 子查询
Exists: 是否存在的意思,exists子查询就是用来判断某些条件是否满足(跨表),exists是接在where之后 exists返回的结果只有0和1
需求:查询所有的学生:前提条件是班级存在
1.确定数据源
select * from my_student where ?;
2.确定条件是否满足
Exists(select * from my_class); -- 是否成立
exists子查询

联合查询和子查询