前言
今天我们来学习多表查询的下一个模块——子查询,子查询包括了标量子查询、列子查询、行子查询、表子查询,话不多说我们开始学习。
目录
一、子查询
1. 子查询的概念
SQL语句中嵌套使用select语句,称为嵌套查询,又称为子查询。
2. 子查询语法格式
select * from 表1 where column1=(select column1 from 表2);
子查询外部的语句可以是insert/update/delete/select的任何一个。
2.1 根据子查询结果不同可以分为:
标量子查询:子查询结果为单个值
列子查询:子查询结果为一列
行子查询:子查询结果为一行
表子查询:子查询结果为多行多列
2.2 根据子查询位置分为:
select id from dept where name='市场部';
where之后
from之后
select之后
2.3 标量子查询概念
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询成为标量子查询。常用的操作符:= 、<>(不等于)、 >、 >=、
2.4 标量子查询练习
2.4.1 查询 “市场部” 的所有员工的信息(使用的是上期的表结构)
a.查询"市场部"部门id
select id from dept where name='市场部';
b.根据市场部门id查询员工信息
select * from emp where dept_id=4;
a.b.合二为一
select * from emp where dept_id=(select id from dept where name='市场部');
2.4.2 查询杜甫入职之后的员工信息
a.查询杜甫的入职日期
select entrydate from emp where name='杜甫';
b.查询指定日期之后入职的员工信息
select * from emp where entrydate>'0120-01-01';
合二为一
select * from emp where entrydate>(select entrydate from emp where name='杜甫');
2.3 列子查询概念
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:IN 、NOTIN、ANY 、SOME 、ALL
2.4 列子查询练习
2.4.1 查询研发部和市场部所有员工的信息
a.查询研发部和市场部的部门ID
select id from dept where name='市场部'or name='研发部';
b.根据部门id查询员工信息
select * from emp where dept_idin(2,3);
合二为一
select *
from emp
where dept_id in (select id from dept where name = '市场部' or name = '研发部');
2.4.2 查询比市场部所有人工资都高的员工信息
a.查询所有市场部人员工资
select salary from emp where dept_id=(select id from dept where name='市场部');
b.查询比市场部所有员工工资都高的员工信息
select * from empwhere salary>all
(select salary from emp where dept_id=(select id from dept where name='市场部'));
2.4.3 查询比市场部其中一人工资高的员工信息
select * from emp where salary>any
(select salary from emp where dept_id=(select id from dept where name='市场部'));
2.5 行子查询概念
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:= 、<>、IN 、NOT IN
2.6 行子查询练习
查询与杜甫的薪资及直属领导相同的员工信息
2.6.1 行子查询
select *
from emp
where (salary, mangagerid) = (select salary, mangagerid from emp where name = '杜甫');
2.7 表子查询概念
子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符:IN
2.7.1 查询与李白杜甫置位相同和薪资相同的员工信息
select *
from emp
where (job, mangagerid) in (select salary, mangagerid
from emp
where name = '李白'
or name = '杜甫');
2.7.2 查询入职日期是’100-01-01’之后员工的日期信息,其部门信息
a.入职日期是’100-01-01’之后的信息
select * from emp where entrydate>'100-01-01';
b.查询这部分员工,对应的部门信息
select e.*,d.* from(select * from emp where entrydate>'100-01-01') e
left join dept on e.dept_id=d.id;
二、总结
多表查询学到这个时候就结束了,你学会了多表查询了吗?在下一期我们将对多表查询进行综合性的练习课程。希望你能够真正的学会多表查询。期待我们下期再见!