说明
子查询就是一个 SQL 查询的结果作为另一个 SQL 查询语句语法的一部分
子查询结果分类
- 单行单列—— <、>、=、…
- 多行单列—— in、not in
- 多行多列—— 将查询结果作为一张表,使用as取别名后关联查询
测试数据准备
一个部门有多个员工,一个员工只能属于一个部门,关系由员工维护 ``` — 创建部门表 1 CREATE TABLE dept ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) );
INSERT INTO dept (NAME) VALUES (‘开发部’),(‘市场部’),(‘财务部’);
— 创建员工表 n CREATE TABLE emp ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), gender CHAR(1), — 性别 salary DOUBLE, — 工资 join_date DATE, — 入职日期 dept_id INT, foreign key(dept_id) references dept(id) );
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘孙悟空’,’男’,7200,’2013-02-24’,1); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘猪八戒’,’男’,3600,’2010-12-02’,2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘唐僧’,’男’,9000,’2008-08-08’,2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘白骨精’,’女’,5000,’2015-10-07’,3); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘蜘蛛精’,’女’,4500,’2011-03-14’,1);
emp表<br /><br />dept表<br />## 单行单列例子<br />查询工资最高的员工是谁?
select
- from emp where salary = ( select max(salary) from emp );
效果<br /><br />例子<br />查询工资小于平均工资的员工有哪些
select
- from emp where salary < ( select avg(salary) from emp );
效果<br />
## 多行单列
例子<br />查询工资大于5000的员工,来自于哪些部门的名字
select dept.name from dept where id in ( select dept_id from emp where salary > 5000 );
效果<br /><br />例子<br />查询开发部与财务部所有的员工信息
select
- from emp where dept_id in ( select id from dept where name in(‘开发部’, ‘财务部’) );
效果<br />
## 多行多列
例子<br />查询出2011年以后入职的员工信息,包括部门名称
select my_emp., dept.name from dept, ( select emp. from emp where join_date > ‘2011-01-01’ ) as my_emp where dept.id = my_emp.dept_id;
```
效果
