首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 基礎查詢語句完全手冊:從 SELECT 到 UNION 的進階實戰

     編輯:MySQL 資料庫相關知識

核心 SELECT 語法骨架


SELECT 屬性列表
FROM 表/視圖列表
[WHERE 條件]
[GROUP BY 屬性 [HAVING 條件]]
[ORDER BY 屬性 [ASC|DESC]]
[LIMIT [偏移,] 行數]

一、單表查詢必會技巧

1. 全字段 vs 指定字段


SELECT * FROM product;              -- 全字段(調試用)
SELECT id, name, price FROM product; -- 生產環境:只取所需

2. WHERE 條件構建大全

類型操作符範例
比較=, <>, !=, <, <=, >, >=WHERE price > 100
範圍BETWEEN ... AND ..., NOT BETWEENWHERE age BETWEEN 18 AND 30
集合IN (...), NOT IN (...)WHERE status IN (1,2,3)
模糊LIKE, NOT LIKEWHERE name LIKE '張%'
空值IS NULL, IS NOT NULLWHERE phone IS NULL
邏輯AND, OR, NOTWHERE age>18 AND status=1

3. LIKE 通配符精通

  • %:匹配任意長度(含 0)字符
  • _:匹配單個字符
  • LIKE '北京%' → 以「北京」開頭
  • LIKE 'ar_c' → 4 字符、前綴 ar、後綴 c

4. 去重 DISTINCT


SELECT DISTINCT dept_id, age FROM employee;

5. 排序 ORDER BY


SELECT * FROM employee ORDER BY id ASC, age DESC;
-- 多字段排序:先按 id 升序,同 id 再按 age 降序
-- NULL 值視為最小值(ASC 排首)

6. 分頁 LIMIT


SELECT * FROM employee LIMIT 10;           -- 前 10 行
SELECT * FROM employee LIMIT 10, 20;       -- 跳過 10 行,取 20 行(第 11-30 行)
-- 偏移量從 0 開始

二、聚合函數實戰


-- 總行數
SELECT COUNT(*) FROM employee;

-- 分組統計
SELECT dept_id, COUNT(*) FROM employee GROUP BY dept_id;

-- 求和/平均(僅數值列)
SELECT student_id, SUM(score), AVG(score) FROM grade GROUP BY student_id;

-- 極值
SELECT MAX(age), MIN(age) FROM employee;
SELECT course, MAX(score) FROM grade GROUP BY course;

三、UNION 合併查詢


SELECT id, name FROM employee WHERE dept_id = 1
UNION          -- 去重
SELECT id, name FROM employee WHERE dept_id = 2;

SELECT id, name FROM employee WHERE dept_id = 1
UNION ALL      -- 不去重,效能更高
SELECT id, name FROM employee WHERE dept_id = 2;
UNION 要求各 SELECT 列數、類型、順序一致。

四、別名規範


-- 表別名:簡化多表查詢
SELECT e.name, d.dept_name FROM employee e JOIN department d ON e.dept_id = d.dept_id;

-- 字段別名:提升可讀性
SELECT dept_id AS department_id, dept_name AS department_name FROM department;

五、進階查詢模式速覽

  • 子查詢: WHERE id IN (SELECT employee_id FROM salary WHERE amount > 5000)
  • 衍生表: SELECT * FROM (SELECT dept_id, AVG(salary) avg_sal FROM employee GROUP BY dept_id) t WHERE avg_sal > 10000
  • CTE (MySQL 8.0+): WITH high_sal AS (...) SELECT * FROM high_sal

避坑清單

  1. 生產禁用 SELECT *
  2. NOT IN 子查詢含 NULL 會返回空結果,改用 NOT EXISTS
  3. 隱式類型轉換導致索引失效(字符串列比數值)
  4. 大偏移量 LIMIT 1000000, 10 效能極差,改用游標/ID 範圍分頁
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved