SQL 必學語法
SQL(Structured Query Language,結構化查詢語言)是操作關聯式資料庫的標準語言。日常工作最常用的只有建立資料表、新增/查詢/修改/刪除資料(CRUD),以及篩選、排序、合併、統計這幾類語法;本頁範例都可以直接在 SQLite 中執行,PostgreSQL 與 MySQL 也幾乎相同。
怎麼練習?
在終端機輸入 sqlite3 practice.db 開啟互動介面,或用 DB Browser for SQLite 的「Execute SQL」分頁貼上範例執行。
建立資料表(CREATE TABLE)
CREATE TABLE users (
id INTEGER PRIMARY KEY, -- 主鍵,SQLite 會自動遞增
name TEXT NOT NULL, -- 必填
email TEXT UNIQUE, -- 不可重複
age INTEGER CHECK (age >= 0) -- 限制條件
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id),
product TEXT NOT NULL,
amount INTEGER NOT NULL
);
常用限制條件(Constraint):PRIMARY KEY、NOT NULL、UNIQUE、CHECK、DEFAULT、REFERENCES(外鍵)。限制條件讓資料庫幫你擋下不合理的資料。
自動遞增主鍵在各資料庫的寫法
SQLite:INTEGER PRIMARY KEY;PostgreSQL:id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY(或舊寫法 SERIAL);MySQL:id INT AUTO_INCREMENT PRIMARY KEY。
新增資料(INSERT)
INSERT INTO users (name, email, age) VALUES ('Alice', 'alice@example.com', 30);
-- 一次新增多筆
INSERT INTO users (name, email, age) VALUES
('Bob', 'bob@example.com', 24),
('Charlie', 'charlie@example.com', 29);
INSERT INTO orders (user_id, product, amount) VALUES
(1, '鍵盤', 1200), (1, '滑鼠', 600), (2, '螢幕', 5000);
查詢資料(SELECT)
SELECT 是使用頻率最高的語法,基本結構如下(子句順序固定):
篩選與排序
SELECT name, age FROM users WHERE age >= 25 ORDER BY age DESC;
SELECT * FROM users WHERE name LIKE 'A%'; -- A 開頭
SELECT * FROM users WHERE age BETWEEN 20 AND 29;
SELECT * FROM users WHERE id IN (1, 3);
SELECT * FROM users WHERE email IS NULL; -- 判斷空值要用 IS NULL,不能用 = NULL
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20; -- 分頁:第 21~30 筆
統計與分組
聚合函數(Aggregate Function)把多列資料彙整成一個值:COUNT、SUM、AVG、MIN、MAX。搭配 GROUP BY 可以「每組各算一次」。
-- 每位使用者的訂單數與消費總額,只列出總額超過 1000 的人
SELECT user_id, COUNT(*) AS order_count, SUM(amount) AS total
FROM orders
GROUP BY user_id
HAVING SUM(amount) > 1000;
WHERE 在分組前篩選個別資料列,HAVING 在分組後篩選統計結果。
合併資料表(JOIN)
JOIN 依照關聯欄位把多張表的資料組合在一起,是關聯式資料庫的精髓。
-- INNER JOIN:只保留兩邊都對得上的資料
SELECT u.name, o.product, o.amount
FROM orders AS o
JOIN users AS u ON o.user_id = u.id;
-- LEFT JOIN:保留左表全部資料,右表沒對到的欄位為 NULL
-- 例:列出所有使用者,包含沒有下過訂單的人
SELECT u.name, COUNT(o.id) AS order_count
FROM users AS u
LEFT JOIN orders AS o ON o.user_id = u.id
GROUP BY u.id;
| JOIN 類型 | 結果 |
|---|---|
INNER JOIN |
兩表都有對應的資料 |
LEFT JOIN |
左表全部 + 右表有對應的資料 |
RIGHT JOIN |
右表全部 + 左表有對應的資料(SQLite 3.39 起支援) |
FULL OUTER JOIN |
兩表全部資料(MySQL 不支援,需用 UNION 模擬) |
修改與刪除(UPDATE / DELETE)
一定要寫 WHERE
UPDATE users SET age = 0; 或 DELETE FROM users; 少了 WHERE 會修改或刪除整張表。執行前先用相同條件跑一次 SELECT 確認影響的資料,正式環境則包在交易(BEGIN … COMMIT)裡執行。
修改資料表結構(ALTER / DROP)
ALTER TABLE users ADD COLUMN phone TEXT; -- 新增欄位,既有資料該欄為 NULL
CREATE INDEX idx_orders_user_id ON orders(user_id);
DROP TABLE IF EXISTS temp_table; -- 刪除整張表,無法復原
推薦影音
SQL Tutorial - Full Database Course for Beginners(freeCodeCamp)
簡述:約 4 小時的完整 SQL 入門課,從安裝 MySQL、建立資料表、查詢、JOIN、巢狀查詢到觸發器(Trigger)與 ER 圖設計,是 YouTube 上觀看次數最高的 SQL 課程之一,適合搭配本頁跟著練習。
SQL Course for Beginners(Programming with Mosh)
簡述:Mosh 以 MySQL 為環境,節奏明快地教完 SELECT、WHERE、JOIN、資料增修刪等核心語法,講解清楚、範例資料庫完整,適合偏好短時間掌握重點的人。
相關資料
- 上一步:關聯式資料庫核心觀念
- 下一步:從 SQLite 開始在 Python 中執行這些 SQL
- SQLite 官方 SQL 語法文件