跳轉至

建立 2026-10-03 更新 2026-10-03

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 欄位
FROM 資料表
WHERE 篩選條件
GROUP BY 分組欄位
HAVING 分組後的篩選條件
ORDER BY 排序欄位
LIMIT 筆數;

篩選與排序

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)

UPDATE users SET age = 31 WHERE name = 'Alice';

DELETE FROM orders WHERE amount < 1000;

一定要寫 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、資料增修刪等核心語法,講解清楚、範例資料庫完整,適合偏好短時間掌握重點的人。

相關資料