分組查詢 連接查詢

分組查詢

語法:

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 查詢列表
FROM1 【連接類型】
JOIN2
ON 連接條件
【WHERE 篩選條件】
【GROUP BY 分組】
【HAVING 篩選條件】
【ORDER BY 排序順序】

1、內連接:inner
語句:

SELECT 查詢列表
FROM1
INNER JOIN2
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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章