-
這期視頻的意思就是,我們先不要打亂行號(hào)rownum的順序,所以只能分兩次查詢,括號(hào)里的查詢是第一次,他把薪水按照降序排列,因?yàn)闆]有查詢行號(hào),所以行號(hào)這個(gè)偽列不用考慮進(jìn)去,那么第二次查詢才給括號(hào)里查到的數(shù)據(jù)(當(dāng)成一個(gè)新的表)加上行號(hào),就可以實(shí)現(xiàn)目的了查看全部
-
單行子查詢與多行子查詢: 只返回一條記錄就叫做單行子查詢,返回多條記錄就叫做多行子查詢。 單行子查詢只能使用單行操作符,多行子查詢只能使用多行操作符。 單行操作符:=,>,>=,<,<=,<> 多行操作符:IN,ANY,ALL IN等于列表中的任何一個(gè) ANY和子查詢返回的任意一個(gè)值比較 ALL和子查詢返回的所有值比較查看全部
-
自己寫的代碼: select * from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d where e.sal>d.avgsal and e.deptno=d.deptno 老師的代碼: 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);查看全部
-
行號(hào)只能使用<,<= ;不能使用>,>= 將會(huì)在分頁查詢中用到 所謂的TOP-N問題就是在在一個(gè)記錄集中只截取前幾條記錄作為我們的查詢結(jié)果,比如找到員工表中工資最高的前三名,這種問題就先要對(duì)子查詢進(jìn)行排序,排完序可以在父查詢中使用rownum行號(hào)選擇滿足條件的前幾項(xiàng),注意rownum只能使用<,<= ,不能使用 >,>=。查看全部
-
select rownum,empno,ename,sal from (select * from emp order by sal desc) where rownum<=3;查看全部
-
一般不在子查詢中使用排序,但在TOP-N問題中必須對(duì)子查詢排序。 rownum 行號(hào),偽列 找到員工表中工資最高的前三名 例:select rownum,empno,ename,sal from emp where rownum<=3 order by sal desc; 這樣的執(zhí)行結(jié)果不正確,問題在于: (1)行號(hào)永遠(yuǎn)按照默認(rèn)的順序生成 (2)行號(hào)只能使用<,<= ;不能使用>,>=查看全部
-
select * from emp where deptno=(select deptno from dept where dname='SALES'); 使用多表查詢: select e.* from emp e,dept d where e.deptno=d.deptno and d.dname='SALES' ; 理論上應(yīng)該盡量使用多表查詢,因?yàn)樯厦娴淖硬樵冇袃蓚€(gè)from語句,所以要對(duì)數(shù)據(jù)庫訪問查詢兩次,而下面的多表查詢只訪問了一次!這是理論上的結(jié)論,并沒有考慮實(shí)際比如多表查詢中產(chǎn)生的笛卡爾積的大小,具體情況還是要具體對(duì)待。查看全部
-
示例一: select * from (select empno,ename,sal from emp); 示例二: select * from (select empno,ename,sal,12*sal 年薪 from emp);查看全部
-
group by 后面不能使用子查詢 例:select avg(sal) from emp group by (select deptno from emp); 執(zhí)行時(shí)系統(tǒng)提示錯(cuò)誤 第3行錯(cuò)誤: ORA-22818:這里不允許出現(xiàn)子查詢表達(dá)式查看全部
-
(1)select后面的子查詢必須是一個(gè)單行子查詢,即子查詢結(jié)果只返回一條記錄 例:select empno,ename,sal,(select job from emp where empno=7839) from emp; 注意子查詢要有小括號(hào)! (2)having后面的子查詢 select deptno,avg(sal) from emp group by deptno having avg(sal)> (select max(sal) from emp where deptno=30); 注意這種情況不能用where代替,因?yàn)楹薪M函數(shù)! (3)from后面的子查詢實(shí)際上就是將子查詢的結(jié)果看作一張表。 例: select * from (select empno,ename,sal from emp);查看全部
-
子查詢注意的問題: 可以使用子查詢的位置:where select having from; 不可以使用子查詢的位置:group by; 強(qiáng)調(diào):from后面的子查詢; 主查詢和子查詢可以使用的不是同一張表; 一般不在子查詢中使用排序,但在TOP-N分析問題中必須對(duì)子查詢排序; 一般先執(zhí)行子查詢再執(zhí)行子查詢,但相關(guān)子查詢例外; 單行子查詢只能使用單行操作符,多行子查詢只能使用多行操作符; 注意:子查詢中是null值問題查看全部
-
自連接存在的問題: (1)自連接不適合操作大表,也就是記錄多的表,原因是自連接至少有兩張表參與,并進(jìn)行笛卡爾全集,連接之后的記錄數(shù)就是單張表記錄數(shù)的平方(笛卡爾積行數(shù)是兩張表行數(shù)的乘積),如果有三張表記錄數(shù)就是原來的三次方,如果原來的表包含的記錄數(shù)過多,連接之后的結(jié)果就會(huì)很大,所以自連接不適合操作大表。解決辦法:層次查詢。注意層次查詢是單表查詢,不存在第二張表!因?yàn)橹挥性谝粡埍淼那闆r下才不會(huì)產(chǎn)生笛卡爾積,才能解決這個(gè)問題。 層次查詢在某些情況下可以替代自連接,本質(zhì)上是單表查詢。 例: select empno,ename,sal,mgr from emp //層次查詢只涉及一張表 connect by prior empno=mgr //層次查詢的條件不用where表示,而用connect by表示,上一層的員工號(hào)=當(dāng)前曾的老板號(hào) start with mgr is null或者start with empno=7839; //stsrt with表示從何處開始遍歷查詢,只有從根節(jié)點(diǎn)開始時(shí)才可以使用 * is null 的格式,其余節(jié)點(diǎn)都只能使用第二種格式。 此外層次查詢的樹的深度用level表示,可以在select語句中加入level就可以得到深度的查詢結(jié)果,還可以對(duì)查詢結(jié)果進(jìn)行排序如order by 1; 比較自連接和層次查詢的優(yōu)劣: 自連接得到的查詢結(jié)果比較直觀但是不適合操作大表; 層次查詢只涉及一張表,不產(chǎn)生笛卡爾積,但是得到的結(jié)果不夠直觀。 所以不同的查詢語句有不同的特點(diǎn),不是萬能的!查看全部
-
自連接:通過別名,將一張表視為多張表。查看全部
-
select d.deptno,d.dname,count(e.empno) from emp e,dept d where e.deptno=d.deptno group by d.deptno,d.name; 注意這樣得出的結(jié)果不完全正確,因?yàn)?0號(hào)部門在員工表中不存在但是在部門表中存在,為了在結(jié)果中顯示40號(hào)部門,要使用外連接!外連接的作用就是把對(duì)于連接條件不成立的記錄仍然包含在最后的結(jié)果中,分為左外連接和右外連接。 特別注意左外連接和右外連接的寫法,位置與名字相反,符號(hào)用括號(hào)內(nèi)加號(hào)表示: 左外連接where e.deptno=d.deptno(+); 右外連接where e.deptno(+)=d.deptno;查看全部
-
笛卡爾積: 笛卡爾積的列數(shù)等于各表列數(shù)相加,行數(shù)等于各表行數(shù)相乘。 為了避免笛卡爾全集,可以在where加入有效的連接條件,原因是笛卡爾全集中的記錄有可能存在錯(cuò)誤。 在實(shí)際運(yùn)行環(huán)境中,應(yīng)盡量避免使用笛卡爾全集。 where后的連接條件至少有n-1個(gè),n為表的個(gè)數(shù)。查看全部
舉報(bào)
0/150
提交
取消