Mysql分組查詢
案例一 查詢每個工種的最高工資
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;
案例二 查詢每個位置的部門個數
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_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
GROUP BY manager_id;
案例五 查詢哪個部門的員工個數大於2
(1) 查詢每個部門的員工個數
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;
(2) 根據(1)的結果查詢哪個部門員工的個數大於2
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;
案例六 查詢每個工種有獎金的員工的最高工資 而且最高工資大於12000的工種編號和最高工資
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
小結
分組查詢中的篩選條件分爲2類
分組篩選前的數據源是
原始表
分組篩選後的數據源是
分組後的結果集
案例七 查詢每個部門每個工種的員工的平均工資 並且按照平均工資的高低排序
SELECT AVG(salary),job_id,department_id
FROM employees
GROUP BY job_id,department_id
ORDER BY AVG(salary) DESC;
案例八 查詢各個管理者手下員工的最低工資 其中最低工資大於6000 沒有管理者的員工不計算在內
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary)>6000;
案例九 查詢所有部門的編號 員工數量和工資平均值 並且按照平均工資降序
SELECT department_id,COUNT(*),AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) DESC;
Mysql連接查詢 (92標準)
案例一 查詢有獎金的員工名和部門名
SELECT last_name,department_name
FROM employees e,departments d
WHERE e.`department_id`=d.`department_id`
AND e.`commission_pct` IS NOT NULL;
案例二 查詢城市名字中第二個字符爲o的對應的城市名和部門名
SELECT city,department_name
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
AND city LIKE '%_o%';
案例三 查詢每個城市的部門個數
SELECT COUNT(*),city
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
GROUP BY city;
案例四 查詢有獎金的每個部門的部門名和部門的領導編號和該部門的最低工資
SELECT d.manager_id,d.department_name,MIN(salary)
FROM employees e,departments d
WHERE e.`department_id`=d.`department_id`
AND e.`commission_pct` IS NOT NULL
GROUP BY department_name;
案例五 查詢每個工種的工種名和員工的個數 並且按照員工的個數降序
SELECT job_title,COUNT(*)
FROM jobs j,employees e
WHERE e.`job_id`=j.`job_id`
GROUP BY e.`job_id`
ORDER BY COUNT(*) DESC;
案例六 查詢員工名和部門名和所在的城市(三表連接)
SELECT last_name,department_name,city
FROM employees e,locations l,departments d
WHERE e.`department_id`=d.`department_id`
AND d.`location_id`=l.`location_id`;
案例七 選擇所有有獎金的員工的名字 部門名稱 位置編號 城市名字
SELECT last_name,department_name,d.location_id,l.city
FROM employees e,departments d,locations l
WHERE e.`department_id`=d.`department_id`
AND d.`location_id`=l.`location_id`
AND e.`commission_pct` IS NOT NULL;
案例八 查詢每個工種 每個部門的部門名 工種名和最低工資
SELECT d.department_name,j.job_title,MIN(salary)
FROM employees e,departments d,jobs j
WHERE e.`department_id`=d.`department_id`
AND e.`job_id`=j.`job_id`
GROUP BY department_name,j.job_id;
案例九 查詢每個國家下的部門個數大於2的國家的編號
SELECT country_id,COUNT(*)
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
GROUP BY country_id
HAVING COUNT(*)>2;
Mysql連接查詢 (99標準)
語法
select 查詢列表
from 表1 別名【連接類型】
join 表2 別名
on 連接條件
【where 篩選條件】
【group by 分組】
【having 篩選條件】
案例一到五展示內連接
案例一 查詢員工名和部門名
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`;
案例二 查詢名字中包含e的員工名和工種名
SELECT last_name,job_title
FROM employees e
INNER JOIN jobs j
ON e.`job_id`=j.`job_id`
WHERE e.`last_name` LIKE '%e%';
案例三 查詢部門個數>3的城市名和部門個數
SELECT city,COUNT(*)
FROM locations l
INNER JOIN departments d
ON d.`location_id`=l.`location_id`
GROUP BY city
HAVING COUNT(*)>3;
案例四 查詢哪個部門的員工個數>3 顯示查詢出的部門結果的部門名和員工個數 並且按照個數降序
SELECT COUNT(*),department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`
GROUP BY e.department_id
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;
案例五 查詢員工名 部門名 工種名 並且按照部門名降序
SELECT last_name,department_name,job_title
FROM employees e
INNER JOIN departments d ON e.`department_id`=d.`department_id`
INNER JOIN jobs j ON e.`job_id`=j.`job_id`
ORDER BY d.department_name DESC;
小結
篩選條件放在where後面 連接條件放在on後面 提高分離性 便於閱讀
支持排序 分組 篩選
案例六到八展示外連接
案例六 查詢哪個部門沒有員工
SELECT department_name,e.`employee_id`
FROM departments d
LEFT OUTER JOIN employees e
ON d.`department_id`=e.`department_id`
WHERE e.`employee_id` IS NULL;
案例七 查詢哪個城市沒有部門
SELECT city,d.department_name
FROM locations l
LEFT OUTER JOIN departments d
ON d.`location_id`=l.`location_id`
WHERE d.`department_name` IS NULL;
案例八 查詢部門名爲SAL或IT的員工信息
SELECT e.`last_name`,e.`employee_id`,d.`department_name`
FROM departments d
LEFT OUTER JOIN employees e
ON e.`department_id`=d.`department_id`
WHERE d.`department_name` IN ('SAL','IT');
小結
外連接的查詢結果=內連接結果+主表有而從表沒有的記錄
Mysql子查詢
案例一 查詢誰的工資比Abel高
SELECT *
FROM employees e
WHERE salary>(
SELECT salary
FROM employees e
WHERE e.`last_name`='Abel'
);
案例二 返回job_id與141號員工相同 salary比143號員工多的所有員工的姓名 job__id和工資salary
SELECT job_id,last_name,salary
FROM employees e
WHERE salary>(
SELECT salary
FROM employees e
WHERE e.`employee_id`='143'
)AND job_id=(
SELECT job_id
FROM employees e
WHERE e.`employee_id`='141'
);
案例三 查詢最低工資大於50號部門最低工資的部門id和其最低工資
SELECT MIN(salary),department_id
FROM employees e
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM employees e
WHERE e.`department_id`=50
);
案例四 返回其他工種中比job_id爲’IT_PROG’工種任意工資低的員工的工號 名字 job_id 和 salary
SELECT last_name,salary,job_id,employee_id
FROM employees e
WHERE salary<ANY(
SELECT salary
FROM employees e
WHERE job_id='IT_PROG'
)AND job_id<>'IT_PROG';
案例五 查詢每個部門的員工個數
SELECT d.*,(
SELECT COUNT(*)
FROM employees e
WHERE e.department_id=d.`department_id`)
每個部門員工個數
FROM departments d;
案例六 查詢和Zlotkey相同部門的員工姓名和工資
SELECT last_name,salary
FROM employees e
WHERE e.`department_id`=(
SELECT department_id
FROM employees e
WHERE e.`last_name`='Zlotkey'
);
案例七 查詢工資比公司平均工資高的員工的員工號 姓名 和工資
SELECT last_name,salary,employee_id
FROM employees e
WHERE e.`salary`>(
SELECT AVG(salary)
FROM employees
);
案例八 查詢各部門中工資比本部門平均工資高的員工的員工號 姓名 工資
SELECT last_name,employee_id,salary,e.department_id
FROM employees e
INNER JOIN(
SELECT AVG(salary) ag,e.department_id
FROM employees e
GROUP BY department_id
)ag_dep
ON e.`department_id`=ag_dep.department_id
WHERE e.`salary`>ag_dep.ag;
案例九 查詢和姓名中包含字母u的員工在相同部門工作的員工的員工號和姓名
SELECT e.`employee_id`,e.`last_name`
FROM employees e
INNER JOIN (
SELECT DISTINCT department_id
FROM employees e
WHERE e.`last_name` LIKE '%u%'
)dl
ON e.`department_id`=dl.department_id;
SELECT e.`employee_id`,e.`last_name`
FROM employees e
WHERE e.`department_id` IN(
SELECT DISTINCT department_id
FROM employees e
WHERE e.`last_name` LIKE '%u%'
);
案例十 查詢平均工資最低的部門信息
方法一
SELECT d.*
FROM departments d
WHERE department_id=(
SELECT department_id
FROM employees e
GROUP BY department_id
HAVING AVG(salary)=(
SELECT MIN(mini)
FROM(
SELECT AVG(salary) mini,department_id
FROM employees e
GROUP BY department_id
)ad
)
);
方法二
SELECT *
FROM departments
WHERE department_id=(
SELECT department_id
FROM employees e
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1
);
案例十一 查詢平均工資最低的部門信息和該部門的平均工資
SELECT *
FROM departments d
INNER JOIN (
SELECT department_id,AVG(salary)
FROM employees e
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1
)ad
ON d.`department_id`=ad.department_id;
案例十二 查詢平均工資最高的工種信息
SELECT *
FROM jobs
WHERE job_id=(
SELECT job_id
FROM employees e
GROUP BY job_id
ORDER BY AVG(salary) DESC
LIMIT 1
);
案例十三 查詢平均工資高於公司平均工資的部門有哪些
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)>(
SELECT AVG(salary)
FROM employees e
);
案例十四 查詢出公司中所有manager的詳細信息
SELECT *
FROM employees e
WHERE e.`employee_id` IN(
SELECT DISTINCT
manager_id
FROM employees
);
案例十五 查詢平均工資最高的部門的manager的詳細信息
SELECT last_name,department_id,email,salary
FROM employees e
WHERE employee_id=(
SELECT manager_id
FROM departments d
WHERE d.`department_id`=(
SELECT department_id
FROM employees e
GROUP BY department_id
ORDER BY AVG(salary)DESC
LIMIT 1
)
);
Mysql 分頁查詢
案例一 查詢前5條的員工信息
SELECT *
FROM employees e
LIMIT 0,5;
案例二 查詢有獎金的員工信息 並且把工資較高的前10名顯示出來
SELECT *
FROM employees e
WHERE e.`commission_pct` IS NOT NULL
ORDER BY salary DESC
LIMIT 10;