MySQL_2_查詢基礎(chǔ)(SELECT)

分組查詢(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

主表和副表的區(qū)別

案列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
)
);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容