分組查詢(GROUP BY)
語(yǔ)法:
GROUP BY 分組條件
描述:
就像在分類一樣。
舉個(gè)例子,比如你現(xiàn)在有一些水果,里面有香蕉,有蘋果,有橘子等等,我現(xiàn)在要把每個(gè)水果的數(shù)量搞錯(cuò)了,那這個(gè)GROUP BY 就像給你分好框,自己去數(shù)數(shù)量就好了。那這個(gè)SQL語(yǔ)句要怎么寫呢。
SELECT 水果名稱,水果數(shù)量
FROM 水果表
GROUP BY 水果名稱
分組后查詢(HAVING)
特點(diǎn):

分組函數(shù)條件肯定是放在having子句中
能用分組前篩選的盡量在分組前篩
WHERE和HAVING的區(qū)別
where 子句的作用是在對(duì)查詢結(jié)果進(jìn)行分組前,將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù),where條件中不能包含聚組函數(shù),使用where條件過濾出特定的行。
having 子句的作用是篩選滿足條件的組,即在分組之后過濾數(shù)據(jù),條件中經(jīng)常包含聚組函數(shù),使用having 條件過濾出特定的組,也可以使用多個(gè)分組標(biāo)準(zhǔn)進(jìn)行分組。
連接查詢(JOIN ON)
99語(yǔ)法:
SELECT 要查詢的內(nèi)容
FROM 表名1
JOIN 表名2
ON 連接條件 表1.主鍵 = 表2.外鍵
連接類型:
連接類型
內(nèi)連接 inner 重點(diǎn)
外連接 outer
左外 left outer 重點(diǎn)
右外 right outer 重點(diǎn)
左外連接:left join 左邊的是主表
右外連接:right join 右邊的是主表
全外 full outer
交叉連接 cross

案列1: 查詢部門平均工資大于7000的部門名稱
# 查詢部門平均工資大于7000的部門名稱
SELECT d.`department_name`
FROM `departments`d LEFT JOIN `employees`e
ON d.`department_id` = e.`department_id`
GROUP BY d.`department_id`
HAVING AVG(salary) > 7000;
案例2: 查詢部門id大于50的部門分布在那個(gè)城市
# 查詢部門id大于50的部門分布在那個(gè)城市
SELECT l.`city` ,d.`department_name`
FROM `locations`l LEFT JOIN `departments`d
ON l.`location_id` = d.`location_id`
WHERE `department_id` > 50;

查詢會(huì)出現(xiàn)笛卡爾乘積的情況
笛卡爾乘積
表1表2 = 表1的行數(shù)表2的行數(shù)
出現(xiàn)原因:沒有有效的連接條件
如果查詢的字段來自不同的表,要用連接條件
子查詢(難)
為什么要用子查詢?
假如我要查詢公司工資最少的員工名、工種編號(hào)和工資。要怎么寫?
#先查詢工資最低是什么
SELECT MIN(salary)
FROM employees;
# 然后把工資記起來2100
SELECT `first_name`,`job_id`,`salary`
FROM employees
WHERE salary = 2100;
我們這樣寫語(yǔ)法就很麻煩,于是就要用子查詢
子查詢?cè)趺磳懩兀?/p>
# 把兩個(gè)查詢語(yǔ)句連接起來就好了。
SELECT `first_name`,`job_id`,`salary`
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
子查詢基本語(yǔ)法寫法:
SELECT 需要查的東西
FROM 表1 JOIN 表2
ON 連接條件
WHERE 篩選條件 = (
SELECT 需要查的東西
FROM 表1 JOIN 表2
ON 連接條件
WHERE 篩選條件 =(
。。。
)
)
GROUP BY 分組條件
HAVING (
SELECT 需要查的東西
FROM 表1 JOIN 表2
ON 連接條件
WHERE 篩選條件 =(
。。。
)
)
ORDER BY 排序依據(jù)
LIMIT 分頁(yè)查詢
我覺得叫嵌套查詢比較合適。
一個(gè)查詢里面嵌套一個(gè)查詢,一直套娃。
案例1:查詢平均工資最低的部門信息和該部門的平均工資
#查詢平均工資最低的部門信息和該部門的平均工資
SELECT *,AVG(salary)
FROM `departments`d LEFT JOIN `employees`e
ON d.`department_id` = e.`department_id`
WHERE e.`department_id` = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) =(
SELECT AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1
)
);
可能會(huì)看不懂
我們把這個(gè)例題分成三步來寫
1、先查詢最低平均工資
SELECT AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1
2、查詢最低平均工資的部門ID
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) =(
SELECT AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1
)
3、查詢平均工資最低的部門信息和該部門的平均工資
SELECT *,AVG(salary)
FROM `departments`d LEFT JOIN `employees`e
ON d.`department_id` = e.`department_id`
WHERE e.`department_id` = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) =(
SELECT AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1
)
);