MySQL 多表聯(lián)合查詢與數(shù)據(jù)備份恢復(fù)全攻略
MySQL 多表聯(lián)合查詢與數(shù)據(jù)備份恢復(fù)全指南

在關(guān)系型數(shù)據(jù)庫中,表與表通過外鍵等關(guān)聯(lián)字段建立聯(lián)系,實(shí)際業(yè)務(wù)場景常需同時(shí)查詢多個(gè)表的關(guān)聯(lián)數(shù)據(jù),這就需要多表聯(lián)合查詢。此外,數(shù)據(jù)安全是數(shù)據(jù)庫管理的核心,定期備份與高效恢復(fù)是保障數(shù)據(jù)不丟失的關(guān)鍵。本文將系統(tǒng)講解 MySQL 多表聯(lián)合查詢的5種核心方式(交叉連接、內(nèi)連接、外連接、分組查詢、子查詢),并詳細(xì)說明數(shù)據(jù)庫備份與恢復(fù)的完整流程,包含實(shí)戰(zhàn)案例與效果驗(yàn)證。
一、多表聯(lián)合查詢基礎(chǔ)
1. 什么是多表聯(lián)合查詢
前面講解的查詢語句均針對單個(gè)表,但關(guān)系型數(shù)據(jù)庫中表與表存在業(yè)務(wù)關(guān)聯(lián)(如“學(xué)生表”與“課程表”通過“課程ID”關(guān)聯(lián)),多表聯(lián)合查詢即同時(shí)查詢兩個(gè)或兩個(gè)以上的表,通過關(guān)聯(lián)條件提取整合數(shù)據(jù),滿足復(fù)雜業(yè)務(wù)需求(如“查詢學(xué)生姓名及對應(yīng)課程名稱”)。
在 MySQL 中,多表查詢主要分為 交叉連接、內(nèi)連接、外連接、分組查詢、子查詢 5種,核心是通過“關(guān)聯(lián)條件”消除無效數(shù)據(jù),確保查詢結(jié)果的準(zhǔn)確性與實(shí)用性。
二、多表聯(lián)合查詢的5種方式
1. 交叉連接(CROSS JOIN)——笛卡爾積查詢
交叉連接是最基礎(chǔ)的多表查詢方式,分為顯式交叉連接和隱式交叉連接,核心是返回兩張表的“笛卡爾積”,但實(shí)際應(yīng)用中需謹(jǐn)慎使用(易產(chǎn)生大量無效數(shù)據(jù))。
(1)核心概念:笛卡爾積
笛卡爾積(Cartesian product)是數(shù)學(xué)中兩個(gè)集合的乘積,表與表的交叉連接本質(zhì)就是計(jì)算笛卡爾積:
- 假設(shè)集合 A = {1,2},集合 B = {3,4,5};
- 笛卡爾積 A×B = {(1,3), (1,4), (1,5), (2,3), (2,4), (2,5)};
- 表的笛卡爾積:結(jié)果行數(shù) = 表1行數(shù) × 表2行數(shù),字段數(shù) = 表1字段數(shù) + 表2字段數(shù)。
注意:笛卡爾積不滿足交換律(A×B ≠ B×A),且包含大量無業(yè)務(wù)意義的數(shù)據(jù)(如“學(xué)生A對應(yīng)所有課程”),需通過 WHERE 子句篩選有效數(shù)據(jù)。
(2)語法格式
-- 顯式交叉連接(官方推薦) SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE 子句]; -- 隱式交叉連接(逗號分隔表名) SELECT <字段名> FROM <表1>, <表2> [WHERE 子句];
- 字段名:可指定表別名(如
表1.字段1 AS 別名),避免字段名重復(fù); - WHERE 子句:可選,用于篩選笛卡爾積中的有效數(shù)據(jù)(無此子句則返回完整笛卡爾積)。
(3)實(shí)戰(zhàn)案例
以“學(xué)生信息表(tb_students_info)”和“課程表(tb_course)”為例,演示交叉連接的使用:
步驟1:創(chuàng)建并查看兩張表的原始數(shù)據(jù):
mysql> create database xuexiao;
Query OK, 1 row affected (0.00 sec)
mysql> use xuexiao;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS tb_course (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> course_name VARCHAR(50) NOT NULL
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS tb_students_info(
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(50) NOT NULL,
-> age INT,
-> sex VARCHAR(10),
-> height INT,
-> course_id INT,
-> FOREIGN KEY (course_id) REFERENCES tb_course(id)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO tb_course (course_name) VALUES
-> ('Java'),('MySQL'),('Python'),('Go'),('C++');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE tb_students_info
-> MODIFY COLUMN sex VARCHAR(10)
-> CHARACTER SET utf8mb4
-> COLLATE utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> INSERT INTO tb_students_info (name, age, sex, height, course_id) VALUES
-> ('Dany', 25, '男', 160, 1),
-> ('Green', 23, '男', 158, 2),
-> ('Henry', 23, '女', 185, 1),
-> ('Jane', 22, '男', 162, 3),
-> ('Jim', 24, '女', 175, 2),
-> ('John', 21, '女', 172, 4),
-> ('Lily', 22, '男', 165, 4),
-> ('Susan', 23, '男', 170, 5),
-> ('Thomas', 22, '女', 178, 5),
-> ('Tom', 23, '女', 165, 5);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE tb_students_info
-> MODIFY COLUMN sex VARCHAR(10)
-> CHARACTER SET utf8mb4
-> COLLATE utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0-- 查看學(xué)生信息表 mysql> SELECT * FROM tb_students_info; +----+--------+------+------+--------+-----------+ | id | name | age | sex | height | course_id | -- course_id:關(guān)聯(lián)課程表的外鍵 +----+--------+------+------+--------+-----------+ | 1 | Dany | 25 | 男 | 160 | 1 | | 2 | Green | 23 | 男 | 158 | 2 | | 3 | Henry | 23 | 女 | 185 | 1 | | 4 | Jane | 22 | 男 | 162 | 3 | | 5 | Jim | 24 | 女 | 175 | 2 | | 6 | John | 21 | 女 | 172 | 4 | | 7 | Lily | 22 | 男 | 165 | 4 | | 8 | Susan | 23 | 男 | 170 | 5 | | 9 | Thomas | 22 | 女 | 178 | 5 | | 10 | Tom | 23 | 女 | 165 | 5 | +----+--------+------+------+--------+-----------+ 10 rows in set (0.00 sec) -- 查看課程表 mysql> SELECT * FROM tb_course; +----+-------------+ | id | course_name | -- id:主鍵,與學(xué)生表的 course_id 關(guān)聯(lián) +----+-------------+ | 1 | Java | | 2 | MySQL | | 3 | Python | | 4 | Go | | 5 | C++ | +----+-------------+ 5 rows in set (0.00 sec)
步驟2:查詢完整笛卡爾積(無 WHERE 子句)
mysql> SELECT * FROM tb_course CROSS JOIN tb_students_info;
+----+-------------+----+--------+------+------+--------+-----------+
| id | course_name | id | name | age | sex | height | course_id |
+----+-------------+----+--------+------+------+--------+-----------+
| 1 | Java | 1 | Dany | 25 | 男 | 160 | 1 |
| 2 | MySQL | 1 | Dany | 25 | 男 | 160 | 1 |
| 3 | Python | 1 | Dany | 25 | 男 | 160 | 1 |
| 4 | Go | 1 | Dany | 25 | 男 | 160 | 1 |
| 5 | C++ | 1 | Dany | 25 | 男 | 160 | 1 |
*****省略中間 40 行******
| 5 | C++ | 10 | Tom | 23 | 女 | 165 | 5 |
+----+-------------+----+--------+------+------+--------+-----------+
50 rows in set (0.00 sec)
結(jié)果分析:返回 10×5=50 行數(shù)據(jù),包含大量無效關(guān)聯(lián)(如“Dany 對應(yīng)所有課程”),實(shí)際業(yè)務(wù)中幾乎不用此方式。
步驟3:帶 WHERE 子句的交叉連接(篩選有效數(shù)據(jù))
通過 WHERE 子句匹配“課程表 id”與“學(xué)生表 course_id”,消除無效數(shù)據(jù):
mysql> SELECT * FROM tb_course CROSS JOIN tb_students_info
-> WHERE tb_students_info.course_id = tb_course.id;
+----+-------------+----+--------+------+------+--------+-----------+
| id | course_name | id | name | age | sex | height | course_id |
+----+-------------+----+--------+------+------+--------+-----------+
| 1 | Java | 1 | Dany | 25 | 男 | 160 | 1 |
| 1 | Java | 3 | Henry | 23 | 女 | 185 | 1 |
| 2 | MySQL | 2 | Green | 23 | 男 | 158 | 2 |
| 2 | MySQL | 5 | Jim | 24 | 女 | 175 | 2 |
| 3 | Python | 4 | Jane | 22 | 男 | 162 | 3 |
| 4 | Go | 6 | John | 21 | 女 | 172 | 4 |
| 4 | Go | 7 | Lily | 22 | 男 | 165 | 4 |
| 5 | C++ | 8 | Susan | 23 | 男 | 170 | 5 |
| 5 | C++ | 9 | Thomas | 22 | 女 | 178 | 5 |
| 5 | C++ | 10 | Tom | 23 | 女 | 165 | 5 |
+----+-------------+----+--------+------+------+--------+-----------+
10 rows in set (0.00 sec)結(jié)果分析:僅返回 10 行有效數(shù)據(jù),與學(xué)生表行數(shù)一致,實(shí)現(xiàn)“學(xué)生-課程”的正確關(guān)聯(lián)。
(4)注意事項(xiàng)
- 交叉連接效率低:MySQL 會先生成完整笛卡爾積,再篩選有效數(shù)據(jù),表數(shù)據(jù)量大時(shí)(如各1000行)會產(chǎn)生 100萬行臨時(shí)數(shù)據(jù),嚴(yán)重影響性能;
- 替代方案:實(shí)際多表查詢優(yōu)先使用“內(nèi)連接”或“外連接”,效率更高且語法更清晰。
2. 內(nèi)連接(INNER JOIN)——篩選匹配數(shù)據(jù)
內(nèi)連接是最常用的多表查詢方式,通過 INNER JOIN 關(guān)鍵字和 ON 子句設(shè)置關(guān)聯(lián)條件,僅返回兩張表中滿足關(guān)聯(lián)條件的記錄,自動(dòng)消除無效數(shù)據(jù),無需手動(dòng)篩選笛卡爾積。
(1)核心邏輯
內(nèi)連接的本質(zhì)是“交集查詢”:僅保留表1和表2中“關(guān)聯(lián)字段值相等”的記錄,不滿足條件的記錄(如“無對應(yīng)課程的學(xué)生”“無學(xué)生的課程”)會被過濾。
(2)語法格式
SELECT <字段名> FROM <表1> INNER JOIN <表2> ON <關(guān)聯(lián)條件>; -- 簡化寫法:INNER 可省略,直接用 JOIN SELECT <字段名> FROM <表1> JOIN <表2> ON <關(guān)聯(lián)條件>;
ON 子句:必選,用于定義表間關(guān)聯(lián)條件(如表1.外鍵 = 表2.主鍵),優(yōu)先級高于WHERE子句;- 多表內(nèi)連接:連續(xù)使用
JOIN即可,如表1 JOIN 表2 ON 條件1 JOIN 表3 ON 條件2。
(3)實(shí)戰(zhàn)案例:查詢學(xué)生姓名及對應(yīng)課程名稱
需求:從 tb_students_info 和 tb_course 中,查詢學(xué)生姓名(name)及對應(yīng)課程名稱(course_name),關(guān)聯(lián)條件為“學(xué)生表 course_id = 課程表 id”。
-- 給表設(shè)置別名(s 代表學(xué)生表,c 代表課程表),簡化語法
mysql> SELECT s.name, c.course_name
-> FROM tb_students_info s
-> INNER JOIN tb_course c
-> ON s.course_id = c.id;
+--------+-------------+
| name | course_name |
+--------+-------------+
| Dany | Java |
| Henry | Java |
| Green | MySQL |
| Jim | MySQL |
| Jane | Python |
| John | Go |
| Lily | Go |
| Susan | C++ |
| Thomas | C++ |
| Tom | C++ |
+--------+-------------+
10 rows in set (0.00 sec)(4)關(guān)鍵說明
- 表別名:當(dāng)表名較長時(shí),用
表名 別名簡化寫法(如tb_students_info s),后續(xù)通過“別名.字段”引用字段; - 字段唯一性:若兩張表有同名字段(如
id),需顯式指定表名或別名(如s.id或c.id),避免歧義; - 效率優(yōu)勢:內(nèi)連接直接按關(guān)聯(lián)條件匹配數(shù)據(jù),無需生成完整笛卡爾積,效率遠(yuǎn)高于交叉連接。
3. 外連接(LEFT/RIGHT JOIN)——保留部分表的全部數(shù)據(jù)
內(nèi)連接僅返回“雙方匹配”的記錄,而外連接會以一張表為“基表”,保留基表的全部記錄,另一張表(參考表)匹配不到的記錄用 NULL 填充,適用于“需保留所有基表數(shù)據(jù)”的場景(如“查詢所有學(xué)生,包括無課程的學(xué)生”)。
外連接分為 左外連接(LEFT JOIN) 和 右外連接(RIGHT JOIN),核心區(qū)別是“基表的選擇”。
(1)左外連接(LEFT OUTER JOIN)
- 定義:以
LEFT JOIN左側(cè)的表為基表,保留基表的全部記錄,右側(cè)表(參考表)匹配到則顯示對應(yīng)數(shù)據(jù),匹配不到則字段值為NULL; - 語法:
SELECT 字段 FROM 基表 LEFT OUTER JOIN 參考表 ON 關(guān)聯(lián)條件;(OUTER可省略,簡化為LEFT JOIN); - 核心場景:需保留左側(cè)表的所有數(shù)據(jù)(如“查詢所有學(xué)生,包括無課程的學(xué)生”)。
實(shí)戰(zhàn)案例:查詢所有學(xué)生及對應(yīng)課程(含無課程的學(xué)生)
步驟1:先添加“無課程的學(xué)生”(course_id=7,課程表無 id=7 的課程):
-- 臨時(shí)禁用外鍵約束
ysql> SET FOREIGN_KEY_CHECKS=0;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO tb_students_info (name, age, sex, height, course_id)
-> VALUES ('LiMing', 22, '男', 180, 7);
Query OK, 1 row affected (0.01 sec)
-- 恢復(fù)外鍵約束
mysql> SET FOREIGN_KEY_CHECKS=1;
Query OK, 0 rows affected (0.00 sec)步驟2:執(zhí)行左外連接查詢:
mysql> SELECT s.name, c.course_name
-> FROM tb_students_info s
-> LEFT JOIN tb_course c
-> ON s.course_id = c.id;
+--------+-------------+
| name | course_name |
+--------+-------------+
| Dany | Java |
| Henry | Java |
| Green | MySQL |
| Jim | MySQL |
| Jane | Python |
| John | Go |
| Lily | Go |
| Susan | C++ |
| Thomas | C++ |
| Tom | C++ |
| LiMing | C++ |
| LiMing | NULL | # 無對應(yīng)課程,course_name 為null
+--------+-------------+
12 rows in set (0.00 sec)結(jié)果分析:基表(學(xué)生表)的 11 條記錄全部保留,LiMing 因無對應(yīng)課程,課程名稱顯示 NULL。
(2)右外連接(RIGHT OUTER JOIN)
- 定義:以
RIGHT JOIN右側(cè)的表為基表,保留基表的全部記錄,左側(cè)表(參考表)匹配不到則字段值為NULL; - 語法:
SELECT 字段 FROM 參考表 RIGHT OUTER JOIN 基表 ON 關(guān)聯(lián)條件;(OUTER可省略,簡化為RIGHT JOIN); - 核心場景:需保留右側(cè)表的所有數(shù)據(jù)(如“查詢所有課程,包括無學(xué)生的課程”)。
實(shí)戰(zhàn)案例:查詢所有課程及對應(yīng)學(xué)生(含無學(xué)生的課程)
步驟1:先添加“無學(xué)生的課程”(id=6,學(xué)生表無 course_id=6 的記錄):
mysql> INSERT INTO tb_course (id, course_name)
-> VALUES (6, 'HTML');
Query OK, 1 row affected (0.00 sec)
步驟2:執(zhí)行右外連接查詢:
mysql> SELECT s.name, c.course_name
-> FROM tb_students_info s
-> RIGHT JOIN tb_course c
-> ON s.course_id = c.id;
+--------+-------------+
| name | course_name |
+--------+-------------+
| Dany | Java |
| Henry | Java |
| Green | MySQL |
| Jim | MySQL |
| Jane | Python |
| John | Go |
| Lily | Go |
| Susan | C++ |
| Thomas | C++ |
| Tom | C++ |
| LiMing | C++ |
| NULL | HTML |
+--------+-------------+
12 rows in set (0.01 sec)
結(jié)果分析:基表(課程表)的 6 條記錄全部保留,HTML 課程因無學(xué)生,學(xué)生姓名顯示 NULL。
(3)外連接的關(guān)鍵區(qū)別
| 連接類型 | 基表 | 保留數(shù)據(jù) | 參考表匹配不到時(shí) | 適用場景 |
|---|---|---|---|---|
| 左外連接 | LEFT 左側(cè)表 | 左側(cè)表全部記錄 | 右側(cè)表字段為 NULL | 保留左側(cè)表所有數(shù)據(jù) |
| 右外連接 | RIGHT 右側(cè)表 | 右側(cè)表全部記錄 | 左側(cè)表字段為 NULL | 保留右側(cè)表所有數(shù)據(jù) |
4. 分組查詢(GROUP BY)——按字段分組統(tǒng)計(jì)
分組查詢通過 GROUP BY 關(guān)鍵字,按一個(gè)或多個(gè)字段對查詢結(jié)果分組,常與 聚合函數(shù)(如 COUNT()、SUM())結(jié)合,實(shí)現(xiàn)數(shù)據(jù)統(tǒng)計(jì)(如“按性別統(tǒng)計(jì)學(xué)生人數(shù)”)。
(1)核心語法
SELECT <分組字段>, <聚合函數(shù)> FROM <表名> [JOIN <關(guān)聯(lián)表> ON <條件>] [WHERE <篩選條件>] GROUP BY <分組字段> [WITH ROLLUP];
- 聚合函數(shù):
COUNT()(統(tǒng)計(jì)行數(shù))、SUM()(求和)、AVG()(平均值)、MAX()(最大值)、MIN()(最小值); WITH ROLLUP:可選,在所有分組后追加一行“總計(jì)”記錄;- 執(zhí)行順序:
WHERE(篩選行)→GROUP BY(分組)→ 聚合函數(shù)(統(tǒng)計(jì))。
(2)實(shí)戰(zhàn)案例
案例1:按性別分組,統(tǒng)計(jì)學(xué)生人數(shù)
mysql> SELECT sex, COUNT(*) AS student_count
-> FROM tb_students_info
-> GROUP BY sex;
+------+---------------+
| sex | student_count |
+------+---------------+
| 女 | 5 |
| 男 | 6 |
+------+---------------+
2 rows in set (0.00 sec)案例2:按性別分組,顯示每組學(xué)生姓名(GROUP_CONCAT())
GROUP_CONCAT() 函數(shù)可將分組內(nèi)的指定字段值拼接為字符串:
mysql> SELECT sex, GROUP_CONCAT(name) AS student_names
-> FROM tb_students_info
-> GROUP BY sex;
+------+----------------------------------------+
| sex | student_names |
+------+----------------------------------------+
| 女 | Henry,Jim,John,Thomas,Tom |
| 男 | Dany,Green,Jane,Lily,Susan,LiMing |
+------+----------------------------------------+
2 rows in set (0.00 sec)
案例3:按“年齡+性別”多字段分組
多字段分組時(shí),先按第一個(gè)字段分組,第一個(gè)字段值相同時(shí)再按第二個(gè)字段分組:
mysql> SELECT age, sex, GROUP_CONCAT(name) AS student_names
-> FROM tb_students_info
-> GROUP BY age, sex;
+------+------+------------------+
| age | sex | student_names |
+------+------+------------------+
| 21 | 女 | John |
| 22 | 女 | Thomas |
| 22 | 男 | Jane,Lily,LiMing |
| 23 | 女 | Henry,Tom |
| 23 | 男 | Green,Susan |
| 24 | 女 | Jim |
| 25 | 男 | Dany |
+------+------+------------------+
7 rows in set (0.00 sec)
案例4:分組后添加總計(jì)(WITH ROLLUP)
mysql> SELECT sex, COUNT(*) AS student_count
-> FROM tb_students_info
-> GROUP BY sex WITH ROLLUP;
+------+---------------+
| sex | student_count |
+------+---------------+
| 女 | 5 |
| 男 | 6 |
| NULL | 11 |
+------+---------------+
3 rows in set (0.00 sec)
5. 子查詢——嵌套查詢實(shí)現(xiàn)復(fù)雜邏輯
子查詢(嵌套查詢)是將一個(gè)查詢語句(子查詢)嵌套在另一個(gè)查詢語句(父查詢)中,子查詢的結(jié)果作為父查詢的條件或數(shù)據(jù)源,適用于“需先獲取中間結(jié)果”的復(fù)雜場景(如“查詢學(xué)習(xí) Java 課程的學(xué)生姓名”)。
(1)核心語法
子查詢常位于 WHERE 子句中,格式如下:
SELECT <父查詢字段> FROM <父查詢表> WHERE <表達(dá)式> <操作符> (子查詢);
- 操作符:支持
IN/NOT IN(匹配子查詢結(jié)果集中的值)、EXISTS/NOT EXISTS(判斷子查詢結(jié)果集是否為空)、=/<>(等于/不等于子查詢結(jié)果,子查詢需返回單行單列)。
(2)實(shí)戰(zhàn)案例
案例1:查詢學(xué)習(xí) Java 課程的學(xué)生姓名(IN 關(guān)鍵字)
需求:先查詢“Java 課程的 id”,再根據(jù) id 查詢對應(yīng)學(xué)生姓名。
-- 子查詢:獲取 Java 課程的 id
mysql> SELECT id FROM tb_course WHERE course_name = 'Java';
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
-- 父查詢:根據(jù) id=1 查詢學(xué)生姓名
mysql> SELECT name
-> FROM tb_students_info
-> WHERE course_id IN (SELECT id FROM tb_course WHERE course_name = 'Java');
+-------+
| name |
+-------+
| Dany |
| Henry |
+-------+
2 rows in set (0.01 sec)
案例2:查詢沒有學(xué)習(xí) Java 課程的學(xué)生姓名(NOT IN 關(guān)鍵字)
mysql> SELECT name
-> FROM tb_students_info
-> WHERE course_id NOT IN (SELECT id FROM tb_course WHERE course_name = 'Java');
+--------+
| name |
+--------+
| Green |
| Jane |
| Jim |
| John |
| Lily |
| Susan |
| Thomas |
| Tom |
| LiMing |
+--------+
9 rows in set (0.00 sec)案例3:判斷課程是否存在,再查詢學(xué)生(EXISTS 關(guān)鍵字)
EXISTS 僅判斷子查詢結(jié)果集是否為空(不為空則返回 TRUE,為空則返回 FALSE),不關(guān)心具體值:
-- 若存在 id=1 的課程(Java),則查詢所有學(xué)生
mysql> SELECT *
-> FROM tb_students_info
-> WHERE EXISTS (SELECT course_name FROM tb_course WHERE id=1);
+----+--------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+--------+------+------+--------+-----------+
| 1 | Dany | 25 | 男 | 160 | 1 |
| 2 | Green | 23 | 男 | 158 | 2 |
| 3 | Henry | 23 | 女 | 185 | 1 |
| 4 | Jane | 22 | 男 | 162 | 3 |
| 5 | Jim | 24 | 女 | 175 | 2 |
| 6 | John | 21 | 女 | 172 | 4 |
| 7 | Lily | 22 | 男 | 165 | 4 |
| 8 | Susan | 23 | 男 | 170 | 5 |
| 9 | Thomas | 22 | 女 | 178 | 5 |
| 10 | Tom | 23 | 女 | 165 | 5 |
| 15 | LiMing | 22 | 男 | 180 | 7 |
+----+--------+------+------+--------+-----------+
11 rows in set (0.00 sec)案例4:多條件結(jié)合 EXISTS(查詢年齡>24 的學(xué)生)
mysql> SELECT *
-> FROM tb_students_info
-> WHERE age>24 AND EXISTS (SELECT course_name FROM tb_course WHERE id=1);
+----+------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+------+------+------+--------+-----------+
| 1 | Dany | 25 | 男 | 160 | 1 |
+----+------+------+------+--------+-----------+
1 row in set (0.01 sec)
(3)子查詢 vs 表連接
- 子查詢:語法更直觀,適合“先獲取中間結(jié)果”的場景(如先查課程 id 再查學(xué)生),但多層嵌套時(shí)效率可能較低;
- 表連接:效率更高,適合“直接關(guān)聯(lián)表獲取數(shù)據(jù)”的場景(如學(xué)生表 join 課程表),但復(fù)雜邏輯時(shí)可讀性較差;
- 選擇原則:簡單關(guān)聯(lián)用表連接,復(fù)雜中間邏輯用子查詢。
到此這篇關(guān)于MySQL 多表聯(lián)合查詢與數(shù)據(jù)備份恢復(fù)全攻略的文章就介紹到這了,更多相關(guān)mysql多表聯(lián)合查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 啟動(dòng)失敗(code=exited, status=1/FAILURE)異常解決方案
在MySQL服務(wù)啟動(dòng)時(shí)遇到啟動(dòng)失敗問題,通過查看和分析錯(cuò)誤日志文件,找到并解決了配置文件中的錯(cuò)誤項(xiàng),成功重啟了MySQL服務(wù).文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
mysql實(shí)現(xiàn)將date字段默認(rèn)值設(shè)置為CURRENT_DATE
這篇文章主要介紹了mysql實(shí)現(xiàn)將date字段默認(rèn)值設(shè)置為CURRENT_DATE問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
MySQL關(guān)于sql_mode解析與設(shè)置講解
今天小編就為大家分享一篇關(guān)于MySQL關(guān)于sql_mode解析與設(shè)置講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
在MySQL中使用JOIN語句進(jìn)行連接操作的詳細(xì)教程
這篇文章主要介紹了在MySQL中使用JOIN語句進(jìn)行連接操作的詳細(xì)教程,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05
mysql正確安全清空在線慢查詢?nèi)罩緎low log的流程分享
這篇文章主要介紹了正確安全清空在線慢查詢?nèi)罩緎low log的流程,需要的朋友可以參考下2014-02-02

