-
自連接:通過(guò)別名,將同一張表視為多張表
實(shí)例:查詢員工姓名和員工的老板姓名【使用員工表】

查看全部 -
外連接:把對(duì)于連接條條件不成立的記錄,仍然包含在最后的結(jié)果中;
左外連接:當(dāng)連接條件不成立的時(shí)候,等號(hào)左表的表仍然被包含;?where e.deptno=d.deptno(+)??[寫(xiě)法與叫法相反]
右外連接:當(dāng)連接條件不成立的時(shí)候,等號(hào)右邊的表仍然被包含; where e.deptno(+)=d.deptno?
查看全部 -
笛卡爾集:行數(shù):表行數(shù)相乘;列:列數(shù)相加;【笛卡爾集:數(shù)據(jù)不一定都是正確的】
在實(shí)際運(yùn)行環(huán)境下,應(yīng)避免使用笛卡爾全集
查看全部 -

需要在,from 后面 是員工表和部門(mén)表在where等值連接=
SQL
查看全部 -
層次查詢:自連接的優(yōu)化查詢。
level:樹(shù)的深度,層次。類似序列號(hào)。
connect by pripro? 上一層的員工號(hào)等于這層的老板號(hào)。
from emp connect by pripro empno=mgr?
start with mgr is null;
自連接存在的問(wèn)題:
(1)自連接不適合操作大表,也就是記錄多的表,原因是自連接至少有兩張表參與,并進(jìn)行笛卡爾全集,連接之后的記錄數(shù)就是單張表記錄數(shù)的平方(笛卡爾積行數(shù)是兩張表行數(shù)的乘積),如果有三張表記錄數(shù)就是原來(lái)的三次方,如果原來(lái)的表包含的記錄數(shù)過(guò)多,連接之后的結(jié)果就會(huì)很大,所以自連接不適合操作大表。解決辦法:層次查詢。注意層次查詢是單表查詢,不存在第二張表!因?yàn)橹挥性谝粡埍淼那闆r下才不會(huì)產(chǎn)生笛卡爾積,才能解決這個(gè)問(wèn)題。
層次查詢?cè)谀承┣闆r下可以替代自連接,本質(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表示從何處開(kāi)始遍歷查詢,只有從根節(jié)點(diǎn)開(kāi)始時(shí)才可以使用 * is null 的格式,其余節(jié)點(diǎn)都只能使用第二種格式。
此外層次查詢的樹(shù)的深度用level表示,可以在select語(yǔ)句中加入level就可以得到深度的查詢結(jié)果,還可以對(duì)查詢結(jié)果進(jìn)行排序如order by 1;
比較自連接和層次查詢的優(yōu)劣:
自連接得到的查詢結(jié)果比較直觀但是不適合操作大表;
層次查詢只涉及一張表,不產(chǎn)生笛卡爾積,但是得到的結(jié)果不夠直觀。
所以不同的查詢語(yǔ)句有不同的特點(diǎn),不是萬(wàn)能的!查看全部 -
Group by
·在SELECT 列表中所有未包含在組函數(shù)中的列都應(yīng)該包含在GROUP BY 子句中
·包含在GROUP BY 子句中的列不必包含在SELECT 列表中
select a,b,c,組函數(shù)(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;查看全部 -
一、分組函數(shù)
AVG:平均值。
SUM:求和。
MIN:最小數(shù)。
MAX:最大值。
COUNT:計(jì)算個(gè)數(shù)。
WM_CONCAT:行轉(zhuǎn)列。
查看全部 -
null會(huì)導(dǎo)致計(jì)算錯(cuò)誤,需要使用nvl函數(shù)轉(zhuǎn)為非空值
select count(nvl(comm,0)) from emp;
注意:sum(comm)/count(*):統(tǒng)計(jì)的是所有人的平均值(含該項(xiàng)為null的人員)
sum(comm)/count(comm)&avg(comm)是統(tǒng)計(jì)comm非空的人員平均數(shù)
查看全部 -
select?deptno?部門(mén)號(hào),wm_concat(ename)?部門(mén)中員工的名字--wm_concat行列轉(zhuǎn)置? from?emp?group?by?deptno;
查看全部 -
group by rollup(a,b)
????相當(dāng)于
????????group by a,b??
????????+
????????group by a?
????????+
????????group by null?
例:
????select deptno,job,sum(sal) from emp group by rollup(deptno,job);
????????先按照不同部門(mén)不同職位查出薪資總和顯示(deptno,job,sum(sal))
????????再按照不同部門(mén)查出薪資總和顯示(deptno,sum(sal))
????????再查出薪資總和顯示(sum(sal))
????修改報(bào)表格式(只在sqlplus中有效):
break on deptno skip 2
相同的部門(mén)號(hào)(deptno)只顯示一次,不同的部門(mén)號(hào)跳過(guò)兩行。
set pagsize 30
讓每頁(yè)顯示30條記錄。查看全部 -
order by子句
示例:求每個(gè)部門(mén)的平均工資,要求顯示:部門(mén)號(hào),部門(mén)的平均工資,并按照工資升序排列
可以按照:列、別名、表達(dá)式、序號(hào)進(jìn)行排序
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的另一個(gè)小技能:?? a命令:-append;a命令表示在上一條命令后面追加語(yǔ)句,a命令后必須跟兩個(gè)或兩個(gè)以上的空格,若只打一個(gè)空格則追加語(yǔ)句緊跟上一條語(yǔ)句最后一個(gè)單詞拼接
/表示執(zhí)行
查看全部 -
Group by
·在SELECT 列表中所有未包含在組函數(shù)中的列都應(yīng)該包含在GROUP BY 子句中
·包含在GROUP BY 子句中的列不必包含在SELECT 列表中
select a,b,c,組函數(shù)(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;查看全部 -
分組函數(shù)會(huì)自動(dòng)過(guò)濾空值
例子:平均工資
select sum(sal)/count(*) , sum(sal)/count(sal)? ,?? avg(sal)? from emp ;?- count(*) 會(huì)包含空值的個(gè)數(shù)
- 分組函數(shù)會(huì)自動(dòng)過(guò)濾掉空值
- nvl函數(shù)? 使得分組函數(shù)不忽略空值
- nvl(comm,0)?? 這個(gè)函數(shù)的意思是 當(dāng)該字段為空的時(shí)候返回第二個(gè)參數(shù),當(dāng)字段不為空 返回他本身
- 這個(gè)函數(shù)可用于自增的輸入nvl(max(sno),0))+1? 最大值加一?? 可用于插入數(shù)據(jù)的編號(hào)
查看全部 -
Having

查看全部 -
testtetetete
查看全部
舉報(bào)