SQL(結構化查詢語言)是地球上幾乎每個重要的關聯式資料庫都使用的通用語言——從 PostgreSQL、 MySQL和 SQLite 到 SQL Server 和 Oracle 等商業系統。它允許您定義資料結構、儲存資料、高效查詢並強制執行有關該資料行為的規則。
以下是對 SQL 的深入介紹,大約 2,500 字:它是什麼、如何運作以及如何在真實系統中很好地使用它。
SQL 是一種宣告式語言:您描述什麼 資料您想要,資料庫決定如何取得它。 W3Schools 上的 SQL 指南 和 W3Schools.in SQL 系列 等教學將 SQL 介紹為跨多個資料庫引擎儲存、操作和檢索資料的標準語言。
因為 SQL 是標準化的且得到廣泛支援,您可以在以下環境中使用相同的心理模型:
大多數日常業務資 料——訂單、使用者、支付、日誌、分析——最終儲存在您可以用 SQL 查詢的表中。
SQL 由 ISO/IEC 9075 標準系列標準化,該系列定義了核心語言和許多可選擴充。 標準已通過 SQL-86、SQL-92、 SQL:1999、SQL:2003 到 SQL:2023 等版本演變。ANSI 的 SQL 標準 ISO/IEC 9075:2023 摘要等文章解釋了 ANSI 和 ISO 標準如何隨時間對齊。
標準本身分為多個部分,例如:
您可以在 SQL 的 ISO 目錄頁面 和 Modern SQL 的標準部分分解 等資源中查看完整列表。
在實踐中,每個資料庫都實作自己的方言:
核心概念——表、列、欄位、連接、聚合——是可移植的,但 任何非平凡的系統都需要學習特定方言的怪癖和特性。
在核心,SQL 圍繞關聯模型設計: 資料存在於表(關聯)中,其中每一列 代表一個事實,每一欄位描述一個屬性。
典型元素包括:
customers、ordersid、name、 order_date、total_amountid)orders.customer_id → customers.id)正規化指南——如 DigitalOcean 的正規化教學 或 freeCodeCamp 關於 1NF、2NF、3NF 的解釋——將良好的關聯設計框架為通過將資料分解為結構良好的表並用鍵連結它們來最小化冗餘並防止更新異常。
當您使用 SQL 查詢時,您基本上是在問資料庫:"從這些表中, 在這些條件下,我應該看到哪些列和欄位?"
SELECT 陳述式是 SQL 的主力,可能是 最複雜的命令。 SQLite SELECT 參考 稱其為"SQL 語言中最複雜的命令",而 MySQL 的 SELECT 文件 和 SQLite Tutorial 的 SELECT 指南 等教學都逐步介紹了它的許多選項。
SELECT id, name
FROM customers;關鍵部分:
SELECT 列出欄位(或所有欄位的 *, 儘管通常最好明確)。FROM 選擇一個或多個表。WHERE 過濾列。ORDER BY 排序結果。LIMIT 限制您看到的列數。SELECT id, name, created_at
FROM customers
WHERE active = TRUE
ORDER BY created_at DESC
LIMIT 50; W3Schools SQL 教學 和 W3Schools MySQL 對常見命令的概述 等入門教學使用 SELECT 來展示如何在單個、可讀的表達式中從表中提取資料。
當您在查詢中直接組合過濾和表達式時,SQL 表現出色:
SELECT
id,
total_amount,
total_amount * 0.1 AS tax_estimate
FROM orders
WHERE status = 'paid'
AND total_amount >= 100
ORDER BY total_amount DESC;WHERE 子句可以使用比較運算子(=、<>、>、 <)、邏輯運算子(AND、OR、 NOT)、模式匹配(LIKE、 ILIKE)等。MySQL 等資料庫記錄了豐富的 內建函數和運算子 用於數字、字串、日期/時間、JSON 和其他操作。
您還可以:
IN 匹配列表: WHERE status IN ('paid', 'refunded')BETWEEN 表示範圍: WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31'IS NULL / IS NOT NULL 處理缺失值好的教學和手冊強調表達式出現在許多 子句中——WHERE、ORDER BY、HAVING和 甚至 SELECT 本身。MySQL 文件在函數和運算子章節中的表達式求值部分強調了這一點。
真實的資料庫很少將所有內容儲存在單個表中。相反,您 將資料正規化為多個表,並在查詢時連接它們。 連接在 W3Schools 關於 SQL 連接的頁面、 GeeksforGeeks 的連接教學、 TutorialsPoint 的連接概述 和 SQL Practice Online 上的 SQL 連接教學 等資源中得到了廣泛介紹。
SELECT
o.id,
c.name,
o.order_date,
o.total_amount
FROM orders AS o
JOIN customers AS c
ON c.id = o.customer_id;常見的連接類型:
DbSchema 的"SQL 連接解釋"文章 或 LearnSQL.com 的連接範例 等視覺化和程式碼密集的解釋是建立對連接如何運作的強烈直覺的好方法。
要彙總資料——總和、平均值、計數——您使用 聚合函數(COUNT、SUM、 AVG、MIN、MAX)與 GROUP BY:
SELECT
customer_id,
COUNT(*) AS order_count,
SUM(total_amount) AS total_spent
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(total_amount) >= 1000
ORDER BY total_spent DESC;MySQL 的函數和運算子章節 和 PostgreSQL 的聚合和視窗函數文件 等參考資料列出了您可以在這些表達式中使用的內建函數。
現代 SQL 還支援視窗函數,允許您在仍返回 單個列的同時在可滑動的列"視窗"上計算聚合——例如,執行總和或排名。 視窗函數通過 SQL:1999 的修改進入 SQL,隨後整合到 SQL:2003 中,如 SQL:1999 和 SQL:2003 標準 的註釋中總結的那樣。
SELECT
customer_id,
order_date,
total_amount,
SUM(total_amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS running_total
FROM orders;這種類型的查詢對於在資料庫中直接進行分析非常強大。
SQL 不僅用於查詢;它還通過資料定義語言 (DDL)陳述式定義 資料的形狀,在 PostgreSQL 的資料定義指南 和 MySQL 的 SQL 陳述式章節 等部分中得到了很好的記錄。
常見的 DDL 命令:
CREATE DATABASE my_app; – 建立資料庫CREATE TABLE customers (...); – 定義表ALTER TABLE customers ADD COLUMN phone TEXT; – 變更表結構DROP TABLE customers; – 刪除表CREATE TABLE customers (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
name TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
active BOOLEAN NOT NULL DEFAULT TRUE
);需要注意的事項:
PRIMARY KEY、 UNIQUE、NOT NULL、CHECK 表達式每個主要的 RDBMS 手冊——PostgreSQL 的 SQL 語言部分、MySQL 的 參考手冊和 SQLite 的 語言參考——強調仔細思考 DDL,因為綱要決策以後很難變更。
SQL 資料庫通常通過交易實作ACID屬性—— 原子性、一致性、隔離性、持久性:
BEGIN;
UPDATE accounts
SET balance = balance - 200
WHERE id = 1;
UPDATE accounts
SET balance = balance + 200
WHERE id = 2;
COMMIT;如果 BEGIN 和 COMMIT 之間有任何失敗,交易 可以回滾以防止中間變更洩漏到資料庫中。
MySQL 關於 交易和鎖定陳述式 的部分涵蓋 START TRANSACTION、COMMIT、 ROLLBACK 和儲存點,而 PostgreSQL 關於 並發控制 和 交易管理 的章節解釋了隔離級別和 MVCC 在底層如何運作。
約束——如外鍵或檢查約束——是資料庫 執行業務規則的方式:
ALTER TABLE orders
ADD CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id)
REFERENCES customers (id);如果使用得當,它們將您的資料庫變成不變數的守護者, 在源頭防止無效資料,而不是僅僅依賴應用程式邏輯。
獲得正確的綱要通常比智能查詢更重要。 正規化是通過結構化表來 減少冗餘和提高一致性的過程。教學如:
典型的進展:
過度正規化可能會損害效能並使查詢複雜化;實用的 團隊通常正規化到 3NF,然後在效能需要的地方選擇性地反正規化 (例如,快取聚合)。
索引是使 SQL 查詢快速的主要工具。它們是輔助 資料結構,允許資料庫直接跳到相關列,而不是掃描整個表。
一個備受推崇的索引資源是 Markus Winand 的 Use The Index, Luke!,這是一本完全專注於 SQL 效能和索引策略的免費線上書籍。網站的主頁, UseTheIndexLuke.com,以及 "索引 LIKE 過濾器效能調優" 和 "更多索引,更慢的 INSERT" 等文章解釋了索引何時有幫助以及何時有害。
關鍵 思想:
WHERE email = ...、 WHERE created_at >= ...)。(customer_id, created_at) 對於 WHERE customer_id = ? AND created_at >= ? 效果很好。SELECT、UPDATE和 DELETE,但會減慢插入,因為每次插入都必須更新所有相關索引。MSSQLTips 關於設計 SQL Server 索引的文章 等指南展示了索引中欄位的選擇和順序如何影響實際查詢。
實用的經驗法則:
EXPLAIN ANALYZE 來查看查詢的執行方式。雖然基礎保持穩定,但現代 SQL 已經顯著增長:
WITH 的公用表表達式 (CTE) 允許更可讀、更模組化的查詢:WITH recent_orders AS (
SELECT *
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '7 days'
)
SELECT customer_id, COUNT(*)
FROM recent_orders
GROUP BY customer_id;SQL 標準本身已新增了 XML、多維陣列 和屬性圖查詢的部分,如 ISO SQL 標準目錄 和 ANSI SQL 標準文章 等關於 SQL 演變的文章中所記錄的那樣。
現代 SQL 足夠強大,許多應用程式可以將複雜的 邏輯——層次結構、分析、事件處理——推送到資料庫層。
因為 SQL 仍然是資料工作的基礎,有一個豐富的 學習資源生態系統:
實用的學習策略:
WHERE、ORDER BY和 LIMIT 層。GROUP BY回答 "每月收入"或"前 10 名客戶"等問題。EXPLAIN 分析查詢。如果您能夠舒適地讀寫 SQL,您可以直接在生產中檢查 資料,無需匯出到電子表格即可建構報告,通過查看底層表來除錯 應用程式邏輯,並與工程師和分析師更有效地協作。
SQL 處於一個獨特的交叉點:它已有 40 多年的歷史,但在當今雲原生、分析密集的系統中仍然 深度相關。 ISO/IEC 9075 標準 及其許多部分繼續發展,而 PostgreSQL、 MySQL和 SQLite 等開源資料庫推動實用功能和效能改進。
如果您處理資料——開發者、分析師、資料科學家或產品經理——SQL 是讓您直接向資料庫提問的共享語言。值得學習一次,它會在您職業生涯的剩餘時間裡回報。
SQL 格式化是使用適當的縮排、換行和關鍵字大小寫來組織 SQL 查詢的過程,以提高可讀性和可維護性。
我們的格式化器支援多種 SQL 方言,包括 MySQL、PostgreSQL、SQL Server、SQLite、Oracle 等。
是的!所有 SQL 格式化完全在您的瀏覽器中進行。您的查詢永遠不會離開您的電腦,確保完全的隱私和安全性。
是的,您可以一次格式化多個 SQL 語句。格式化器將根據所選方言適當地處理每個語句。
格式化器會嘗試格式化您的 SQL,即使它包含語法錯誤。但是,您可能會看到無法解析的無效 SQL 的錯誤訊息。請始終使用資料庫系統驗證您的 SQL。