子查询
SELECT select__list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
**特点:
- 子查询可以独立执行
- 子查询先于主查询执行,并于主查询互不影响
- 使用时要用括号括起来
- 可用于where、having、from子句中**
单行子查询所用到的运算符
单行运算符:之前学到的运算符
多行子查询
概念:子查询返回多行记录。
多行子查询所用到的运算符
in:在集合中的任意一个(和=一起使用)。
例如:
查询是经理的员工姓名,工资。
select ename,sal
from emp
where empno in (select mgr from emp);
any:在集合中的任意一个(和 > < 一起使用,>any:大于集合最小值;<any小于集合最大值)。
例如:
查询部门编号不为10,且工资比10部门任意一名员工工资 高的员工编号,姓名,职位,工资。
select empno,ename,job,sal
from emp
where sal>any(select sal from emp where deptno=10)
and deptno<>10;
all:在集合中的每一个( > < 中集合中每一个数值,=无意义)
例如:
查询部门编号不为10,且工资比10部门所有员工工资高的 员工编号,姓名,职位,工资。
select empno,ename,job,sal
from emp
where sal>all (select sal from emp where deptno=10)
and deptno<>10;
空值问题
select ename
from emp
where empno not in (select mgr from emp)
本来应该出现几条记录,结果却一条都没显示。原因是子查询中有一条含有空值,和空比较的结果都是空值,所以此时不能用NOT IN运算符。
rownum
–ROWNUM是一个伪列,伪列是使用上类似于表中的列,而实际并没有存储在表中的特殊列;
–-ROWNUM的功能是在每次查询时,返回结果集的顺序号, 这个顺序号是在记录输出时才一步一步产生的,第一行显示为1,第二行为2,以此类推。
rownum运算只能使用<=或<(当然当<=或<存在时也可使用>和>=)。
Top-n查询
概念:Top-N查询主要是实现表中按照某个列排序,输出最大或 最小的N条记录功能。
select 【列名】,rownum
from (select[列名]
from 表名
order by top-n操作的列)
where rownum<=n;
分页查询
SELECT b.*
FROM (SELECT ROWNUM rn,[列名1,列名2,....列名n]
FROM 表名1,[表名2,...表名n]
WHERE [条件表达式 AND ] ROWNUM <=目标页数*每页记录数) b
WHERE rn > (目标页数-1)*每页记录数
或
SELECT b.*
FROM (SELECT ROWNUM rn,[列名1,列名2,....列名n]
FROM 表名1,[表名2,...表名n]
[WHERE 条件表达式]) b
WHERE rn <=目标页数*每页记录数 and rn > (目标页数-1)*每页记录数
思考:哪种方式效率高?
答案是:第一种
因为根据sql语句执行顺序,在子查询中,第一种方法执行from语句中时已经筛选了表的哪一页的记录,查的记录不用像第二种那么多。