MySQL 常用語法整理

MySQL 常用語法整理

以下範例以 users 資料表為例,欄位包含:id, name, email, age, created_at


✅ 插入資料(INSERT)

1
2
INSERT INTO users (name, email, age)
VALUES ('小明', 'xiaoming@example.com', 25);

✅ 查詢資料(SELECT)

1
SELECT * FROM users;

查詢特定欄位

1
SELECT name, email FROM users;

✅ 條件查詢 WHERE

1
2
SELECT 欄位名稱 FROM 表格名稱
WHERE 條件;

🔍 常見的 WHERE 條件語法

條件範例 說明
=, <>, !=, <, >, <=, >= 比較運算子
AND, OR, NOT 多條件結合
BETWEEN A AND B 範圍查詢(含 A 和 B)
IN (值1, 值2, ...) 等同多個 OR
LIKE '%字串%' 模糊比對
IS NULL, IS NOT NULL NULL 判斷
EXISTS, NOT EXISTS 子查詢存在性

🟡 NULL 判斷語法

1
2
3
4
5
6
7
-- 找出 age 欄位為 NULL 的資料
SELECT * FROM users
WHERE age IS NULL;

-- 找出 age 欄位不為 NULL 的資料
SELECT * FROM users
WHERE age IS NOT NULL;

📝 注意:不能用 = NULL,會無法正確判斷。


📋 常見的 WHERE 語句範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- 單一條件
SELECT * FROM users WHERE age >= 18;

-- 多條件 AND
SELECT * FROM users WHERE age >= 18 AND gender = 'female';

-- 使用 OR
SELECT * FROM users WHERE city = 'Taipei' OR city = 'Kaohsiung';

-- 模糊查詢
SELECT * FROM products WHERE name LIKE '%手機%';

-- 範圍查詢
SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';

-- 使用 IN
SELECT * FROM users WHERE id IN (1, 2, 3, 4);

-- NULL 判斷
SELECT * FROM logs WHERE deleted_at IS NULL;

✅ 更新資料(UPDATE)

1
2
3
UPDATE users
SET age = 26
WHERE name = '小明';

✅ 刪除資料(DELETE)

1
2
DELETE FROM users
WHERE name = '小明';

✅ 排序資料(ORDER BY)

1
2
SELECT * FROM users
ORDER BY age DESC;

✅ 限制回傳筆數(LIMIT)

1
2
SELECT * FROM users
LIMIT 1;

✅ 結合條件 + 排序 + LIMIT 1

取得年紀最大的使用者

1
2
3
SELECT * FROM users
ORDER BY age DESC
LIMIT 1;

取得最新註冊的使用者(假設有 created_at 欄位)

1
2
3
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 1;

MySQL 批量插入與批量更新語法


✅ 批量插入(Bulk Insert)

1
2
3
4
5
INSERT INTO users (name, email, age)
VALUES
('小明', 'xiaoming@example.com', 25),
('小華', 'xiaohua@example.com', 30),
('小美', 'xiaomei@example.com', 22);

✅ 批量更新(Bulk Update)方式一:使用 CASE WHEN

假設我們要依據 id 更新 age 欄位:

1
2
3
4
5
6
7
UPDATE users
SET age = CASE id
WHEN 1 THEN 26 -- 就是 set age = 26 where id = 1
WHEN 2 THEN 31
WHEN 3 THEN 23
END
WHERE id IN (1, 2, 3);

✅ 批量更新(Bulk Update)方式二:JOIN 另一張臨時表

可用於複雜更新情境(例如來自另一張表的資料)

1
2
3
4
5
6
7
8
9
UPDATE users u
JOIN (
SELECT 1 AS id, 26 AS age
UNION ALL
SELECT 2, 31
UNION ALL
SELECT 3, 23
) tmp ON u.id = tmp.id
SET u.age = tmp.age;

✅ 建議使用方式:

  • 少量更新 → 使用 CASE WHEN
  • 大量更新且來自其他資料來源 → 使用 JOIN

MySQL 常用聚合函數與日期函數


✅ 聚合函數(Aggregate Functions)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 總筆數
SELECT COUNT(*) FROM users;

-- 某欄位不為 NULL 的筆數
SELECT COUNT(email) FROM users;

-- 總和
SELECT SUM(age) FROM users;

-- 平均值
SELECT AVG(age) FROM users;

-- 最大值
SELECT MAX(age) FROM users;

-- 最小值
SELECT MIN(age) FROM users;

-- 分組統計(以性別分組計算平均年齡)
SELECT gender, AVG(age)
FROM users
GROUP BY gender;

✅ 日期函數(Date Functions)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- 取得今天日期
SELECT CURDATE(); -- 2025-04-10

-- 取得現在日期與時間
SELECT NOW(); -- 2025-04-10 14:30:00

-- 只取時間
SELECT CURTIME(); -- 14:30:00

-- 字串轉日期
SELECT STR_TO_DATE('2025-04-10', '%Y-%m-%d');

-- 日期加減
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); -- 加7天
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH); -- 減1個月

-- 擷取部分時間資訊
SELECT YEAR(created_at) AS year,
MONTH(created_at) AS month,
DAY(created_at) AS day,
HOUR(created_at) AS hour,
MINUTE(created_at) AS minute
FROM users;

-- 格式化時間
SELECT DATE_FORMAT(created_at, '%Y/%m/%d %H:%i:%s') AS formatted_time
FROM users;

✅ 結合範例:統計每月註冊人數

1
2
3
4
5
SELECT DATE_FORMAT(created_at, '%Y-%m') AS register_month,
COUNT(*) AS user_count
FROM users
GROUP BY register_month
ORDER BY register_month DESC;


MySQL 常用語法整理
https://austin72905.github.io/2025/04/10/mysql-syntax-basic/
作者
Austin Lin
發布於
2025年4月10日
許可協議