ANSI SQL 為標準,各廠商(MySQL、Oracle、PostgreSQL、SQL Server)在其基礎上擴展方言。分層架構中,資料庫位於最底層,上層應用(如 mysql.exe、Java 程式)皆透過 SQL 交互。SQL 全稱「結構化查詢語言」,實則涵蓋資料定義(DDL)、資料操縱(DML)、資料查詢(DQL)、資料控制(DCL)四大功能。
| 類型 | 全稱 | 功能 | 典型語句 |
|---|---|---|---|
| DDL | Data Definition Language | 定義表、視圖、索引 | CREATE、DROP、ALTER |
| DML | Data Manipulation Language | 增刪改資料 | INSERT、UPDATE、DELETE |
| DQL | Data Query Language | 查詢資料 | SELECT |
| DCL | Data Control Language | 權限控制 | GRANT、REVOKE |
NOT NULL、CHECK、DEFAULT 等約束。-- 方式一:建表時直接定義 FK(需先建父表) CREATE TABLE customers ( id BIGINT NOT NULL, name VARCHAR(15) NOT NULL, age INT, PRIMARY KEY (id) ); CREATE TABLE orders ( id BIGINT NOT NULL, order_number VARCHAR(15) NOT NULL, price DOUBLE PRECISION, customer_id BIGINT, FOREIGN KEY (customer_id) REFERENCES customers(id) ); -- 方式二:先建表再 ALTER ADD CONSTRAINT(解決建表順序依賴、腳本維護難題) CREATE TABLE orders ( id BIGINT NOT NULL PRIMARY KEY, order_number VARCHAR(15) NOT NULL, price DOUBLE PRECISION, customer_id BIGINT ); ALTER TABLE orders ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(id);
ALTER TABLE tbl ADD col INT; / DROP COLUMN col; / MODIFY col VARCHAR(50);DROP TABLE tbl;(連資料一併刪除,慎用)。執行 INSERT/UPDATE/DELETE 時,資料庫先做完整性檢查(PK、FK、NOT NULL、CHECK),違規即拋錯回滾,保證資料一致性。
SELECT 完整語法與五大查詢模式SELECT 目標欄位 FROM 基礎表/視圖 [WHERE 條件] [GROUP BY 欄位 [HAVING 條件]] [ORDER BY 欄位 [ASC|DESC]] [LIMIT 偏移量, 行數]
WHERE age BETWEEN 18 AND 50 ORDER BY age DESC, name ASCWHERE name IN ('Tom','Mike','Jack')WHERE name LIKE '_a%'(第二字為 a)WHERE age IS NULL(不可用 = NULL)SELECT name AS c_name, age AS c_age FROM customer c WHERE c.id = 1FROM table1 join_type table2 [ON (join_condition)] [WHERE (query_condition)]
| 類型 | 關鍵字 | 特點 | 範例 |
|---|---|---|---|
| 交叉連接 | CROSS JOIN / 逗號 | 笛卡兒積,無 ON | SELECT * FROM customers, orders |
| 內連接 | INNER JOIN | 僅返回符合條件的行 | SELECT c.id, o.id FROM customers c INNER JOIN orders o ON c.id=o.customer_id |
| 左外連接 | LEFT OUTER JOIN | 左表全保留,右表無匹配則 NULL | SELECT * FROM customers c LEFT JOIN orders o ON c.id=o.customer_id |
| 右外連接 | RIGHT OUTER JOIN | 右表全保留 | 同上對調 |
隱式內連接:WHERE c.id=o.customer_id(不寫 JOIN/ON),功能等同但可讀性較差。
SELECT name, (SELECT SUM(price) FROM orders WHERE customer_id=1) total FROM customers WHERE id=1IN / EXISTS:WHERE id IN (SELECT customer_id FROM orders) / WHERE EXISTS (SELECT 1 FROM orders WHERE customer_id=c.id)UNIONSELECT * FROM customers WHERE age<25 UNION SELECT * FROM customers WHERE age>=25(自動去重;UNION ALL 保留重複、效能更高)。
SELECT c.id, c.name, SUM(price) FROM customers c LEFT JOIN orders o ON c.id=o.customer_id GROUP BY c.id HAVING SUM(price) > 100;
聚合函數:COUNT()、MIN()、MAX()、SUM()、AVG()。
GRANT SELECT, INSERT ON db.* TO 'user'@'%' IDENTIFIED BY 'pwd'; REVOKE INSERT ON db.* FROM 'user'@'%';
掌握 DDL/DML/DQL/DCL 四大類語句、三大完整性約束、五種查詢模式,即可應對 90% 以上的日常 SQL 開發場景。建議收藏本文作為速查手冊,實戰中多練 EXPLAIN 分析執行計劃,將 SQL 寫得又對又快。