欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2025年09月18日 09:16:38   作者:Sadsvit  
本文系統(tǒng)講解MySQL多表聯(lián)合查詢的五種核心方式(交叉連接、內(nèi)連接、外連接、分組查詢、子查詢),并涵蓋數(shù)據(jù)備份與恢復(fù)的完整流程,結(jié)合實(shí)戰(zhàn)案例與效果驗(yàn)證,保障數(shù)據(jù)安全與高效查詢,感興趣的朋友跟隨小編一起看看吧

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_infotb_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.idc.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 啟動(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恢復(fù)數(shù)據(jù)方法梳理講解

    MySql恢復(fù)數(shù)據(jù)方法梳理講解

    MySQL的binlog日志是MySQL日志中非常重要的一種日志,下面這篇文章主要給大家介紹了關(guān)于mysql如何利用binlog進(jìn)行數(shù)據(jù)恢復(fù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • mysql實(shí)現(xiàn)將date字段默認(rèn)值設(shè)置為CURRENT_DATE

    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
  • 一個(gè)字段同時(shí)滿足多個(gè)條件的查詢

    一個(gè)字段同時(shí)滿足多個(gè)條件的查詢

    當(dāng)一個(gè)字段需要同時(shí)等于多個(gè)值的時(shí)候,用and直接連不會有數(shù)據(jù)查出。
    2011-08-08
  • MySQL關(guān)于sql_mode解析與設(shè)置講解

    MySQL關(guān)于sql_mode解析與設(shè)置講解

    今天小編就為大家分享一篇關(guān)于MySQL關(guān)于sql_mode解析與設(shè)置講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • mysql 5.7.14 安裝配置代碼分享

    mysql 5.7.14 安裝配置代碼分享

    這篇文章主要為大家分享了CentOS 6.6下mysql 5.7.13winx64安裝配置方法圖文教程,感興趣的朋友可以參考一下
    2016-09-09
  • 在MySQL中使用JOIN語句進(jìn)行連接操作的詳細(xì)教程

    在MySQL中使用JOIN語句進(jìn)行連接操作的詳細(xì)教程

    這篇文章主要介紹了在MySQL中使用JOIN語句進(jìn)行連接操作的詳細(xì)教程,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • mysql正確安全清空在線慢查詢?nèi)罩緎low log的流程分享

    mysql正確安全清空在線慢查詢?nèi)罩緎low log的流程分享

    這篇文章主要介紹了正確安全清空在線慢查詢?nèi)罩緎low log的流程,需要的朋友可以參考下
    2014-02-02
  • mysql中TIMESTAMPDIFF案例詳解

    mysql中TIMESTAMPDIFF案例詳解

    這篇文章主要介紹了mysql中TIMESTAMPDIFF案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 解決mysql刪除用戶 bug的問題

    解決mysql刪除用戶 bug的問題

    這篇文章主要介紹了解決mysql刪除用戶 bug的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評論