SQL多表聯(lián)查的幾種方法示例總結(jié)
1. 內(nèi)連接(INNER JOIN)
語法:
SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列名 = 表2.列名;
示例:
SELECT employees.name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.id;
2. 左外連接(LEFT JOIN)
語法:
SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列名 = 表2.列名;
示例:
SELECT employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.id;
3. 右外連接(RIGHT JOIN)
語法:
SELECT 列名 FROM 表1 RIGHT JOIN 表2 ON 表1.列名 = 表2.列名;
示例:
SELECT employees.name, departments.department_name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id;
4. 全外連接(FULL JOIN)
語法:
SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列名 = 表2.列名 UNION SELECT 列名 FROM 表1 RIGHT JOIN 表2 ON 表1.列名 = 表2.列名;
示例:
SELECT employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.id UNION SELECT employees.name, departments.department_name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id;
5. 交叉連接(CROSS JOIN)
語法:
SELECT 列名 FROM 表1 CROSS JOIN 表2;
示例:
SELECT employees.name, departments.department_name FROM employees CROSS JOIN departments;
6. 自連接(SELF JOIN)
自聯(lián)接(Self Join)是指一個表與自身進(jìn)行聯(lián)接。這種操作通常用于表中記錄之間的比較或關(guān)聯(lián)。自聯(lián)接可以幫助解決例如員工與其經(jīng)理的關(guān)系、產(chǎn)品與產(chǎn)品之間的關(guān)系等問題。
自連接查詢,可以是內(nèi)連接查詢,也可以是外連接查詢。
語法:
SELECT 列名1, 列名2, ... FROM 表名 AS 別名1 JOIN 表名 AS 別名2 ON 別名1.列名 = 別名2.列名 WHERE 條件;
示例:員工與經(jīng)理自聯(lián)接
假設(shè)我們有一個 employees
表,如下:
employees
表結(jié)構(gòu):
id | name | manager_id |
---|---|---|
1 | Alice | NULL |
2 | Bob | 1 |
3 | Carol | 1 |
4 | Dave | 2 |
查詢員工及其經(jīng)理的姓名:
SELECT employees.name AS employee_name, manager.name AS manager_name FROM employees LEFT JOIN employees AS manager ON employees.manager_id = manager.id;
7. 左外連接排除內(nèi)連接
定義:返回左表中所有記錄和右表中匹配的記錄,但排除那些在右表中也有匹配的記錄。
語法:
SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列名 = 表2.列名 WHERE 表2.列名 IS NULL;
示例:
SELECT employees.name FROM employees LEFT JOIN departments ON employees.department_id = departments.id WHERE departments.id IS NULL;
8. 右外連接排除內(nèi)連接
定義:返回右表中所有記錄和左表中匹配的記錄,但排除那些在左表中也有匹配的記錄。
語法:
SELECT 列名 FROM 表1 RIGHT JOIN 表2 ON 表1.列名 = 表2.列名 WHERE 表1.列名 IS NULL;
示例:
SELECT departments.department_name FROM departments RIGHT JOIN employees ON departments.id = employees.department_id WHERE employees.id IS NULL;
9. 全外連接排除內(nèi)連接
定義:返回兩個表的所有記錄,但排除那些在兩個表中都匹配的記錄。
語法:
SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列名 = 表2.列名 WHERE 表2.列名 IS NULL UNION SELECT 列名 FROM 表2 RIGHT JOIN 表1 ON 表2.列名 = 表1.列名 WHERE 表1.列名 IS NULL;
示例:
SELECT employees.name FROM employees LEFT JOIN departments ON employees.department_id = departments.id WHERE departments.id IS NULL UNION SELECT departments.department_name FROM departments RIGHT JOIN employees ON departments.id = employees.department_id WHERE employees.id IS NULL;
總結(jié)
- 內(nèi)連接:僅返回兩個表中匹配的記錄。
- 左外連接:返回左表的所有記錄和右表中匹配的記錄,右表中沒有匹配的記錄顯示為
NULL
。 - 右外連接:返回右表的所有記錄和左表中匹配的記錄,左表中沒有匹配的記錄顯示為
NULL
。 - 全外連接:返回兩個表的所有記錄,通過
UNION
模擬。 - 交叉連接:返回兩個表的笛卡爾積。
- 自連接:表與自身的聯(lián)接,常用于記錄間的比較。
- 左外連接排除內(nèi)連接:返回左表中的記錄,這些記錄在右表中沒有匹配項。
- 右外連接排除內(nèi)連接:返回右表中的記錄,這些記錄在左表中沒有匹配項。
- 全外連接排除內(nèi)連接:返回兩個表的所有記錄,排除那些在兩個表中都有匹配的記錄。
聯(lián)合查詢
聯(lián)合查詢(也稱為集合操作)用于將多個 SELECT
查詢的結(jié)果集合并在一起。
1. UNION
- 功能:將兩個或多個
SELECT
查詢的結(jié)果集合并為一個結(jié)果集,并去除重復(fù)行。 - 語法:
SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2;
注意:所有
SELECT
查詢必須具有相同數(shù)量的列,并且對應(yīng)列的類型應(yīng)兼容。
2. UNION ALL
- 功能:將兩個或多個
SELECT
查詢的結(jié)果集合并為一個結(jié)果集,包括所有重復(fù)行。 - 語法:
SELECT column1, column2 FROM table1 UNION ALL SELECT column1, column2 FROM table2;
注意:比
UNION
更高效,因為它不去重。
3. INTERSECT
- 功能:返回兩個
SELECT
查詢結(jié)果中的交集,即兩個查詢中都存在的行。 - 語法:
SELECT column1, column2 FROM table1 INTERSECT SELECT column1, column2 FROM table2;
- 注意:MySQL 8.0 及之前的版本不直接支持
INTERSECT
,可以使用INNER JOIN
來實現(xiàn)類似功能。
4. EXCEPT (或 MINUS)
- 功能:返回在第一個
SELECT
查詢中存在但在第二個SELECT
查詢中不存在的行。 - 語法:
SELECT column1, column2 FROM table1 EXCEPT SELECT column1, column2 FROM table2;
注意:MySQL 8.0 及之前的版本不直接支持
EXCEPT
??梢允褂?nbsp;LEFT JOIN
和IS NULL
實現(xiàn)類似功能。
三表聯(lián)查
定義:將三個表通過指定的連接條件聯(lián)接在一起,通常用于從多個表中獲取相關(guān)數(shù)據(jù)。
語法格式:
SELECT 列名1, 列名2, ... FROM 表1 JOIN 表2 ON 表1.列名 = 表2.列名 JOIN 表3 ON 表2.列名 = 表3.列名 WHERE 條件 GROUP BY 列名 HAVING 條件 ORDER BY 列名 [ASC|DESC] LIMIT n OFFSET m;
假設(shè)我們有以下三個表:
employees
(員工表):包含員工的基本信息。departments
(部門表):包含部門的信息。salaries
(薪資表):包含員工的薪資信息。
表結(jié)構(gòu)示例:
employees
表:
id | name | department_id |
---|---|---|
1 | Alice | 1 |
2 | Bob | 2 |
3 | Carol | 1 |
departments
表:
id | department_name |
---|---|
1 | HR |
2 | IT |
salaries
表:
employee_id | salary |
---|---|
1 | 70000 |
2 | 80000 |
3 | 75000 |
查詢語句:
SELECT employees.name, departments.department_name, salaries.salary FROM employees INNER JOIN departments ON employees.department_id = departments.id INNER JOIN salaries ON employees.id = salaries.employee_id; /* 解釋: INNER JOIN departments ON employees.department_id = departments.id: 將 employees 表與 departments 表通過 department_id 和 id 列進(jìn)行連接,提取部門名稱。 INNER JOIN salaries ON employees.id = salaries.employee_id: 將 employees 表與 salaries 表通過 id 和 employee_id 列進(jìn)行連接,提取薪資信息。 SELECT employees.name, departments.department_name, salaries.salary: 從連接后的結(jié)果中選擇員工姓名、部門名稱和薪資信息。 */
四表聯(lián)查
定義:將四個表通過指定的連接條件聯(lián)接在一起,用于從多個表中獲取更復(fù)雜的數(shù)據(jù)。
語法格式:
SELECT 列名1, 列名2, ... FROM 表1 JOIN 表2 ON 表1.列名 = 表2.列名 JOIN 表3 ON 表2.列名 = 表3.列名 JOIN 表4 ON 表3.列名 = 表4.列名 WHERE 條件 GROUP BY 列名 HAVING 條件 ORDER BY 列名 [ASC|DESC] LIMIT n OFFSET m;
四表聯(lián)查示例
假設(shè)我們有以下四個表:
employees
(員工表):包含員工的基本信息。departments
(部門表):包含部門的信息。salaries
(薪資表):包含員工的薪資信息。projects
(項目表):包含項目的信息。
表結(jié)構(gòu)示例:
employees
表:
id | name | department_id |
---|---|---|
1 | Alice | 1 |
2 | Bob | 2 |
3 | Carol | 1 |
departments
表:
id | department_name |
---|---|
1 | HR |
2 | IT |
salaries
表:
employee_id | salary |
---|---|
1 | 70000 |
2 | 80000 |
3 | 75000 |
projects
表:
project_id | project_name | department_id |
---|---|---|
1 | Project X | 1 |
2 | Project Y | 2 |
查詢語句:
SELECT employees.name, departments.department_name, salaries.salary, projects.project_name FROM employees INNER JOIN departments ON employees.department_id = departments.id INNER JOIN salaries ON employees.id = salaries.employee_id INNER JOIN projects ON departments.id = projects.department_id; /* 解釋: INNER JOIN departments ON employees.department_id = departments.id: 將 employees 表與 departments 表通過 department_id 和 id 列進(jìn)行連接,提取部門名稱。 INNER JOIN salaries ON employees.id = salaries.employee_id: 將 employees 表與 salaries 表通過 id 和 employee_id 列進(jìn)行連接,提取薪資信息。 INNER JOIN projects ON departments.id = projects.department_id: 將 departments 表與 projects 表通過 department_id 和 department_id 列進(jìn)行連接,提取項目名稱。 SELECT employees.name, departments.department_name, salaries.salary, projects.project_name: 從連接后的結(jié)果中選擇員工姓名、部門名稱、薪資信息和項目名稱。 */
總結(jié)
到此這篇關(guān)于SQL多表聯(lián)查的幾種方法的文章就介紹到這了,更多相關(guān)SQL多表聯(lián)查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql多表聯(lián)合查詢返回一張表的內(nèi)容實現(xiàn)代碼
- MySQL左聯(lián)多表查詢where條件寫法示例
- 詳解Mysql多表聯(lián)合查詢效率分析及優(yōu)化
- 淺談mysql中多表不關(guān)聯(lián)查詢的實現(xiàn)方法
- mysql多表聯(lián)合查詢操作實例分析
- mysql實現(xiàn)多表關(guān)聯(lián)統(tǒng)計(子查詢統(tǒng)計)示例
- MySQL 多表關(guān)聯(lián)一對多查詢實現(xiàn)取最新一條數(shù)據(jù)的方法示例
- SQL語句多表聯(lián)查的實現(xiàn)方法示例
- MySQL詳細(xì)講解多表關(guān)聯(lián)查詢
- SQL?多表聯(lián)合查詢的幾種方式詳解
相關(guān)文章
Windows環(huán)境MySQL全量備份+增量備份的實現(xiàn)
本文主要介紹了Windows環(huán)境MySQL全量備份+增量備份的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08解決xmapp啟動mysql出現(xiàn)Error: MySQL shutdown unexpec
這篇文章主要介紹了解決xmapp啟動mysql出現(xiàn)Error: MySQL shutdown unexpectedly.問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06MySql中流程控制函數(shù)/統(tǒng)計函數(shù)/分組查詢用法解析
這篇文章主要介紹了MySql中流程控制函數(shù)/統(tǒng)計函數(shù)/分組查詢用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07mysql技巧:提高插入數(shù)據(jù)(添加記錄)的速度
這篇文章主要介紹了mysql技巧:提高插入數(shù)據(jù)(添加記錄)的速度,需要的朋友可以參考下2014-12-12Mysql中g(shù)roup by 使用中發(fā)現(xiàn)的問題
當(dāng)使用MySQL的GROUP BY語句時,根據(jù)指定的列對結(jié)果進(jìn)行分組,這種情況通常是由于在 GROUP BY 中選擇的字段與其他非聚合字段不兼容,或者在 SELECT 子句中沒有正確使用聚合函數(shù)所導(dǎo)致的,本文給大家介紹Mysql中g(shù)roup by 使用中發(fā)現(xiàn)的問題,感興趣的朋友跟隨小編一起看看吧2024-06-06MySql用DATE_FORMAT截取DateTime字段的日期值
MySql截取DateTime字段的日期值可以使用DATE_FORMAT來格式化,使用方法如下2014-08-08解決Navicat for Mysql連接報錯1251的問題(連接失敗)
記得在之前給大家介紹過Navicat for Mysql連接報錯的問題,可能寫的不夠詳細(xì),今天在稍作修改補充下,對Navicat for Mysql連接報錯1251問題感興趣的朋友跟隨小編一起看看吧2021-05-05