(五)連接查詢(SQL99標準)、子查詢、分頁查詢、聯合查詢

一、連接查詢(SQL99標準)

1、含義:當要查詢的數據來自多張表時要使用連接查詢

2、語法:

select 查詢列表
from 表1 別名 
【連接類型】 join 表2 別名 
on 連接條件
【where 篩選條件】
【group by 分組】
【having 篩選條件】
【order by 排序列表】

注意:SQL99標準支持以下連接方式:

#1內連接

#2外連接:左外、右外、全外連接

#3交叉連接(很少用到)

3、內連接:

案例一:查詢部門個數>3的城市名和部門個數(分組函數+分組查詢)

上圖可以看出兩個表之間的關係

SELECT COUNT(*),l.`city`
FROM departments d
INNER JOIN locations l ON d.`location_id`=l.`location_id`
GROUP BY l.`city`
HAVING COUNT(*)>3;

案例二:查詢員工名、部門名、工種名,並按部門名降序(添加三表連接)

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;

注意:根據上面兩個案例可以看出內連接時連接類型使用INNER(可省略)

4、外連接(左外、右外連接)

①用到的庫信息:

②區分左、右外連接:

③左外連接:

案例:查詢男朋友不在男生表中的女神名

SELECT b.`name`
FROM beauty b
LEFT JOIN boys bo ON b.`boyfriend_id`=bo.`id`;

注意:左外連接類型使用LEFT  OUTER ,其中OUTER可以省略

④右外連接:

案例:查詢男朋友不在男生表中的女神名

SELECT b.`name`
FROM boys bo
RIGHT JOIN beauty b ON bo.`id`=b.`boyfriend_id`;

注意:右外連接類型使用RIGHT  OUTER ,其中OUTER可以省略

⑤區分內外連接:

      

二、子查詢

1、含義:SQL語句中嵌套其它完整的SQL語句

2、分類:

select後: 標量子查詢(結果集只有一行一列)

from後:表子查詢(多行多列)

where或having後:標量子查詢()、列子查詢(一列多行)、行子查詢(一行多列)

exists後面:相關子查詢、表子查詢

注意:

①子查詢要放在小括號中,且子查詢不需要添加分號

②標量子查詢:一般搭配單行操作符使用(> < >= <= = <>)

③列子查詢:一般搭配多行操作符使用(in、any/some、all)

3、WHERE或HAVING後面的子查詢:

①標量子查詢:

案例1:誰的工資比 Abel 高? (子查詢)

step1:查詢Abel的工資

USE myemployees;
SELECT e.salary Abel的工資
FROM employees e
WHERE e.last_name='Abel';

step2:將step1的結果當作子查詢嵌套在step中

SELECT last_name
FROM employees e
WHERE e.`salary`>(
	SELECT e.salary Abel的工資
	FROM employees e
	WHERE e.last_name='Abel'
);

運行結果:

案例2:返回job_id與141號員工相同,salary比143號員工多的員工 姓名,job_id(多個子查詢)

step1:查詢141號員工的job_id

SELECT e.job_id
FROM employees e
WHERE e.`employee_id`=141;

step2:143號員工的工資

SELECT e.salary
FROM employees e
WHERE e.`employee_id`=143;

step3:將step1、step2的結果嵌套到step3中

SELECT e.last_name,e.job_id
FROM employees e
WHERE e.`job_id`=(
	SELECT e.job_id
	FROM employees e
	WHERE e.`employee_id`=141
)AND e.salary > (
	SELECT e.salary
	FROM employees e
	WHERE e.`employee_id`=143	
);

案例3:查詢最低工資大於50號部門最低工資的部門id和其最低工資(分組查詢+HAVING後子查詢)

SELECT department_id,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary)>( #篩選的時候注意是where還是having
	SELECT MIN(salary)
	FROM employees
	WHERE department_id=50
);

②列子查詢:

案例:返回location_id是1400或1700的部門中的所有員工姓名

SELECT e.last_name
FROM employees e
WHERE e.`department_id` IN(
	SELECT d.department_id
	FROM departments d
	WHERE d.`location_id` IN(1400,1700)
);

注意:IN 等價於=ANY ( ) , NOT IN 等價於<> ALL( ) 

③行子查詢:

案例:查詢員工編號最小並且工資最高的員工信息

SELECT * 
FROM employees
WHERE (employee_id,salary)=(
	SELECT MIN(employee_id),MAX(salary)
	FROM employees
);

SELECT *
FROM employees
WHERE employee_id=(
	SELECT MIN(employee_id)
	FROM employees
)AND salary=(
	SELECT MAX(salary)
	FROM employees
);

4、FROM後面的子查詢

含義:FROM後面跟的是表,所以子查詢的結果也應該是一張表。

注意:FROM後面的子查詢必須要起別名

案例:查詢每個部門的平均工資的工資等級

step1:查詢每個 部門的平均工資和部門編號

SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;

運行結果:

注意:運行結果是一張表

step2:根據step1得出的表,判斷工資等級

SELECT  ag_dep.*,g.`grade_level`
FROM (
	SELECT AVG(salary) ag,department_id
	FROM employees
	GROUP BY department_id
) ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;

5、SELECT後面子查詢(僅支持標量子查詢)

案例:查詢每個部門的員工個數 

SELECT d.*,(
	SELECT COUNT(*)
	FROM employees e
	WHERE d.`department_id`=e.department_id
)個數
FROM departments d;

6、EXITS後面的子查詢

語法:(返回值僅爲1/0,當括號中表不爲空時返回1,否則返回0)

SELECT EXISTS(SELECT * FROM employees);

案例:查詢有員工的部門名

SELECT department_name
FROM departments d
WHERE EXISTS(
	SELECT *
	FROM employees e
	WHERE e.`department_id`=d.`department_id`
);

三、分頁查詢

1、含義:從一張表中選出連續幾行數據要用到分頁查詢。

2、語法:

SELECT 查詢列表
FROM 表
【JOIN TYPE JOIN 表2
ON 連接條件
WHERE 篩選條件
GROUP BY 分組字段
HAVING 分組後的篩選
ORDER BY 排序的字段】
LIMIT 【OFFSET,】size;

注意:OFFESET:起始索引(默認從0開始) SIZE:總行數

案例1:有獎金的員工信息,顯示工資較高的前10名

step1:降序排列有獎金的員工信息

SELECT e.*
FROM employees e
WHERE e.`commission_pct` IS NOT NULL
ORDER BY e.`salary` DESC;

step2:將員工信息的前十條篩選出來

SELECT e.*
FROM employees e
WHERE e.`commission_pct` IS NOT NULL
ORDER BY e.`salary` DESC
LIMIT 0,10;

案例2:已知頁數page和每頁的行數size,寫出通式

SELECT 查詢列表
​FROM 表
​LIMIT (page-1)*size,size;

四、聯合查詢

1、優點:當多張表之間沒有連接條件時,使用UNION(聯合查詢)很方便。

2、語法:

查詢語句1
UNION
查詢語句2
UNION
……

注意:

①要求多條查詢語句的查詢列數一致且每條查詢語句都要完整(可單獨執行),非最後一條查詢條件不需要添加分號

最終顯示的字段名稱是第一條查詢條件中所查詢的內容,要保證所有查詢語句所查詢的內容一致且數目相等

UNION查詢默認去重,可使用UNION ALL來避免去重

案例1:查詢部門編號>90或郵箱包含a的員工信息

SELECT * FROM employees  WHERE email LIKE '%a%'
UNION
SELECT * FROM employees  WHERE department_id>90;

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

複習整理,如有錯誤請指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章