1.子查询
1.1.了解
子查询: 将一条sql查询语句作为中间结果,供另外一条查询语句使用, 这个中间结果查询就是子查询.
sql嵌套.
作用:
原本需要执行多条sql完成的事情,如果通过子查询只需要执行一条sql, 这样可以简化执行步骤.(代码中的步骤).
案例: 查询学生信息,要求学生年龄小于全部学生的平均年龄.
a.查询全部学生平均年龄
SELECT avg(age) FROM `学生表` ;
b. 查询大于平均年龄的学生
SELECT * FROM `学生表` where age<19.8182);
c. 通过子查询实现
SELECT * FROM `学生表` where age<(SELECT avg(age) FROM `学生表`);
1.2子查询分类
- 按位置分:
- where 型子查询: 子查询出现在where子句中
SELECT * FROM `学生表` where age<(SELECT avg(age) FROM `学生表`);
- from 型子查询: 子查询出现在from子句中
注意实现:
如果子查询出现在from子句中, 相当于一个临时表(派生表), 需要取一个别名;
案例: 查询学生表中的年龄排前5的学生, 要求结果是按照年龄升序排列.
a 查询学生表中的年龄排前5的学生
SELECT *FROM`学生表` ORDER BY age DESC limit 0,5
b 结果是按照年龄升序排列
SELECT * FROM (SELECT *FROM`学生表` ORDER BY age DESC limit 0,5 ) as t ORDER BY age ;
- 按结果分:
- 列子查询: 子查询结果为一列多行
说明: 列子查询其实返回的是一个集合,判断使用 in 或者 not in
案例: 查询没有学生的 班级信息
SELECT * FROM `班级表` WHERE class_id not in (SELECT DISTINCT class_id FROM `学生表` WHERE class_id is NOT NULL
);
逆向思维:先查询有学生的 班级信息
a. 查询学生表中的班级id(有班级id就说明有学生)
SELECT DISTINCT class_id FROM `学生表` WHERE class_id is NOT NULL;
b. 根据查询到的班级id到班级表中查询班级信息
SELECT * FROM `班级表` WHERE class_id in (SELECT DISTINCT class_id FROM `学生表` WHERE class_id is NOT NULL
);
- 行子查询: 子查询结果为一行多列
说明:需要使用 小括号() 行构建符, 将多个字段的值构建成一行, 与行子查询的结果做对比.
案例: 请问学生中是否有班级id最大且年龄也最大的学生?
a. 查询班级id最大的值和年龄最大的值
select max(class_id),max(age) from `学生表`;
b. 根据以上结果再查询学生信息
select * from `学生表`WHERE age=25 and class_id=1117;
c. 子查询形式实现
select * from `学生表`WHERE (class_id,age)=(select max(class_id),max(age) from `学生表`);
- 表子查询: 子查询结果为多行多列
案例: 查询每个班中年龄最大的学生的信息.
a. 分组查询每个班中年龄最大的值
select class_id,max(age) as max from `学生表` where class_id is not null group by class_id;
b. 根据以上结果 再查询学生的信息
select * from `学生表`
where (class_id,age) in (select class_id,max(age) as max
from `学生表` where class_id is not null group by class_id)
2.union 联合查询
2.1了解
将多个查询结果集合到一起
2.2语法
select 查询语句
union
select 查询语句
union
select 查询语句
union
select 查询语句
2.3案列
例子: 查询学生信息和班级信息,集合到一起
SELECT class_id,name,age from `学生表`
UNION
SELECT * FROM `班级表`;
注意:
- 联合查询要求列的数量要一致
- 列名以第一个查询结果为准
例子: 查询男同学,要求年龄降序排列, 女同学要求年龄升序排列, 集合一个结果
(select * from `学生表` where sex="男" order by age desc limit 100)
union
(select * from `学生表` where sex="女" order by age asc limit 100);
注意:
如果查询中有排序
- 需要将每个查询使用()扩起来
- 必须在每个查找中结合limit语句使用

版权声明:本文为weixin_46054870原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。