- 分組查詢
1)分組函數(shù)
sum():求和
avg():求平均
max():求最小值
min():求最小值
count():求個數(shù)
count(*):求行數(shù)
注意:分組函數(shù)對空值忽略浑劳。
分組函數(shù)(distint 列名):去掉重復(fù)值后求分組函數(shù)阱持。
2)分組查詢
a)group by 分組條件:按照分組條件相同的分作一組。
b)(oracle)分組后在select后只能寫分組條件和分組函數(shù)魔熏,mysql沒有這個限制(可以寫衷咽,語法不錯)。
c)分組條件可以是多列蒜绽,是按照多列的組合相等的分作一組镶骗。
d)having子句:對分組之后的解雇進(jìn)行篩選。
where:對行篩選躲雅。
having:先分組鼎姊,對分組結(jié)果篩選。
e) from where (group by)having select order by limit
①查詢每個部門的部門編號相赁,部門名稱相寇,部門人數(shù),最高工資钮科,最低工資唤衫,工資總和,平均工資绵脯。
SELECT deptno,dname,COUNT(deptno),MAX(sal),min(sal),sum(sal),avg(sal)
FROM emp e JOIN dept d USING (deptno)
GROUP BY deptno
②查詢每個部門佳励,每個崗位的部門編號,部門名稱蛆挫,崗位名稱赃承,部門人數(shù),最高工資璃吧,最低工資楣导,工資總和,平均工資畜挨。
SELECT d.deptno,dname,job,COUNT(deptno),MAX(sal),min(sal),sum(sal),avg(sal)
FROM emp e JOIN dept d USING (deptno)
GROUP BY deptno,job
③查詢每個經(jīng)理所管理的人數(shù)筒繁,經(jīng)理編號,經(jīng)理姓名巴元,要求包括沒有經(jīng)理的人員信息毡咏。
SELECT COUNT(*),m.empno,m.ename
FROM emp e LEFT JOIN emp m
ON e.mgr = m.empno
GROUP BY m.empno
④查詢部門人數(shù)大于2的部門編號,部門名稱逮刨,部門人數(shù)呕缭。
SELECT deptno,dname,COUNT(empno)
FROM emp e JOIN dept d USING (deptno)
GROUP BY deptno,dname
HAVING count(*) > 2
⑤查詢部門平均工資大于2000堵泽,且人數(shù)大于2的部門編號,部門名稱恢总,部門人數(shù)迎罗,部門平均工資,并按照部門人數(shù)升序排序片仿。
SELECT deptno,dname,COUNT(empno),avg(sal)
FROM emp e JOIN dept d USING (deptno)
GROUP BY deptno
HAVING COUNT(*) > 2 AND
avg(sal)>2000
ORDER BY COUNT(empno)
- 子查詢
1)概念:括號中的查詢纹安,也被稱為內(nèi)部查詢,括號外的查詢砂豌,稱為外部查詢
2)執(zhí)行過程:
a)先執(zhí)行內(nèi)部查詢厢岂,的大確定的結(jié)果。
b)再根據(jù)內(nèi)部查詢結(jié)果阳距,執(zhí)行外部查詢塔粒。
3)子查詢分類:
a)單行子查詢:子查詢返回單行單列(一個結(jié)果)
b)多行子查詢:子查詢返回多行單列
c)多列子查詢:子查詢返回多行多列
4)單行子查詢,單行運算符:=筐摘、>=卒茬、<=、>蓄拣、<扬虚、<>。
子查詢可以寫在:from球恤、where、having荸镊。
5)多行子查詢咽斧,多行運算符:in、all躬存、any
in:在子查詢中出現(xiàn)
all:表示和子查詢的所有行結(jié)果進(jìn)行比較张惹,每一行必須都滿足條件。
< all::表示小于子查詢結(jié)果集中的所有行岭洲,即小于最小值宛逗。
all:表示大于子查詢結(jié)果集中的所有行,即大于最大值盾剩。
= all :表示等于子查詢結(jié)果集中的所有行,即等于所有值雷激,通常無意義。
any:表示和子查詢的任意一行結(jié)果進(jìn)行比較告私,有一個滿足條件即可屎暇。
< any:表示小于子查詢結(jié)果集中的任意一個,即小于最大值就可以驻粟。
any:表示大于子查詢結(jié)果集中的任意一個根悼,即大于最小值就可以。
= any:表示等于子查詢結(jié)果中的任意一個,即等于誰都可以挤巡,相當(dāng)于IN剩彬。
6)子查詢空值的問題
只要空值有可能成為子查詢結(jié)果集合中的一部分,就不能是哦那個not in運算符矿卑。(解決方案is not null)
7)多列子查詢:
SELECT * FROM emp
where (deptno,sal) in
(SELECT deptno,min(sal)
from emp
GROUP BY deptno)
- 相關(guān)子查詢
1)定義:當(dāng)子查詢中引用的父查詢表中的列的時候襟衰,服務(wù)器執(zhí)行相關(guān)子查詢
2)執(zhí)行過程:(父查詢每處理一行,子查詢執(zhí)行一次)
a)取父查詢的每一行作為候選行粪摘。
b)用候選行被子查詢引用列的值執(zhí)行子查詢瀑晒。
c)用來自子查詢的值確認(rèn)或取消候選行。
d)重復(fù)步驟a徘意、b苔悦、c,知道父查詢中沒有候選行椎咧。