課程目標(biāo):
子查詢概述子查詢的使用子查詢的類型:單行子查詢和多行子查詢子查詢注意的10個問題
1. 子查詢語法中的小括號 2. 子查詢的書寫風(fēng)格 3. 可以使用子查詢的位置:where,select,having,from 4. 不可以使用子查詢的位置:group by 5. 強(qiáng)調(diào) : from后面的子查詢 6. 主查詢和子查詢可以不是同一張表 7. 一般不在子查詢中,使用排序;但在Top-N分析問題中,必須對子查詢排序 8. 一般先執(zhí)行子查詢,再執(zhí)行主查詢;但相關(guān)子查詢例外 9. 單行子查詢只能使用單行操作符;多行子查詢只能使用多行操作符 10. 注意:子查詢中是null值問題
table th:first-of-type { width: 100px; }
| SELECT select_list FROM table WHER exper Operator (SELECT select_list FROM table);//這是子查詢 |
|---|
注意:子查詢語句必須有小括號
where語句: select * from emp where sal > (select sal from emp where ename = ‘SCOTT’ );
select語句: select empno,ename,sal,(select job from emp where empno=7839)第四列 from emp;
having語句: select deptno,avg(sal) from emp group by deptno having avg(sal) > (select max(sal) from emmp where deptno = 30);
from語句: select * from (select empno,ename,sal from emp)
示例:查詢員工信息:員工號,姓名,月薪,年薪
select * from (select tmpid, tname,gongzi,gongzi * 12 allgongzi from tmp);
select * from tmp where tmpid = (select userid from ttuser where name = ‘金培’ )
select t.* from tmp t inner join ttuser b on t.tmpid = b.userid where b.name = ‘金培’;
兩條語句返回的結(jié)果是一樣的,從理論上講多表查詢好于子查詢,不考慮實際情況下。因為子查詢有兩個‘from’要執(zhí)行兩次,而多表查詢只有一個。
示例:查詢員工表中員工工資最高的三位 select rownum,sal from (select * from tmp order by sal desc) where rownum <= 3
示例:找到員工表中薪水大于本部門平均薪水的員工 select empno,ename,sal,(select avg(sal) from emp where deptno = e.deptno) avgsal from emp e where sal > (select avg(sal) from emp where deptno = e.deptno); 此sql語句中把emp表當(dāng)做參數(shù)使用,給emp表起了個別名
| 操作符 | 含義 |
|---|---|
| = | Equal to |
| > | Greater than |
| “>=” | Greater than or equal to |
| < | Less than |
| <= | Less than or equal to |
| <> | Not equal to |
多行操作符
| 操作符 | 含義 |
|---|---|
| IN | 等于列表中的任何一個 |
| ANY | 和子查詢返回的任意一個值比較 |
| ALL | 和子查詢返回的所有值比較 |
單行子查詢示例-1 查詢員工信息,要求: 職位與3員工一致;薪水小于1員工的薪水
select tname, bumen, sal from tmp where bumen = (select bumen from tmp where tmpid = 2) and sal < (select sal from tmp where tmpid = 1)
單行子查詢示例-2 查詢工資最低的員工信息 select * from tmp where sal = (select min(sal) from tmp)
單行子查詢示例-3 查詢最低工資大于20號部門最低工資的部門號和部門的最低工資 select tmpid, min(sal) from tmp group by tmpid having min(sal) > (select min(sal) from tmp where tmpid = 1)
多行子查詢示例-1 查詢部門名稱是’研發(fā)部’和’科技部’的員工信息 select * from tmp where tmpid in (select tmpid from tmp where bumen = ‘研發(fā)部’ or bumen = ‘科技部’)
多行子查詢示例-2 示例:查詢工資比30號部門任意一個員工高的員工信息 select * from emp where sal > any(select sal from emp where deptno = 30);
select * from emp where sal > (select min(sal) from emp where deptno = 30);
多行子查詢示例-3 示例:查詢工資比30號部門所有員工高的員工信息 select * from emp where sal > all(select sal from emp where deptno = 30);
select * from emp where sal > all(select max(sal) from emp where deptno = 30);
示例:查詢不是老板的員工 select * from emp where rmpno not in (select mgr from emp where mgr is not null); //如果表中沒有空值的話,就可以使用
新聞熱點
疑難解答