子查询

子查询

SELECT select__list  
FROM table  
WHERE expr operator  
(SELECT select_list  
FROM table);  

**特点:

  1. 子查询可以独立执行
  2. 子查询先于主查询执行,并于主查询互不影响
  3. 使用时要用括号括起来
  4. 可用于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语句中时已经筛选了表的哪一页的记录,查的记录不用像第二种那么多。