mysql打卡學習9各種連接

二,sq199語法

語法
	select 查詢列表
	from 表1 別名【連接類型】
	join 表2 別名
	on 連接條件
	【where 篩選條件】
	【group by 分組】
	【having 篩選條件】
	【order by 排序列表】
分類
內連接:inner
外連接
	左外連接:left【outer】
	右外連接:right【outer】
	全外連接:full【outer】
交叉連接:cross
*/

一.內連接

在這裏插入圖片描述

/*
語法:
select 查詢列表
from 表1 別名
inner join 表2 別名
on 連接條件;

分類:
等值
非等值
自連接

特點
1.添加排序,分組,篩選
2.inner可以省略
3.篩選條件可以放在where後面,連接條件放在on後面,提高分離性
4.inner join 連接和sql92等值連接結果一致
*/

1.等值連接

#(1)查詢員工名,部門名
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`;

#(2)名字包含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)部門個數>3的城市名和部門個數
SELECT city,COUNT(*)
FROM departments d
INNER JOIN locations l
ON d.`location_id`=l.`location_id`
GROUP BY city
HAVING COUNT(*)>3;

#(4)查詢哪個部門的員工個數>3的部門名和員工個數,個數降序
SELECT department_name,COUNT(*)
FROM departments AS d
INNER JOIN employees AS e
ON d.`department_id`=e.`department_id`
GROUP BY department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;

#(5)員工名,部門名,工種名,部門名降序
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 department_name DESC;

2.非等值連接

#(1)查詢員工的工資級別
SELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;

#(2)每個工資級別個數>20,並且按照級別降序
SELECT COUNT(*),grade_level
FROM employees e
JOIN job_grades g
ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`
GROUP BY grade_level
HAVING COUNT(*)>20
ORDER BY grade_level;

#(3)自連接
#姓名包含k員工名,上級名
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m
ON e.`manager_id`=m.`employee_id`
WHERE e.`last_name` LIKE "%k%";

2.外連接

/*
應用場景:用於查詢一個表中有,另一個表沒有的記錄
就是倆個表有交集和無交集
特點
1.外連接的查詢結果爲主表中的所有記錄
	如果從表中有和它匹配的,則顯示匹配值
	如果從表中沒有和它匹配的,則顯示null
	外連接查詢結果=內鏈接結果+主表中有而從表沒有的記錄
2.左外連接,left join左邊是主表
  右外連接,right join右邊的是主表
3.左外和右外交換兩個表的順序,可以實現同樣的效果
4.全外連接=內連接結果+表1中有但是表二中沒有+表2中有但是表一中有,就是合集
*/
#查詢男朋友不在男神表的女神名
SELECT * FROM beauty;
SELECT * FROM boys;

在這裏插入圖片描述
在這裏插入圖片描述

#左外連接
SELECT b.name,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.`boyfriend_id`=bo.`id`
#分組之前
WHERE bo.`id` IS NULL;

SELECT b.*,bo.*
FROM  boys bo
LEFT OUTER JOIN beauty b
ON b.`boyfriend_id`=bo.`id`
#分組之前
WHERE bo.`id` IS NOT NULL;

在這裏插入圖片描述
在這裏插入圖片描述

#右外連接
SELECT b.name,bo.*
FROM  boys bo
RIGHT OUTER JOIN beauty b
ON b.`boyfriend_id`=bo.`id`
#分組之前
WHERE bo.`id` IS NOT NULL;

練習

#1.查詢哪個部門麼有員工 
#左外
SELECT d.*,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 d.*,e.employee_id
FROM employees e 
RIGHT OUTER JOIN departments d#主表
ON d.`department_id`=e.`department_id`
WHERE e.`employee_id` IS NULL;

#全外連接
USE girls;
SELECT b.*,bo.*
FROM beauty b

在這裏插入圖片描述
在這裏插入圖片描述

#交叉連接  笛卡爾乘積 4*11
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

練習

#1.查詢編號>3的女神的男朋友的信息,如果有則列出,如果沒有,用null填充
SELECT b.id,b.name,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.`boyfriend_id`=bo.`id`
WHERE b.id>3;

#2.查詢哪個城市沒有部門
SELECT city,d.*
FROM departments d
RIGHT OUTER JOIN locations l
ON d.`location_id`=l.`location_id`
WHERE d.`department_id` IS NULL;

#3.查詢部門名爲sal或者it的員工信息
SELECT e.*,d.department_name
FROM departments d
LEFT JOIN employees e
ON e.`department_id`=d.`department_id`
WHERE d.`department_name` IN('SAL','IT');

SELECT * FROM departments
WHERE `department_name` IN('SAL','IT');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章