SQL 語句靈活多變,許多實用技巧容易遺忘。本文系統整理常用 SQL 語法,涵蓋基礎建表、進階查詢、資料操作與特殊技巧,作為隨時可查的速查手冊。
-- 建立資料庫
CREATE DATABASE db_name;
-- 刪除資料庫
DROP DATABASE db_name;
-- 建立新表
CREATE TABLE tab_name (
col1 type1 [NOT NULL] [PRIMARY KEY],
col2 type2 [NOT NULL],
...
);
-- 依現有表結構建立新表(不複製資料)
CREATE TABLE new_tab LIKE old_tab;
-- 依查詢結果建立新表(複製結構與資料)
CREATE TABLE new_tab AS SELECT col1, col2 FROM old_tab;
-- 刪除資料表
DROP TABLE tab_name;
-- 新增欄位
ALTER TABLE tab_name ADD COLUMN col_name data_type;
-- 新增主鍵
ALTER TABLE tab_name ADD PRIMARY KEY (col);
-- 刪除主鍵
ALTER TABLE tab_name DROP PRIMARY KEY;
-- 建立索引
CREATE [UNIQUE] INDEX idx_name ON tab_name (col...);
-- 刪除索引
DROP INDEX idx_name ON tab_name;
-- 建立視圖
CREATE VIEW view_name AS SELECT ...;
-- 刪除視圖
DROP VIEW view_name;
-- 查詢
SELECT * FROM table1 WHERE condition;
-- 新增
INSERT INTO table1 (field1, field2) VALUES (value1, value2);
-- 刪除
DELETE FROM table1 WHERE condition;
-- 更新
UPDATE table1 SET field1 = value1 WHERE condition;
-- 模糊查詢
SELECT * FROM table1 WHERE field1 LIKE '%value1%';
-- 排序
SELECT * FROM table1 ORDER BY field1, field2 [DESC];
-- 聚合函數
SELECT COUNT(*) AS total FROM table1;
SELECT SUM(field1) AS sum_val FROM table1;
SELECT AVG(field1) AS avg_val FROM table1;
SELECT MAX(field1) AS max_val FROM table1;
SELECT MIN(field1) AS min_val FROM table1;
-- UNION:合併結果並去重
SELECT * FROM table1 UNION SELECT * FROM table2;
-- UNION ALL:合併結果保留重複
SELECT * FROM table1 UNION ALL SELECT * FROM table2;
-- EXCEPT(MINUS):差集,table1 有但 table2 無
SELECT * FROM table1 EXCEPT SELECT * FROM table2;
-- INTERSECT:交集,兩者都有
SELECT * FROM table1 INTERSECT SELECT * FROM table2;
注意: 參與運算的查詢欄位數、順序、資料型別必須一致。
-- LEFT JOIN:左表全部,右表匹配
SELECT a.col1, b.col2
FROM table_a a
LEFT JOIN table_b b ON a.id = b.a_id;
-- RIGHT JOIN:右表全部,左表匹配
SELECT a.col1, b.col2
FROM table_a a
RIGHT JOIN table_b b ON a.id = b.a_id;
-- FULL JOIN:兩表全部(MySQL 不直接支援,可用 UNION 模擬)
SELECT * FROM table_a a LEFT JOIN table_b b ON a.id = b.a_id
UNION
SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id = b.a_id;
-- 僅複製結構
CREATE TABLE new_tab AS SELECT * FROM old_tab WHERE 1=0;
-- 或
CREATE TABLE new_tab LIKE old_tab;
-- 複製資料
INSERT INTO target_tab (col1, col2) SELECT col1, col2 FROM source_tab;
-- IN 子查詢
SELECT * FROM table_a WHERE id IN (SELECT id FROM table_b WHERE status = 1);
-- 相關子查詢:查詢每類最高薪資員工
SELECT * FROM employees e1
WHERE salary = (SELECT MAX(salary) FROM employees e2 WHERE e2.dept_id = e1.dept_id);
-- 基本分頁
SELECT * FROM table1 ORDER BY id LIMIT 10 OFFSET 20;
-- 大偏移量優化:使用覆蓋索引子查詢
SELECT * FROM table1
WHERE id >= (SELECT id FROM table1 ORDER BY id LIMIT 100000, 1)
ORDER BY id LIMIT 20;
-- 包含邊界值
SELECT * FROM orders WHERE create_time BETWEEN '2023-01-01' AND '2023-01-31';
-- 不包含邊界
SELECT * FROM orders WHERE create_time >= '2023-01-01' AND create_time < '2023-02-01';
SELECT
id,
CASE
WHEN score >= 90 THEN '優'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS grade
FROM students;
IFNULL(expr1, expr2):expr1 為 NULL 時回傳 expr2COALESCE(val1, val2, ...):回傳第一個非 NULL 值DATE_FORMAT(date, '%Y-%m-%d'):日期格式化GROUP_CONCAT(col SEPARATOR ','):群組串聯字串JSON_EXTRACT(json_col, '$.key'):JSON 欄位查詢(5.7+)SELECT *,明確列出欄位。EXPLAIN 分析執行計畫,關注 type、key、rows 欄位。INSERT 或 LOAD DATA INFILE。SQL_NO_CACHE 避免查詢快取污染。持續累積、分類整理,打造屬於自己的 SQL 速查手冊,讓查詢寫得又快又好。