SQL子查询

1. 包含在select子句中的子查询:

SQL> select dname,(select max(sal) from emp where deptno=dept.deptno) max_sal
2 from dept
3 /

DNAME MAX_SAL
-------------- ----------
ACCOUNTING 5000
RESEARCH 3000
SALES 2850
OPERATIONS

可以在显示每行指定列的同时,显示分组函数。


与下面查询有类似效果,但下面查询是显示的deptno列:

SQL> select deptno,max(sal) from emp
2 group by deptno
3 /

DEPTNO MAX(SAL)
---------- ----------
30 2850
20 3000
10 5000

与下面示例也有类似的效果,但这里的第一列只显示了三行:

SQL> select d.dname, max(e.sal)
2 from emp e, dept d
3 where e.deptno=d.deptno
4 group by dname
5 /

DNAME MAX(E.SAL)
-------------- ----------
ACCOUNTING 5000
RESEARCH 3000
SALES 2850

下面示例可以代替emp与dept两个表的连接查询:

SQL> select ename,(select dname from dept where deptno=emp.deptno) dname
2 from emp
3 /

ENAME DNAME
---------- --------------
SMITH RESEARCH
ALLEN SALES
WARD SALES
JONES RESEARCH

下面是与上面查询相同效果的表的连接查询:

SQL> select e.ename,d.dname
2 from emp e, dept d
3 where e.deptno=d.deptno
4 /

ENAME DNAME
---------- --------------
SMITH RESEARCH
ALLEN SALES
WARD SALES
JONES RESEARCH

下面select语句中的子查询更能体现其作用:

SQL> select ename, sal, (select avg(sal) from emp) avgsal
2 from emp
3 /

SQL> select ename, sal,
2 (select avg(sal) from emp where emp.deptno=emp1.deptno) avgsal
3 from emp emp1
4 /

2. 包含在where子句中的子查询:

SQL> select dname
2 from dept
3 where deptno=(select deptno from emp)
4 /
where deptno=(select deptno from emp)
*
ERROR at line 3:
ORA-01427: single-row subquery returns more than one ro

当where条件中使用=、 、 !=、 >=、 <=时,要保证子查询返回的结果唯一,否则可以使用in,或者使用any、some、all等前缀处理:

SQL> select dname
2 from dept
3 where deptno in (select deptno from emp)
4 /

DNAME
--------------
RESEARCH
SALES
ACCOUNTING

SQL> select ename
2 from emp
3 where sal>all(select sal from emp where deptno=30)
4 /

ENAME
----------
JONES
SCOTT
KING
FORD

SQL> select dname
2 from dept
3 where deptno in
4 (
5 select deptno from emp
6 group by deptno
7 having count(empno)>3
8 )
9 /

DNAME
--------------
SALES
RESEARCH

3. 包含在from子句中的子查询:

统计emp表中,每年入职的员工人数:

SQL> select to_char(hiredate,'yyyy') hireYear,count(empno)
2 from emp
3 group by hireYear
4 /
group by hireYear
*
ERROR at line 3:
ORA-00904: "HIREYEAR": invalid identifier

因为from子句最先处理,然后是group by子句,最后是select子句,所以上述group by子句中使用的列别名还不可见,从而出现错误,我们可以改为在from子句中使用子查询解决:

SQL> select hireYear,count(empno)
2 from (select to_char(hiredate,'yyyy') hireYear, empno from emp)
3 group by hireYear
4 /

HIRE COUNT(EMPNO)
---- ------------
1987 2
1980 1
1982 1
1981 10

也可以使用表别名,使得语法更通顺:

SQL> select hireYear,count(empno)
2 from (select to_char(hiredate,'yyyy') hireYear, empno from emp) d
3 group by hireYear
4 /

HIRE COUNT(EMPNO)
---- ------------
1987 2
1980 1
1982 1
1981 10

另外子查询也可以嵌套命名:

SQL> select hireYear,count(empno)
2 from
3 (select to_char(hiredate,'yyyy') hireYear,empno
4 from (select * from emp) d1
5 ) d2
6 group by hireYear
7 /

HIRE COUNT(EMPNO)
---- ------------
1987 2
1980 1
1982 1
1981 10

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/37724/viewspace-152592/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/37724/viewspace-152592/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值