分組查詢
語法:
select 查詢列表
from 表
【where 篩選條件】
group by 分組的字段
【order by 排序的字段】
查詢每個工種的員工平均工資
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id
連接查詢
-
按照年代分類:
- sql92標準:僅僅支持內連接
- sql99標準:支持內連接+外連接(左外和右外)+交叉連接
-
按照功能分類:
- 內連接:
- 等值連接
- 非等值連接
- 子連接
- 外連接:
- 左外連接
- 右外連接
- 全外連接
- 交叉連接:
一、sql92標準
1、等值連接:
查詢女生名對應的男生名 - 內連接:
SELECT girlName, boyName
FROM boys, girls
WHERE girls.boyfriend_id = boys.id;
可以加篩選
查詢有獎金的員工名、部門名
SELECT last_name, department_name, commission_pct
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND commission_pct IS NOT NULL;
可以加分組
查詢每個城市的部門個數
SELECT COUNT(*),city
FROM departments d, locations l
WHERE d.location_id = l.location_id
GROUP BY city;
可以加排序
查詢每個工種的工種名和員工個數,並且按員工個數降序
SELECT job_title, COUNT(*)
FROM employees e, jobs j
WHERE e.job_id = j.job_id
GROUP BY job_title
ORDER BY COUNT(*) DESC;
2、非等值連接
查詢員工的工資和工資等級
SELECT salary,grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`
AND g.`grade_level`='A';
3、子連接
查詢員工名和上級名稱
SELECT e.employee_id, e.last_name, m.emplyee_id, m.last_name
FROM emplyees e, emplyees m
WHERE e.'manager_id' = m.'employee_id';
二、sql99標準
語法:
SELECT 查詢列表
FROM 表1 【連接類型】
JOIN 表2
ON 連接條件
【WHERE 篩選條件】
【GROUP BY 分組】
【HAVING 篩選條件】
【ORDER BY 排序順序】
1、內連接:inner
語句:
SELECT 查詢列表
FROM 表1
INNER JOIN 表2
ON 連接條件
【WHERE 篩選條件】
【GROUP BY 分組】
【HAVING 篩選條件】
【ORDER BY 排序順序】
分類:
等值、非等值、自連接
特點:
- 添加排序、分組、篩選。
- inner可以省略。
- 篩選條件放在where後面,連接條件放在on後面,提高分離性,便於閱讀。
- inner join連接和sql92語法中的等值連接效果相同,都是查詢多表的交集。
1)、等值連接
查詢員工名和部門名
SELECT last_name, department_name
FROM departments d
INNER JOIN employees e
ON d.`department_id` = e.`department_id`;
查詢名字中包含e的員工名和工種名(添加篩選)
SELECT last_name, job_title
FROM employees e
INNER JOIN jobs j
ON e.`job_id` = j.`job_id`
WHERE last_name LIKE '%e%';
查詢部門個數>3的城市名和部門個數(添加分組+篩選)
SELECT city,COUNT(*) 個數
FROM departments d
INNER JOIN locations l
ON l.`location_id` = d.`location_id`
GROUP BY l.city
HAVING COUNT(*) > 3;
2)、非等值連接
查詢員工工資級別
SELECT grade_level, salary
FROM job_grades j
JOIN employees e
ON e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal`;
3)、自連接
查詢員工的名字和上級的名字
SELECT e.last_name, m.last_name
FROM employees e
JOIN employees m
ON e.`manager_id`= m.`employee_id`;
2、外連接
應用場景:用於查詢一個表中有,另一個表沒有的記錄
特點:
- 外連接的查詢結果爲主表中所有記錄
- 如果從表中有和它匹配的,則顯示匹配的值
- 如果從表中沒有和它匹配的,則顯示null
- 外連接查詢結果=內連接結果+主表中有而從表中沒有的記錄
- 左外連接,left join左邊的是主表
右外連接,right join右邊是主表 - 左外和右外交換兩個表的順序,可以實現同樣的效果
- 全外連接=內連接的結果+表1中有但表2沒有+表2中有但表1沒有的
1)、左外連接:left【outer】
查詢沒有男朋友的女生名
SELECT b.name
FROM beauty b
LEFT JOIN boys bo
ON b.`boyfriend_id` = bo.`id`
WHERE bo.`id` IS NULL;
2)、右外連接:right 【outer】
查詢沒有男朋友的女生名
SELECT b.name
FROM boys bo
RIGHT JOIN beauty b
ON bo.`id` = b.`boyfriend_id`
WHERE bo.`id` IS NULL
3)、全外連接:full【outer】
SELECT b.*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.id;
3、交叉連接:cross
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;