子查询 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='赵四');