国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Oracle數(shù)據(jù)庫 -- 子查詢篇

2019-11-08 20:56:07
字體:
供稿:網(wǎng)友

課程目標(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);//這是子查詢

注意:子查詢語句必須有小括號

子查詢的書寫風(fēng)格:

換行和縮進(jìn),不要都寫在一行

可以使用子查詢的位置:

可以使用子查詢的位置:where,select ,having,from在select語句后面的子查詢必須使用單行子查詢

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)

不可以使用子查詢的位置

group by 不能使用子查詢會報錯:ORA-22818:這里不允許出現(xiàn)子查詢表達(dá)式

from后面的子查詢

from后面的子查詢,很多問題是通過這樣的方式解決的

示例:查詢員工信息:員工號,姓名,月薪,年薪

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í)行兩次,而多表查詢只有一個。

子查詢的排序問題

一般子查詢中不使用排序,但在Top-N分析問題中,必須對子查詢排序Top-N問題就是,我們按照某個規(guī)律排序以后取出最前面的幾條記錄rownum 行號需要注意的兩個問題:永遠(yuǎn)是按照默認(rèn)的順序生成;只能使用<,<= 不能使用 >,>=

示例:查詢員工表中員工工資最高的三位 select rownum,sal from (select * from tmp order by sal desc) where rownum <= 3

先執(zhí)行子查詢

一般先執(zhí)行子查詢,再執(zhí)行主查詢;但相關(guān)子查詢例外相關(guān)子查詢可以把主查詢的值作為參數(shù)傳遞給子查詢

示例:找到員工表中薪水大于本部門平均薪水的員工 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);

子查詢中的空值問題

單行子查詢的空值問題多行子查詢中的null值問題如果表中有空值的話,不能用not in

示例:查詢不是老板的員工 select * from emp where rmpno not in (select mgr from emp where mgr is not null); //如果表中沒有空值的話,就可以使用


上一篇:SQL 約束

下一篇:Oracle的一些例子代碼

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 莆田市| 闽侯县| 柯坪县| 泰宁县| 七台河市| 化德县| 故城县| 西宁市| 泾阳县| 青岛市| 班戈县| 萝北县| 诸暨市| 砚山县| 无棣县| 许昌县| 平原县| 岳阳市| 吴川市| 尼玛县| 嘉善县| 永年县| 乐都县| 定南县| 水城县| 广饶县| 县级市| 巴里| 丰顺县| 类乌齐县| 马鞍山市| 那坡县| 象州县| 威海市| 赤壁市| 赣州市| 弥渡县| 明星| 灌南县| 乐昌市| 迁安市|