子查询:
定义,就是指查询中嵌套查询。
子查询可以出现在很多位置,比如: 当列、当表、当条件等语法:
SELECT (子查询)FROM (子查询)WHERE (子查询)GROUP BY 子句HAVING (子查询)ORDER BY 子句注:子查询要用括号括起来。
如:
-- 找出与Ben同一个部门的员工--第一步:先找出Ben所在的部门select dept_id from s_emp where first_name = 'Ben';--第二步:找出该部门的所有员工select first_name from s_emp where dept_id = 数值--第三步:select first_name from s_emp where dept_id =(select dept_id from s_emp where first_name = 'Ben') and first_name != 'Ben';
子查询分类
1. 无关子查询 是指子查询中没有使用外部查询所定义的变量/别名。2. 相关子查询
是指子查询中要使用外部查询所定义的变量/别名。
rownum
它总是从1开始,依次递增,绝不会产生GAP【间隔】如:
select d.*,rownum from s_dept d where rownum = 1;select d.*,rownum from s_dept d where rownum = 5;select d.*,rownum from s_dept d where rownum > 5;select d.*,rownum from s_dept d where rownum < 5;-- rownum 的作用
2. 分页查询问题
-- 查询出员工表中第2页[第7行至第12行]数据。//错误select * from s_emp where rownum between 7 and 12;select * from s_emp where rownum >=7 and rownum<= 12;//正确:方法一select * from ( --中间层,负责把上限行给取出来 select v1_.*,rownum rw_ from ( -- 业务的核心语句 select id,first_name,salary from s_emp ) v1_ where rownum <= 12 ) v2_where v2_.rw_ >= 7;方法二:
select * from (select * from s_emp where rownum <=12) where id not in (select id from s_emp where rownum <7);
有关 exists 与 not exists 运算符
exists用来判断子查询是否有结果,如果有,则返回TRUE,否则,返回FALSE
关于子查询的集合操作
UNION 返回两个子查询的并集,不含重复记录UNION ALL 返回两个子查询的并集,包含复复记录如:
select id,first_name from s_emp where salary > 1200unionselect id,first_name from s_emp where salary between 850 and 1400;INTERSECT 返回交集
MINUS 两个子查询相减