二,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');