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

MySQL SQL 基礎查詢語句核心語法速查手冊

     編輯:MySQL 綜合教學

MySQL SQL 基礎查詢語句核心語法速查手冊

掌握 MySQL 基礎查詢語法是資料庫開發與分析的入門必修課。本文系統整理 SELECT 語句的核心子句、運算符、通配符、排序分頁、條件過濾等實戰語法,附帶範例與注意事項,適合初學者快速上手與資深工程師查漏補缺。

一、SELECT 基礎結構

SELECT [DISTINCT] 選擇列表
FROM 表來源
[WHERE 條件]
[GROUP BY 分組列表]
[HAVING 分組條件]
[ORDER BY 排序列表 [ASC|DESC]]
[LIMIT [偏移量,] 行數]

二、去重與限制結果集

1. DISTINCT 去重

-- 單列去重
SELECT DISTINCT vend_id FROM products;

-- 多列組合去重(以所有指定列組合為準)
SELECT DISTINCT vend_id, prod_price FROM products;

2. LIMIT 分頁與限制

-- 取前 5 行
SELECT prod_name FROM products LIMIT 5;

-- 偏移量 + 行數:從第 6 行開始取 5 行(即第 6-10 行)
SELECT prod_name FROM products LIMIT 5, 5;
-- 等價標準語法
SELECT prod_name FROM products LIMIT 5 OFFSET 5;

-- 注意:MySQL 索引從 0 開始,LIMIT 0,5 為前 5 行

三、排序 ORDER BY

-- 單列升序(預設)
SELECT prod_name FROM products ORDER BY prod_name;

-- 單列降序
SELECT prod_name FROM products ORDER BY prod_name DESC;

-- 多列排序:先按價格降序,再按名稱升序
SELECT prod_name, prod_price FROM products 
ORDER BY prod_price DESC, prod_name ASC;

-- 可使用非 SELECT 列排序
SELECT prod_name FROM products ORDER BY prod_price DESC;

-- ORDER BY 必須在 WHERE 之後,LIMIT 之前

四、條件過濾 WHERE

1. 比較運算符

運算符含義範例
=等於prod_price = 10
<> 或 !=不等於prod_price <> 10
<, <=, >, >=大小比較prod_price > 10
BETWEEN ... AND ...範圍(含邊界)prod_price BETWEEN 5 AND 10
IS NULL / IS NOT NULL空值判斷prod_price IS NULL

2. 邏輯運算符

-- AND:交集(優先級高於 OR)
SELECT prod_id, prod_price, prod_name 
FROM products 
WHERE vend_id = 1003 AND prod_price <= 10;

-- OR:並集
SELECT prod_name, prod_price 
FROM products 
WHERE vend_id = 1002 OR vend_id = 1003;

-- IN:簡化多個 OR 等值條件
SELECT prod_name, prod_price 
FROM products 
WHERE vend_id IN (1002, 1003) 
ORDER BY prod_name;

-- NOT IN:排除指定值
SELECT prod_name, prod_price 
FROM products 
WHERE vend_id NOT IN (1002, 1003) 
ORDER BY prod_name;

-- 括號控制優先級
SELECT * FROM products 
WHERE (vend_id = 1001 OR vend_id = 1002) AND prod_price > 5;

五、通配符模糊查詢 LIKE

通配符匹配規則範例匹配結果
%任意長度字符(含 0 個)LIKE 'jet%'以 jet 開頭
%任意長度字符LIKE '%anvil'以 anvil 結尾
%任意長度字符LIKE '%jet%'包含 jet
_單個任意字符LIKE '_ ton anvil'第 1 位任意,後接 " ton anvil"
_單個任意字符LIKE 'J__'J 開頭的 3 字符

通配符使用最佳實踐:

  1. 不要過度使用: 能用 =、IN、BETWEEN 解決的不用 LIKE
  2. 避免前置 %: LIKE '%abc' 無法使用索引,全表掃描
  3. 後置 % 可用索引: LIKE 'abc%' 可走索引範圍掃描
  4. 精確匹配優先: 明確值用 =,不要用 LIKE

六、常用字符串與數值函數

-- 字符串
CONCAT(str1, str2, ...)      -- 拼接
UPPER/LOWER(str)             -- 大小寫轉換
TRIM(str)                    -- 去首尾空格
SUBSTRING(str, pos, len)     -- 截取
LENGTH(str)                  -- 字節長度
CHAR_LENGTH(str)             -- 字符長度

-- 數值
ROUND(num, decimals)         -- 四捨五入
FLOOR/CEIL(num)              -- 向下/向上取整
ABS(num)                     -- 絕對值
MOD(n, m)                    -- 取模

-- 日期
NOW()                        -- 當前日期時間
CURDATE()                    -- 當前日期
DATE_ADD(date, INTERVAL n UNIT) -- 日期加減
DATEDIFF(date1, date2)       -- 日期差天數
DATE_FORMAT(date, format)    -- 格式化輸出

七、聚合查詢與分組

-- 基礎聚合
SELECT COUNT(*), AVG(prod_price), MAX(prod_price), MIN(prod_price), SUM(quantity)
FROM products;

-- 分組聚合
SELECT vend_id, COUNT(*) AS prod_count, AVG(prod_price) AS avg_price
FROM products
GROUP BY vend_id;

-- 分組過濾(HAVING 針對聚合結果,WHERE 針對原始行)
SELECT vend_id, COUNT(*) AS cnt
FROM products
GROUP BY vend_id
HAVING COUNT(*) >= 3;

-- 多列分組
SELECT vend_id, category, COUNT(*)
FROM products
GROUP BY vend_id, category;

八、多表連接 JOIN

連接類型語法結果集適用場景
內連接INNER JOIN / JOIN兩表匹配的行核心業務關聯
左連接LEFT JOIN左表全量 + 右表匹配主表帶從表(如訂單+明細)
右連接RIGHT JOIN右表全量 + 左表匹配較少用,可轉 LEFT JOIN
全連接FULL JOIN (MySQL 不支援)兩表全量UNION 模擬
-- 內連接範例
SELECT c.cust_name, o.order_num
FROM customers c
INNER JOIN orders o ON c.cust_id = o.cust_id;

-- 左連接:所有客戶(含無訂單)
SELECT c.cust_name, o.order_num
FROM customers c
LEFT JOIN orders o ON c.cust_id = o.cust_id;

九、子查詢

-- 標量子查詢(返回單值)
SELECT prod_name, prod_price
FROM products
WHERE prod_price > (SELECT AVG(prod_price) FROM products);

-- 列子查詢(IN/NOT IN)
SELECT cust_name
FROM customers
WHERE cust_id IN (SELECT cust_id FROM orders);

-- 存在性子查詢(EXISTS,通常效能優於 IN)
SELECT cust_name
FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.cust_id = c.cust_id);

-- 從表子查詢(派生表)
SELECT dt.cust_name, dt.order_count
FROM (
  SELECT cust_id, COUNT(*) AS order_count
  FROM orders
  GROUP BY cust_id
) dt
JOIN customers c ON c.cust_id = dt.cust_id;

十、實戰避坑指南

  1. SELECT * 禁用: 明確列出需要欄位,減少網路傳輸、利用覆蓋索引
  2. 隱式轉換: WHERE 條件類型與欄位類型保持一致,避免索引失效
  3. NULL 值陷阱: col = NULL 永遠為假,必須用 IS NULL;NOT IN 子查詢含 NULL 會導致空結果
  4. 分頁深度問題: LIMIT 1000000, 10 效能極差,改用游標/ID 範圍分頁
  5. 字符集匹配: 連接、表、欄位字符集一致,避免亂碼與索引失效

熟練掌握上述核心語法,覆蓋 90% 日常查詢開發場景。進階學習建議深入:CTE (WITH 子句)、窗口函數 (ROW_NUMBER/OVER)、JSON 函數、準備語句與綁定變量、優化器提示。

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