首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

MySQL 基礎知識掃盲:從連接到多表連接、子查詢與聯合查詢完整指南

     編輯:Java 綜合教學

1. 連接 MySQL

# 命令列
mysql -h localhost -u root -p
# -h 主機(本機可省略),-u 用戶,-p 密碼交互輸入

成功後進入 mysql> 提示符。

2. 庫/表常用 DDL/DML

操作SQL
建庫CREATE DATABASE db_name CHARSET utf8mb4;
刪庫DROP DATABASE db_name;
查庫SHOW DATABASES;
選庫USE db_name;
查表SHOW TABLES;
表結構DESC tbl_name; / SHOW CREATE TABLE tbl_name;
刪表DROP TABLE tbl_name;
多表刪除DELETE t1, t2 FROM t1 JOIN t2 ON ... WHERE ...
多表更新UPDATE t1 JOIN t2 ON ... SET t1.c=expr, t2.c=expr WHERE ...

3. 查詢基礎

3.1 去重

SELECT DISTINCT dept_id FROM employee;

3.2 排序與分頁


SELECT * FROM employee ORDER BY hire_date DESC, salary ASC LIMIT 10 OFFSET 20;
-- LIMIT offset, row_count(MySQL)或 LIMIT row_count OFFSET offset

4. 聚合操作

4.1 常用聚合函數

函數說明
COUNT(*)行數(含 NULL)
SUM(col)求和
AVG(col)平均值
MAX(col)最大值
MIN(col)最小值

4.2 GROUP BY 進階


-- 按課程統計選課人數
SELECT course_id, COUNT(*) AS cnt FROM sc GROUP BY course_id;

-- 按年級統計並顯示總計
SELECT grade, COUNT(*) FROM student GROUP BY grade WITH ROLLUP;

-- HAVING 過濾聚合後結果(年齡 ≥ 20 的年級)
SELECT grade, COUNT(*) FROM student WHERE age >= 20 GROUP BY grade HAVING COUNT(*) > 5;

WHERE vs HAVING:WHERE 過濾原始行(聚合前),HAVING 過濾分組結果(聚合後)。能用 WHERE 先過濾,減少聚合輸入,提升性能。

5. 多表連接

5.1 內連接


SELECT s.name, c.course_name
FROM student s
JOIN sc ON s.id = sc.student_id
JOIN course c ON sc.course_id = c.id;

僅返回雙方匹配的行。

5.2 外連接

類型保留側語法
LEFT JOIN左表所有行FROM a LEFT JOIN b ON ...
RIGHT JOIN右表所有行FROM a RIGHT JOIN b ON ...

-- 左連接:所有學生(含未選課)
SELECT s.name, c.course_name
FROM student s
LEFT JOIN sc ON s.id = sc.student_id
LEFT JOIN course c ON sc.course_id = c.id;

6. 子查詢


-- 查選了「數學」的學生
SELECT * FROM student WHERE id IN (SELECT student_id FROM sc WHERE course_id = (SELECT id FROM course WHERE name='數學'));

-- 等價內連接(通常效率更高)
SELECT s.* FROM student s
JOIN sc ON s.id = sc.student_id
JOIN course c ON sc.course_id = c.id
WHERE c.name = '數學';

優化建議:邏輯允許時優先改寫為 內連接,MySQL 優化器對 JOIN 執行計劃更成熟。

7. 聯合查詢

操作符去重性能
UNION是(排序去重)較慢
UNION ALL否(直接拼接)極快

-- 正確:列數、類型一致
SELECT id, name FROM student_2023
UNION ALL
SELECT id, name FROM student_2024;

-- 錯誤:列數不匹配
SELECT id, name FROM student
UNION
SELECT id, name, age FROM teacher;  -- ERROR 1222

8. 實戰優化口訣

  1. 小表驅動大表:EXISTS 子查詢外層用小結果集。
  2. 索引覆蓋:EXPLAIN 看 Using index。
  3. 避免 SELECT *:只取需要列,減少 IO 與網絡傳輸。
  4. 分頁優化:深分頁改用 WHERE id > last_id LIMIT n(游標分頁)。
  5. 字符集統一:庫/表/連接均用 utf8mb4,避免隱式轉換導致索引失效。

總結

掌握 DDL/DML 基礎 → 聚合分組 → 內外連接 → 子查詢改 JOIN → UNION ALL 優先 這條主線,即可應對 90% 業務查詢場景。進階請深入 EXPLAIN 執行計劃、索引設計(B+ 樹最左前綴)、鎖機制(MVCC/Next-Key Lock)與慢查詢分析(pt-query-digest)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved