MySQL多表查詢?cè)斀庀?/h1>
更新時(shí)間:2020年07月27日 17:33:58 作者:木卯生十木
這篇文章主要介紹了MySQL多表查詢?cè)斀庀?,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
好好吃飯,好好休息,聽(tīng)著很簡(jiǎn)單,實(shí)際落實(shí)缺失不那么容易。
繼續(xù)回顧MySql的多表查詢之1999語(yǔ)法
#二,SQL1999語(yǔ)法
語(yǔ)法:
SELECT 查詢列表
FROM 表1 別名 【連接類型】
JOIN 表2 別名
ON 鏈接條件
【W(wǎng)HERE 篩選條件】
【GROUP BY 分組】
【HAVING 篩選條件】
【ORDER BY 排序列表ASC|DESC】
分類(連接類型):
內(nèi)連接(★): INNER
外聯(lián)結(jié)
左外(★):LEFT 【OUTER】
右外(★):RIGHT 【OUTER】
全外:FULL 【OUTER】
交叉連接:CROSS
===============================================================================
一、內(nèi)連接
語(yǔ)法:
SELECT 查詢列表
FROM 表1 別名
INNER JOIN 表2 別名
ON 連接條件
【W(wǎng)HERE 篩選條件】
【GROUP BY 分組】
【HAVING 篩選分組】
【ORDER BY 排序列表 ASC|DESC】
分類:
等值
非等值
自連接
特點(diǎn):
①添加排序,分組,篩選
②INNER可以省略
③篩選條件放在WHERE后面,連接條件放在ON后面,提高分離性,便于閱
讀。
④INNER JOIN連接和SQL1992語(yǔ)法中的等值連接效果是一樣的,都是查
詢交集部分。
#1.等值連接
#案例1.查詢員工名,部門名。交換連接條件不影響結(jié)果。
SELECT last_name AS 員工名,department_name AS 部門名
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id;
SELECT last_name AS 員工名,department_name AS 部門名
FROM employees d
INNER JOIN departments e
ON e.department_id=d.department_id;

#案例2.查詢名字中包含e的員工和工種名(篩選)
SELECT last_name AS 員工名,job_title AS 工種名
FROM employees e
INNER JOIN jobs j
ON e.job_id=j.job_id
WHERE e.last_name LIKE '%e%';

#案例3.查詢部門個(gè)數(shù)>3的城市名和部門個(gè)數(shù)。(分組+篩選)
分步:先把每個(gè)城市的部門個(gè)數(shù)查出來(lái),在篩選滿足條件的。
SELECT city AS 城市,COUNT(*) AS 個(gè)數(shù)
FROM locations l
INNER JOIN departments d
ON l.location_id=d.location_id
GROUP BY city
HAVING COUNT(*) > 3;

#案例4.查詢哪個(gè)部門員工個(gè)數(shù)>3的部門名和員工個(gè)數(shù),并按個(gè)數(shù)降序排序。
分步:
1.查詢每個(gè)部門的員工個(gè)數(shù),
2.在上面的結(jié)果上篩選出員工數(shù)大于3的記錄,
3.把員工數(shù)排序
SELECT COUNT(*) AS 員工個(gè)數(shù),d.department_name AS 部門名
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id
GROUP BY d.department_name
HAVING COUNT(*) > 3
ORDER BY 員工個(gè)數(shù) DESC;

#案例5.查詢員工名,部門名,工種名,并按部門名降序。三表連接注意條件。
SELECT last_name AS 員工名,department_name AS 部門名,
job_title AS 工種名
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;

#2.非等值連接。范圍(間接)
#案例1.查詢員工的工資級(jí)別。
SELECT salary AS 月薪,grade_level AS 工資等級(jí)
FROM employees e
INNER JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;

#案例2.查詢每個(gè)工資的級(jí)別的個(gè)數(shù)>20,并且按降序排列。
SELECT j.grade_level AS 等級(jí),COUNT(*) 個(gè)數(shù)
FROM employees e
INNER JOIN job_grades j
ON e.salary BETWEEN j.lowest_sal AND j.highest_sal
GROUP BY j.grade_level
HAVING COUNT(*) > 20
ORDER BY 個(gè)數(shù) DESC;

#3.自連接
#案例1.查詢員工的名字,上級(jí)的名字。
SELECT e.last_name AS 員工名,m.last_name AS 上級(jí)名
FROM employees e
INNER JOIN employees m
ON e.manager_id=m.employee_id;

#案例2.查詢員工的名字,上級(jí)的名字,名字中包含字符k。
SELECT e.last_name AS 員工名,m.last_name AS 上級(jí)名
FROM employees e
INNER JOIN employees m
ON e.manager_id=m.employee_id
WHERE e.last_name LIKE '%k%';

#二,外連接
應(yīng)用場(chǎng)景:用于查詢一個(gè)表中有,另一個(gè)表沒(méi)有的記錄。
特點(diǎn):
1.外連接的查詢結(jié)果為主表中的所有記錄
如果從表中有和它匹配的,則顯示匹配的值
如果從表中沒(méi)有和它匹配的,則顯示null
外連接查詢結(jié)果=內(nèi)連接結(jié)果+主表中有而從表沒(méi)有的記錄
2.左外連接,LEFT JOIN左邊的是主表
右外連接,RIGHT JOIN右邊的是主表
3.左外和右外交換兩個(gè)表的順序,可以實(shí)現(xiàn)同樣的效果。
4.全外連接=內(nèi)連接的結(jié)果+表1中有但表2中沒(méi)有的+表2中有但表一沒(méi)有的(Mysql不支持)
引入:
SELECT * FROM beauty;
SELECT * FROM boys;

#引入:查詢男朋友不在男神表的女神名
SELECT b.NAME,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id=bo.id;

#左外連接
SELECT b.NAME,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;
#選從表中的主鍵列
#右外連接,得到同樣的結(jié)果。
SELECT b.NAME,bo.*
FROM boys bo
RIGHT OUTER JOIN beauty b
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;

#把beauty表中的id為10行的boyfriend_id從4改到6.才能查詢出如下結(jié)果。
SELECT b.*,bo.*
FROM boys bo
LEFT OUTER JOIN beauty b
ON b.boyfriend_id=bo.id
WHERE b.id IS NULL;

#案例1.哪個(gè)部門沒(méi)有員工。
#左外寫(xiě)法
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.department_id=e.department_id
WHERE e.department_id IS NULL;
==============================
#右外寫(xiě)法
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;

#全外連接查出的結(jié)果有三部分組成(舉例,Mysql不支持)語(yǔ)法結(jié)構(gòu)演示
先把兩張表的交集查出來(lái),在把缺失的填充查出來(lái),在把其他無(wú)關(guān)聯(lián)的查出來(lái)
語(yǔ)法結(jié)構(gòu)示例
SELECT b.*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.boyfriend_id=bo.id
#交叉連接,使用1999的語(yǔ)法標(biāo)準(zhǔn)實(shí)現(xiàn)的
笛卡爾乘積
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

#SQL1992語(yǔ)法 與 SQL 1999語(yǔ)法 相比
功能:SQL1999支持的較多
可讀性:SQL1999實(shí)現(xiàn)連接條件和篩選條件的分離,可讀性提高
總結(jié):

SELECT <select_list>
FROM A
INNER JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
LEFT JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
RIGHT JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
LEFT JOIN B
ON A.KEY=B.KEY
WHERE B.KEY IS NULL;

SELECT <select_list>
FROM A
RIGHT JOIN B
ON A.KEY=B.KEY
WHERE A.KEY IS NULL;

SELECT <select_list>
FROM A
FULL JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
FULL JOIN B
ON A.KEY=B.KEY
WHERE A.KEY IS NULL
OR B.KEY IS NULL;
簡(jiǎn)單的多表查詢已結(jié)束,相信看到這里的基本對(duì)簡(jiǎn)單多表連接應(yīng)該手到擒來(lái),至于看不懂的emmm...
用我們楊老師的話就是,自己去寫(xiě)個(gè)二三十遍就有感覺(jué)了。o(^▽^)o。
高考結(jié)束,大學(xué)生活的開(kāi)始,世界是屬于你們的倒計(jì)時(shí)開(kāi)啟了...不管你們選擇什么專業(yè),只要是你自己選擇的,一定要相信自己會(huì)在這個(gè)專業(yè)留下一筆....。
到此這篇關(guān)于MySQL多表查詢?cè)斀庀碌奈恼戮徒榻B到這了,更多相關(guān)MySQL多表查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
-
linux(Centos7)下安裝mysql8.0.18的教程圖解
這篇文章主要介紹了linux(Centos7)安裝mysql8.0.18的教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2019-11-11
-
MySQL使用ReplicationConnection導(dǎo)致連接失效解決
這篇文章主要為大家介紹了MySQL使用ReplicationConnection導(dǎo)致連接失效問(wèn)題分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪 2022-07-07
-
MySQL8.0無(wú)法啟動(dòng)3534的解決方法
本文主要是記錄一下自己使用MySQL的一次踩坑經(jīng)歷,我的MySQL安裝好后,使用一周后的同一時(shí)間必定報(bào)連接失敗,然后查找發(fā)現(xiàn)是MySQL本地服務(wù)沒(méi)有啟動(dòng),下面就詳細(xì)的介紹一下 2021-06-06
-
win10下mysql 5.7.17 zip壓縮包版安裝教程
這篇文章主要為大家詳細(xì)介紹了win10下mysql 5.7.17 zip壓縮包版安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2017-03-03
-
Mysql主鍵和唯一鍵的區(qū)別點(diǎn)總結(jié)
在本篇文章中小編給大家分享了關(guān)于Mysql主鍵和唯一鍵的區(qū)別,有興趣的朋友們學(xué)習(xí)下吧。 2019-02-02
最新評(píng)論
好好吃飯,好好休息,聽(tīng)著很簡(jiǎn)單,實(shí)際落實(shí)缺失不那么容易。
繼續(xù)回顧MySql的多表查詢之1999語(yǔ)法
#二,SQL1999語(yǔ)法 語(yǔ)法: SELECT 查詢列表 FROM 表1 別名 【連接類型】 JOIN 表2 別名 ON 鏈接條件 【W(wǎng)HERE 篩選條件】 【GROUP BY 分組】 【HAVING 篩選條件】 【ORDER BY 排序列表ASC|DESC】 分類(連接類型): 內(nèi)連接(★): INNER 外聯(lián)結(jié) 左外(★):LEFT 【OUTER】 右外(★):RIGHT 【OUTER】 全外:FULL 【OUTER】 交叉連接:CROSS
===============================================================================
一、內(nèi)連接 語(yǔ)法: SELECT 查詢列表 FROM 表1 別名 INNER JOIN 表2 別名 ON 連接條件 【W(wǎng)HERE 篩選條件】 【GROUP BY 分組】 【HAVING 篩選分組】 【ORDER BY 排序列表 ASC|DESC】 分類: 等值 非等值 自連接 特點(diǎn): ①添加排序,分組,篩選 ②INNER可以省略 ③篩選條件放在WHERE后面,連接條件放在ON后面,提高分離性,便于閱 讀。 ④INNER JOIN連接和SQL1992語(yǔ)法中的等值連接效果是一樣的,都是查 詢交集部分。
#1.等值連接 #案例1.查詢員工名,部門名。交換連接條件不影響結(jié)果。 SELECT last_name AS 員工名,department_name AS 部門名 FROM employees e INNER JOIN departments d ON e.department_id=d.department_id; SELECT last_name AS 員工名,department_name AS 部門名 FROM employees d INNER JOIN departments e ON e.department_id=d.department_id;
#案例2.查詢名字中包含e的員工和工種名(篩選) SELECT last_name AS 員工名,job_title AS 工種名 FROM employees e INNER JOIN jobs j ON e.job_id=j.job_id WHERE e.last_name LIKE '%e%';
#案例3.查詢部門個(gè)數(shù)>3的城市名和部門個(gè)數(shù)。(分組+篩選) 分步:先把每個(gè)城市的部門個(gè)數(shù)查出來(lái),在篩選滿足條件的。 SELECT city AS 城市,COUNT(*) AS 個(gè)數(shù) FROM locations l INNER JOIN departments d ON l.location_id=d.location_id GROUP BY city HAVING COUNT(*) > 3;
#案例4.查詢哪個(gè)部門員工個(gè)數(shù)>3的部門名和員工個(gè)數(shù),并按個(gè)數(shù)降序排序。 分步: 1.查詢每個(gè)部門的員工個(gè)數(shù), 2.在上面的結(jié)果上篩選出員工數(shù)大于3的記錄, 3.把員工數(shù)排序 SELECT COUNT(*) AS 員工個(gè)數(shù),d.department_name AS 部門名 FROM employees e INNER JOIN departments d ON e.department_id=d.department_id GROUP BY d.department_name HAVING COUNT(*) > 3 ORDER BY 員工個(gè)數(shù) DESC;
#案例5.查詢員工名,部門名,工種名,并按部門名降序。三表連接注意條件。 SELECT last_name AS 員工名,department_name AS 部門名, job_title AS 工種名 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;
#2.非等值連接。范圍(間接) #案例1.查詢員工的工資級(jí)別。 SELECT salary AS 月薪,grade_level AS 工資等級(jí) FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;
#案例2.查詢每個(gè)工資的級(jí)別的個(gè)數(shù)>20,并且按降序排列。 SELECT j.grade_level AS 等級(jí),COUNT(*) 個(gè)數(shù) FROM employees e INNER JOIN job_grades j ON e.salary BETWEEN j.lowest_sal AND j.highest_sal GROUP BY j.grade_level HAVING COUNT(*) > 20 ORDER BY 個(gè)數(shù) DESC;
#3.自連接 #案例1.查詢員工的名字,上級(jí)的名字。 SELECT e.last_name AS 員工名,m.last_name AS 上級(jí)名 FROM employees e INNER JOIN employees m ON e.manager_id=m.employee_id;
#案例2.查詢員工的名字,上級(jí)的名字,名字中包含字符k。 SELECT e.last_name AS 員工名,m.last_name AS 上級(jí)名 FROM employees e INNER JOIN employees m ON e.manager_id=m.employee_id WHERE e.last_name LIKE '%k%';
#二,外連接 應(yīng)用場(chǎng)景:用于查詢一個(gè)表中有,另一個(gè)表沒(méi)有的記錄。 特點(diǎn): 1.外連接的查詢結(jié)果為主表中的所有記錄 如果從表中有和它匹配的,則顯示匹配的值 如果從表中沒(méi)有和它匹配的,則顯示null 外連接查詢結(jié)果=內(nèi)連接結(jié)果+主表中有而從表沒(méi)有的記錄 2.左外連接,LEFT JOIN左邊的是主表 右外連接,RIGHT JOIN右邊的是主表 3.左外和右外交換兩個(gè)表的順序,可以實(shí)現(xiàn)同樣的效果。 4.全外連接=內(nèi)連接的結(jié)果+表1中有但表2中沒(méi)有的+表2中有但表一沒(méi)有的(Mysql不支持)
引入: SELECT * FROM beauty; SELECT * FROM boys;
#引入:查詢男朋友不在男神表的女神名 SELECT b.NAME,bo.* FROM beauty b LEFT OUTER JOIN boys bo ON b.boyfriend_id=bo.id;
#左外連接 SELECT b.NAME,bo.* FROM beauty b LEFT OUTER JOIN boys bo ON b.boyfriend_id=bo.id WHERE bo.id IS NULL; #選從表中的主鍵列
#右外連接,得到同樣的結(jié)果。 SELECT b.NAME,bo.* FROM boys bo RIGHT OUTER JOIN beauty b ON b.boyfriend_id=bo.id WHERE bo.id IS NULL;
#把beauty表中的id為10行的boyfriend_id從4改到6.才能查詢出如下結(jié)果。 SELECT b.*,bo.* FROM boys bo LEFT OUTER JOIN beauty b ON b.boyfriend_id=bo.id WHERE b.id IS NULL;
#案例1.哪個(gè)部門沒(méi)有員工。 #左外寫(xiě)法 SELECT d.*,e.employee_id FROM departments d LEFT OUTER JOIN employees e ON d.department_id=e.department_id WHERE e.department_id IS NULL; ============================== #右外寫(xiě)法 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;
#全外連接查出的結(jié)果有三部分組成(舉例,Mysql不支持)語(yǔ)法結(jié)構(gòu)演示 先把兩張表的交集查出來(lái),在把缺失的填充查出來(lái),在把其他無(wú)關(guān)聯(lián)的查出來(lái) 語(yǔ)法結(jié)構(gòu)示例 SELECT b.*,bo.* FROM beauty b FULL OUTER JOIN boys bo ON b.boyfriend_id=bo.id
#交叉連接,使用1999的語(yǔ)法標(biāo)準(zhǔn)實(shí)現(xiàn)的 笛卡爾乘積 SELECT b.*,bo.* FROM beauty b CROSS JOIN boys bo;
#SQL1992語(yǔ)法 與 SQL 1999語(yǔ)法 相比 功能:SQL1999支持的較多 可讀性:SQL1999實(shí)現(xiàn)連接條件和篩選條件的分離,可讀性提高
總結(jié):
SELECT <select_list> FROM A INNER JOIN B ON A.KEY=B.KEY;
SELECT <select_list> FROM A LEFT JOIN B ON A.KEY=B.KEY;
SELECT <select_list> FROM A RIGHT JOIN B ON A.KEY=B.KEY;
SELECT <select_list> FROM A LEFT JOIN B ON A.KEY=B.KEY WHERE B.KEY IS NULL;
SELECT <select_list> FROM A RIGHT JOIN B ON A.KEY=B.KEY WHERE A.KEY IS NULL;
SELECT <select_list> FROM A FULL JOIN B ON A.KEY=B.KEY;
SELECT <select_list> FROM A FULL JOIN B ON A.KEY=B.KEY WHERE A.KEY IS NULL OR B.KEY IS NULL;
簡(jiǎn)單的多表查詢已結(jié)束,相信看到這里的基本對(duì)簡(jiǎn)單多表連接應(yīng)該手到擒來(lái),至于看不懂的emmm...
用我們楊老師的話就是,自己去寫(xiě)個(gè)二三十遍就有感覺(jué)了。o(^▽^)o。
高考結(jié)束,大學(xué)生活的開(kāi)始,世界是屬于你們的倒計(jì)時(shí)開(kāi)啟了...不管你們選擇什么專業(yè),只要是你自己選擇的,一定要相信自己會(huì)在這個(gè)專業(yè)留下一筆....。
到此這篇關(guān)于MySQL多表查詢?cè)斀庀碌奈恼戮徒榻B到這了,更多相關(guān)MySQL多表查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
linux(Centos7)下安裝mysql8.0.18的教程圖解
這篇文章主要介紹了linux(Centos7)安裝mysql8.0.18的教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11MySQL使用ReplicationConnection導(dǎo)致連接失效解決
這篇文章主要為大家介紹了MySQL使用ReplicationConnection導(dǎo)致連接失效問(wèn)題分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07MySQL8.0無(wú)法啟動(dòng)3534的解決方法
本文主要是記錄一下自己使用MySQL的一次踩坑經(jīng)歷,我的MySQL安裝好后,使用一周后的同一時(shí)間必定報(bào)連接失敗,然后查找發(fā)現(xiàn)是MySQL本地服務(wù)沒(méi)有啟動(dòng),下面就詳細(xì)的介紹一下2021-06-06win10下mysql 5.7.17 zip壓縮包版安裝教程
這篇文章主要為大家詳細(xì)介紹了win10下mysql 5.7.17 zip壓縮包版安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Mysql主鍵和唯一鍵的區(qū)別點(diǎn)總結(jié)
在本篇文章中小編給大家分享了關(guān)于Mysql主鍵和唯一鍵的區(qū)別,有興趣的朋友們學(xué)習(xí)下吧。2019-02-02