關係型數據庫的核心價值在於**多表關聯**。本文從基礎的多表查詢、別名使用、內/外連接語法,到批處理概念,系統講解 MySQL 多表操作核心技能,適合 SQL 入門進階與面試鞏固。
一、 場景建模:員工表 + 文章表
-- 員工基本信息表
CREATE TABLE mytable (
name VARCHAR(20),
sex CHAR(1),
birth DATE,
birthaddr VARCHAR(20)
);
INSERT INTO mytable VALUES
('abccs','f','1977-07-07','china'),
('mary','f','1978-12-12','usa'),
('tom','m','1970-09-02','usa');
-- 員工發表文章表
CREATE TABLE title (
writer VARCHAR(20) NOT NULL,
title VARCHAR(40) NOT NULL,
senddate DATE
);
INSERT INTO title VALUES
('abccs','a1','2000-01-23'),
('mary','b1','1998-03-21'),
('abccs','a2','2000-12-04'),
('tom','c1','1992-05-16'),
('tom','c2','1999-12-12');
二、 多表查詢核心:關聯條件
需求:查詢作者 abccs 的姓名、性別、文章標題。
SELECT m.name, m.sex, t.title
FROM mytable m
INNER JOIN title t ON m.name = t.writer
WHERE m.name = 'abccs';
結果:
| name | sex | title |
| abccs | f | a1 |
| abccs | f | a2 |
關鍵點:
- 別名簡寫:
mytable m、title t,簡化列引用。
- 關聯條件:
ON m.name = t.writer 指定如何匹配兩表行。
- 同名列消歧: 若兩表同名列(如都叫
name),**必須用別名限定**:m.name、t.name,否則報錯 Column 'name' in field list is ambiguous。
三、 連接類型完整對比
| 連接類型 | 語法 | 結果集 | 適用場景 |
| 內連接 | INNER JOIN / JOIN | 僅匹配行 | 核心業務關聯,雙方必須存在 |
| 左外連接 | LEFT JOIN / LEFT OUTER JOIN | 左表全保留,右表無匹配則 NULL | 主表帶從表信息(如用戶+訂單,無訂單也要顯示用戶) |
| 右外連接 | RIGHT JOIN | 右表全保留 | 少用,可改 LEFT JOIN 交換表順序 |
| 全外連接 | FULL JOIN (MySQL 不支援) | 雙表全保留 | 用 LEFT JOIN UNION RIGHT JOIN 模擬 |
| 交叉連接 | CROSS JOIN | 笛卡爾積 (m×n 行) | 生成測試數據、矩陣運算 |
左連接實戰:查所有員工及其文章(無文章也顯示)
SELECT m.name, m.sex, t.title
FROM mytable m
LEFT JOIN title t ON m.name = t.writer;
結果包含 mary (有文章) 與 tom (有文章),若有員工無文章,title 列顯示 NULL。
四、 批處理概念與實踐
MySQL 批處理指**一次發送多條 SQL 語句**,減少網路往返、利用事務保證原子性。
1. 客戶端批量執行
mysql -u root -p db_name < batch.sql
batch.sql 內容:
INSERT INTO log VALUES (1, 'start');
INSERT INTO log VALUES (2, 'process');
UPDATE config SET value='on' WHERE name='feature_x';
COMMIT;
2. 存儲過程批處理
CREATE PROCEDURE batch_insert(IN cnt INT)
BEGIN
DECLARE i INT DEFAULT 1;
START TRANSACTION;
WHILE i <= cnt DO
INSERT INTO test_data (val) VALUES (CONCAT('batch_', i));
SET i = i + 1;
END WHILE;
COMMIT;
END;
3. 應用層批量插入 (推薦)
-- 單條 INSERT 多值 (最高效)
INSERT INTO test_data (val) VALUES ('v1'), ('v2'), ('v3'), ... ('v1000');
-- 或使用 LOAD DATA INFILE (極速導入)
LOAD DATA INFILE '/path/data.txt' INTO TABLE test_data FIELDS TERMINATED BY ',';
五、 實戰最佳實踐清單
- 關聯列必須建索引:
ON/WHERE 條件列加索引,否則全表掃描災難。
- 優先用 INNER JOIN: 語義清晰,優化器支援最好。
- 避免 SELECT *: 顯式列出所需列,減少網路傳輸、利用覆蓋索引。
- 大表關聯小表: 小表驅動大表(優化器通常自動選擇,可用
STRAIGHT_JOIN 強制)。
- 批量操作分批提交: 萬行級 INSERT/UPDATE 分批 500-1000 行,避免長事務、鎖升級、主從延遲。
- EXPLAIN 驗證執行計劃: 關注
type (目標 ref/eq_ref)、rows、Extra (Using index/Using where)。
六、 總結
多表操作核心在於:**正確關聯條件 + 合適連接類型 + 關鍵索引**。批處理核心在於:**減少網路往返 + 事務邊界控制 + 分批提交**。掌握內/外連接語義、別名消歧、批量插入語法,即可從容應對從報表查詢到數據遷移的各類多表場景。
- 上一篇文章: MySQL 安裝後性能調優核心參數:四大關鍵變量決定 80% 性能
- 下一篇文章: Oracle CONNECT BY 遞歸查詢在 SQL Server 中的三種實現方案
Copyright ©
程式碼之家 All Rights Reserved