子查询
create table department(
id int primary key,
name varchar(40)
);
create table employee(
id int primary key auto_increment,
name varchar(40),
age int(2),
dept_id int
);
INSERT INTO department values(1,'网络部');
INSERT INTO department values(2,'媒体部');
INSERT INTO department values(3,'研发部');
INSERT INTO department values(5,'人事部');
INSERT INTO employee values(null,'王红',20,1);
INSERT INTO employee values(null,'李强',22,1);
INSERT INTO employee values(null,'赵四',20,2);
INSERT INTO employee values(null,'郝娟',20,4);
1. 带IN关键字的子查询
使用IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列中的值将供外层查询语句进行比较操作
~ 查询存在年龄为20岁的员工的部门
select name from department where id in (select dept_id from employee where age=20);
~ 查询不存在年龄为20岁员工的部门
select name from department where id not in (slect dept_id from employee where age=20);
2. 带EXISTS关键字的子查询
EXISTS关键字后面的参数可以时任意一个子查询,这个子查询的作用相当于测试,它不产生任何数据,只返回TRUE或FALSE,当返回值为TRUE时,外层查询才会执行
~ 查询employee表中是否存在年龄大于21岁的员工,如果存在,则查询department表中的所有记录
select * from department where exists (select dept_id from employee where age>21);
3. 使用ANY关键字子查询
ANY关键字表示满足其中任意一个条件,它允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件
~ 使用带any关键字的子查询,查询满足条件的部门
select * from department where id>any(select dept_id from employee);
4. 带ALL关键字的子查询
ALL 关键字与ANY有点类似,只不过带ALL关键字的子查询返回的结果需要同时满足所有内层查询条件
~ 使用带all关键字的子查询,查询满足条件的部门
select * from department where id>all(select dept_id from employee);
5. 带比较运算符的子查询
~ 使用带比较运算符的子查询,查询赵四是那个部门的员工
select name from department where id=(select dept_id from employee where name='赵四');