-
自連接:通過別名,將同一張表視為多張表
實例:查詢員工姓名和員工的老板姓名【使用員工表】
查看全部 -
外連接:把對于連接條條件不成立的記錄,仍然包含在最后的結果中;
左外連接:當連接條件不成立的時候,等號左表的表仍然被包含;?where e.deptno=d.deptno(+)??[寫法與叫法相反]
右外連接:當連接條件不成立的時候,等號右邊的表仍然被包含; where e.deptno(+)=d.deptno?
查看全部 -
笛卡爾集:行數:表行數相乘;列:列數相加;【笛卡爾集:數據不一定都是正確的】
在實際運行環境下,應避免使用笛卡爾全集
查看全部 -
需要在,from 后面 是員工表和部門表在where等值連接=
SQL
查看全部 -
層次查詢:自連接的優化查詢。
level:樹的深度,層次。類似序列號。
connect by pripro? 上一層的員工號等于這層的老板號。
from emp connect by pripro empno=mgr?
start with mgr is 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;
比較自連接和層次查詢的優劣:
自連接得到的查詢結果比較直觀但是不適合操作大表;
層次查詢只涉及一張表,不產生笛卡爾積,但是得到的結果不夠直觀。
所以不同的查詢語句有不同的特點,不是萬能的!查看全部 -
Group by
·在SELECT 列表中所有未包含在組函數中的列都應該包含在GROUP BY 子句中
·包含在GROUP BY 子句中的列不必包含在SELECT 列表中
select a,b,c,組函數(x) from table group by a,b,c;
select avg(sal) from emp group by deptno;
select deptno,job,sum(sal) from emp group by deptno,job;查看全部 -
一、分組函數
AVG:平均值。
SUM:求和。
MIN:最小數。
MAX:最大值。
COUNT:計算個數。
WM_CONCAT:行轉列。
查看全部 -
null會導致計算錯誤,需要使用nvl函數轉為非空值
select count(nvl(comm,0)) from emp;
注意:sum(comm)/count(*):統計的是所有人的平均值(含該項為null的人員)
sum(comm)/count(comm)&avg(comm)是統計comm非空的人員平均數
查看全部 -
select?deptno?部門號,wm_concat(ename)?部門中員工的名字--wm_concat行列轉置? from?emp?group?by?deptno;
查看全部 -
group by rollup(a,b)
????相當于
????????group by a,b??
????????+
????????group by a?
????????+
????????group by null?
例:
????select deptno,job,sum(sal) from emp group by rollup(deptno,job);
????????先按照不同部門不同職位查出薪資總和顯示(deptno,job,sum(sal))
????????再按照不同部門查出薪資總和顯示(deptno,sum(sal))
????????再查出薪資總和顯示(sum(sal))
????修改報表格式(只在sqlplus中有效):
break on deptno skip 2
相同的部門號(deptno)只顯示一次,不同的部門號跳過兩行。
set pagsize 30
讓每頁顯示30條記錄。查看全部 -
order by子句
示例:求每個部門的平均工資,要求顯示:部門號,部門的平均工資,并按照工資升序排列
可以按照:列、別名、表達式、序號進行排序
select deptno,avg(sal) from emp group by deptno order by avg(sal);
select deptno,avg(sal) 平均工資 from emp group by deptno order by 平均工資;
select deptno,avg(sal) 平均工資 from emp group by deptno order by 2;
sqlplus的另一個小技能:?? a命令:-append;a命令表示在上一條命令后面追加語句,a命令后必須跟兩個或兩個以上的空格,若只打一個空格則追加語句緊跟上一條語句最后一個單詞拼接
/表示執行
查看全部 -
Group by
·在SELECT 列表中所有未包含在組函數中的列都應該包含在GROUP BY 子句中
·包含在GROUP BY 子句中的列不必包含在SELECT 列表中
select a,b,c,組函數(x) from table group by a,b,c;
select avg(sal) from emp group by deptno;
select deptno,job,sum(sal) from emp group by deptno,job;查看全部 -
分組函數會自動過濾空值
例子:平均工資
select sum(sal)/count(*) , sum(sal)/count(sal)? ,?? avg(sal)? from emp ;?- count(*) 會包含空值的個數
- 分組函數會自動過濾掉空值
- nvl函數? 使得分組函數不忽略空值
- nvl(comm,0)?? 這個函數的意思是 當該字段為空的時候返回第二個參數,當字段不為空 返回他本身
- 這個函數可用于自增的輸入nvl(max(sno),0))+1? 最大值加一?? 可用于插入數據的編號
查看全部 -
Having
查看全部 -
testtetetete
查看全部
舉報