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