1.分組查詢
分組函數(shù)和前面講的函數(shù)不同在于胖齐,前面的對內(nèi)容本身的處理,而分組函數(shù)的主要功能是統(tǒng)計。
主要講的是分組函數(shù):sum , avg, max, min , count
SELECT SUM(salary) AS 單月所發(fā)放總工資 FROM employees;
SELECT AVG(salary) AS 單月所發(fā)的平均工資 FROM employees;
SELECT MAX(salary) AS 單月所發(fā)放的最大工資 FROM employees;
SELECT MIN(salary) AS 單月所發(fā)放的最小工資 FROM employees;
SELECT COUNT(*) AS 總員工人數(shù) FROM employees;
分組函數(shù)的共同特點:會忽略null
分組函數(shù)還可以和一個關(guān)鍵字合用:DISTINCT
SELECT COUNT(DISTINCT salary) FROM employees;
分組查詢:group by關(guān)鍵字實現(xiàn)分組,group by放在where條件語句之后,order by放置在group by的后面
總體的順序先后為:
where條件,group by 分組語句 ,having 分組的條件 ,order by 排序語句
where條件是針對所有記錄的上沐,having 條件只是局限的針對每一組的記錄的
分組查詢語法:
SELECT
列(這個列要求必須只能是group by的后面字段),分組函數(shù)()
FROM
表名
WHERE
篩選條件
group by
分組字段列表
having(只能配合group by使用)
與分組有關(guān)的篩選條件(針對分組后的每組內(nèi)記錄)
order by
排序
#ASC 升序排序
# DESC 降序排序
案例:查詢每個工種的最高工資
SELECT MAX(salary),job_id FROM employees GROUP BY job_id;
案例:查詢每個地方的部門個數(shù)
SELECT location_id,COUNT(*) FROM departments GROUP BY location_id;
案例:查詢每個部門每個工種的員工的平均工資
SELECT department_id,job_id,AVG(salary) AS 平均工資
FROM employees GROUP BY department_id,job_id;
案例:查詢員工郵箱里包含a
字母的,每個部門的平均工資
SELECT AVG(salary) , department_id FROM employees
WHERE email
LIKE '%a%'
GROUP BY department_id;
案例:查詢有獎金的每個領導手下員工的最高工資
SELECT MAX(salary),manager_id FROM employees
WHERE commission_pct IS NOT NULL && commission_pct>0
GROUP BY manager_id;
案例:查詢部門的員工數(shù)>5的所有部門的員工數(shù)
SELECT COUNT(*) AS 員工個數(shù) ,department_id FROM employees
GROUP BY department_id
HAVING 員工個數(shù)>5;
案例:查詢沒有獎金的每個領導手下員工的最高工資楞艾,且最高工資高于7000
SELECT MAX(salary) AS 最高工資,manager_id FROM employees
WHERE commission_pct is NULL
GROUP BY manager_id
HAVING 最高工資 >7000
ORDER BY 最高工資 ASC;
2.連接查詢
連接查詢:又稱多表查詢参咙,當查詢結(jié)果來自多張數(shù)據(jù)表當時候,就需要連接查詢
CREATE TABLE ta(id int,age int);
CREATE TABLE tb(id int,`name` VARCHAR(4),ta_id int);
INSERT INTO ta(id,age)VALUES(1,12);
INSERT INTO ta(id,age)VALUES(2,22);
INSERT INTO ta(id,age)VALUES(3,32);
INSERT INTO ta(id,age)VALUES(4,42);
INSERT INTO ta(id,age)VALUES(5,52);
INSERT INTO ta(id,age)VALUES(6,62);
INSERT INTO tb(id,`name`,ta_id) VALUES(1,'李白',2);
INSERT INTO tb(id,`name`,ta_id)VALUES(2,'小王',1);
INSERT INTO tb(id,`name`,ta_id)VALUES(3,'小張',3);
INSERT INTO tb(id,`name`,ta_id)VALUES(4,'李紅',8);
INSERT INTO tb(id,`name`,ta_id)VALUES(5,'小白',1);
INSERT INTO tb(id,`name`,ta_id)VALUES(6,'王加',10);
INSERT INTO tb(id,`name`,ta_id)VALUES(7,'趙明',10);
INSERT INTO tb(id,`name`,ta_id)VALUES(8,'趙白',6);
#將兩個表組合在一起錯誤 查詢 出現(xiàn)笛卡爾積的結(jié)果
SELECT `name`,age FROM ta,tb;
#解決辦法添加上限制條件
#在笛卡爾積的結(jié)果上再篩選一次
SELECT `name` , age FROM ta,tb WHERE tb.ta_id=ta.id;
#具體查看連接查詢硫眯,先看看連接查詢的分類
# 重要
按照功能分類:
內(nèi)鏈接:
等值連接 *
非等值連接 *
自連接 *
外連接:
左外連接 *
右外連接
全外連接
交叉連接
等值連接:
簡單說明就是:表之間用=連接
分析:SELECT `name` , age FROM ta,tb WHERE tb.ta_id=ta.id;
它的執(zhí)行過程蕴侧,和笛卡爾積一樣,只是在結(jié)果集中進行了條件篩選两入,滿足tb.ta_id=ta.id條件的留下净宵,不滿足的丟棄。
案例:查詢員工和對應的部門名
SELECT last_name,department_name FROM employees,departments
WHERE employees.department_id =departments.department_id;
用表名來限定字段裹纳,太長择葡,不太方方便,在實際運用中剃氧,我們一般使用別名來限定定敏储。
SELECT e.last_name,d.department_name FROM employees e,departments d
WHERE e.department_id =d.department_id;
注意:等值連接查詢出來的是交集
在等值查詢的基礎上添加查詢條件進行篩選
案例:查詢有獎金定員工名以及所屬部門名:
SELECT last_name,department_name FROM employees e , departments d
WHERE e.department_id = d.department_id
AND e.commission_pct IS NOT NULL;
在等值查詢的基礎上加分組查詢
案例:查詢每個城市的部門個數(shù)
SELECT COUNT(*) AS 個數(shù),city FROM departments d,locations l
WHERE d.location_id=l.location_id
GROUP BY city;
案例:查詢有獎金的每個部門的部門名和部門的領導編號和該部門的最低工資
SELECT d.department_name ,d.manager_id,MIN(e.salary) AS 最低工資
FROM departments d ,employees e
WHERE d.department_id = e.department_id AND e.commission_pct IS NOT NULL
GROUP BY d.department_name,d.manager_id;
案例:查詢每個工種的工種名和員工個數(shù),并且按照員工個數(shù)排序降序
SELECT j.job_title,COUNT(*) AS 員工個數(shù) FROM jobs j, employees e
WHERE j.job_id = e.job_id
GROUP BY j.job_title
ORDER BY 員工個數(shù) DESC;
案例:查詢員工名朋鞍,部門名和所在城市名
SELECT e.last_name,d.department_name,l.city FROM employees e, departments d,locations l
WHERE e.department_id = d.department_id AND d.location_id = l.location_id;
注意
本文用到的myemployees.sql 文件在MySQL實戰(zhàn)2 語法已添、篩選條件和函數(shù) 附件中