格式化 SQL
私密與安全
一切都在您的瀏覽器中進行。您的檔案絕不接觸我們的伺服器。
SQL(結構化查詢語言)是地球上幾乎每個重要的關聯式資料庫都使用的通用語言——從 PostgreSQL、 MySQL和 SQLite 到 SQL Server 和 Oracle 等商業系統。它允許您定義資料結構、儲存資料、高效查詢並強制執行有關該資料行為的規則。
以下是對 SQL 的深入介紹,大約 2,500 字:它是什麼、如何運作以及如何在真實系統中很好地使用它。
1. SQL 是什麼(以及為什麼它仍然重要)
SQL 是一種宣告式語言:您描述什麼 資料您想要,資料庫決定如何取得它。 W3Schools 上的 SQL 指南 和 W3Schools.in SQL 系列 等教學將 SQL 介紹為跨多個資料庫引擎儲存、操作和檢索資料的標準語言。
因為 SQL 是標準化的且得到廣泛支援,您可以在以下環境中使用相同的心理模型:
大多數日常業務資料——訂單、使用者、支付、日誌、分析——最終儲存在您可以用 SQL 查詢的表中。
2. SQL 標準和方言
SQL 由 ISO/IEC 9075 標準系列標準化,該系列定義了核心語言和許多可選擴充。 標準已通過 SQL-86、SQL-92、 SQL:1999、SQL:2003 到 SQL:2023 等版本演變。ANSI 的 SQL 標準 ISO/IEC 9075:2023 摘要等文章解釋了 ANSI 和 ISO 標準如何隨時間對齊。
標準本身分為多個部分,例如:
- 第 1 部分(架構)和第 2 部分(基礎)
- API 的第 3 部分(呼叫層級介面)
- 預存程序的第 4 部分(持久儲存模組)
- 後續部分,如SQL/XML、SQL/MED和 甚至用於屬性圖查詢的SQL/PGQ
您可以在 SQL 的 ISO 目錄頁面 和 Modern SQL 的標準部分分解 等資源中查看完整列表。
在實踐中,每個資料庫都實作自己的方言:
- PostgreSQL 新增了擴充,如進階資料類型和全文搜尋, 在 PostgreSQL 手冊 中記錄。
- MySQL 有自己的 SQL 陳述式 和 函數 風格。
- SQLite 支援 SQL 的重要子集,具有一些獨特的行為, 在其 SELECT 文件 中詳細說明。
核心概念——表、列、欄位、連接、聚合——是可移植的,但 任何非平凡的系統都需要學習特定方言的怪癖和特性。
3. 關聯基礎:表、列、鍵
在核心,SQL 圍繞關聯模型設計: 資料存在於表(關聯)中,其中每一列 代表一個事實,每一欄位描述一個屬性。
典型元素包括:
- 表:例如
customers、orders - 欄位:例如
id、name、order_date、total_amount - 主鍵:每列的唯一識別碼(通常是
id) - 外鍵:參照另一個表的主鍵的欄位 (例如
orders.customer_id→customers.id)
正規化指南——如 DigitalOcean 的正規化教學 或 freeCodeCamp 關於 1NF、2NF、3NF 的解釋——將良好的關聯設計框架為通過將資料分解為結構良好的表並用鍵連結它們來最小化冗餘並防止更新異常。
當您使用 SQL 查詢時,您基本上是在問資料庫:"從這些表中, 在這些條件下,我應該看到哪些列和欄位?"
4. 核心查詢:SELECT
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 來展示如何在單個、可讀的表達式中從表中提取資料。
5. 過濾、排序和表達式
當您在查詢中直接組合過濾和表達式時,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 文件在函數和運算子章節中的表達式求值部分強調了這一點。
6. 連接表
真實的資料庫很少將所有內容儲存在單個表中。相反,您 將資料正規化為多個表,並在查詢時連接它們。 連接在 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;常見的連接類型:
- INNER JOIN – 僅在兩個表中都有匹配的列
- LEFT JOIN – 左側表中的所有列,加上右側的匹配
- RIGHT JOIN – 與左連接相反(在某些引擎如 SQLite 中不支援)
- FULL OUTER JOIN – 來自兩側的列,即使不匹配
DbSchema 的"SQL 連接解釋"文章 或 LearnSQL.com 的連接範例 等視覺化和程式碼密集的解釋是建立對連接如何運作的強烈直覺的好方法。
7. 聚合、分組和視窗函數
要彙總資料——總和、平均值、計數——您使用 聚合函數(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;這種類型的查詢對於在資料庫中直接進行分析非常強大。
8. 資料定義:建立和發展綱要
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
);需要注意的事項:
- 資料類型:整數、字串、日期、布林值、JSON 等
- 約束:
PRIMARY KEY、UNIQUE、NOT NULL、CHECK表達式 - 預設值和產生的欄位
每個主要的 RDBMS 手冊——PostgreSQL 的 SQL 語言部分、MySQL 的 參考手冊和 SQLite 的 語言參考——強調仔細思考 DDL,因為綱要決策以後很難變更。
9. 交易、並發和約束
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);如果使用得當,它們將您的資料庫變成不變數的守護者, 在源頭防止無效資料,而不是僅僅依賴應用程式邏輯。
10. 綱要設計和正規化
獲得正確的綱要通常比智能查詢更重要。 正規化是通過結構化表來 減少冗餘和提高一致性的過程。教學如:
- "SQL 中的資料庫正規化——解釋 1NF、2NF、3NF"
- DigitalOcean 的正規化指南
- GeeksforGeeks 關於 DBMS 中的範式
- Guru99 的 1NF–6NF 概述
- Visual Paradigm 的正規化級別指南
典型的進展:
- 1NF:沒有重複組;每欄位包含原子值。
- 2NF:每個非鍵屬性完全依賴於主鍵(對於複合鍵)。
- 3NF:沒有傳遞依賴(非鍵屬性不依賴於其他非鍵屬性)。
過度正規化可能會損害效能並使查詢複雜化;實用的 團隊通常正規化到 3NF,然後在效能需要的地方選擇性地反正規化 (例如,快取聚合)。
11. 索引和查詢效能
索引是使 SQL 查詢快速的主要工具。它們是輔助 資料結構,允許資料庫直接跳到相關列,而不是掃描整個表。
一個備受推崇的索引資源是 Markus Winand 的 Use The Index, Luke!,這是一本完全專注於 SQL 效能和索引策略的免費線上書籍。網站的主頁, UseTheIndexLuke.com,以及 "索引 LIKE 過濾器效能調優" 和 "更多索引,更慢的 INSERT" 等文章解釋了索引何時有幫助以及何時有害。
關鍵思想:
- B-tree 索引加速相等和範圍搜尋(
WHERE email = ...、WHERE created_at >= ...)。 - 複合索引考慮欄位順序——例如,
(customer_id, created_at)對於WHERE customer_id = ? AND created_at >= ?效果很好。 - 索引有助於帶過濾器的
SELECT、UPDATE和DELETE,但會減慢插入,因為每次插入都必須更新所有相關索引。
MSSQLTips 關於設計 SQL Server 索引的文章 等指南展示了索引中欄位的選擇和順序如何影響實際查詢。
實用的經驗法則:
- 索引您的主鍵和頻繁的連接/過濾欄位。
- 避免索引每一欄位——過多的索引會殺死寫入效能。
- 使用資料庫的EXPLAIN/
EXPLAIN ANALYZE來查看查詢的執行方式。
12. 現代 SQL 特性:CTE、JSON 等
雖然基礎保持穩定,但現代 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; - JSON 支援允許您將半結構化資料與 關聯表混合。PostgreSQL、MySQL 和其他系統在其手冊中記錄了廣泛的 JSON 函數,例如 MySQL 的 JSON 特性列在 JSON 函數 下。
- 進階資料類型(陣列、hstore、幾何、 全文搜尋)在 PostgreSQL 的資料類型和索引章節中 PostgreSQL 手冊 中描述。
SQL 標準本身已新增了 XML、多維陣列 和屬性圖查詢的部分,如 ISO SQL 標準目錄 和 ANSI SQL 標準文章 等關於 SQL 演變的文章中所記錄的那樣。
現代 SQL 足夠強大,許多應用程式可以將複雜的 邏輯——層次結構、分析、事件處理——推送到資料庫層。
13. 有效學習 SQL
因為 SQL 仍然是資料工作的基礎,有一個豐富的 學習資源生態系統:
- 互動式教學,如 W3Schools SQL 教學 和 W3Schools.in SQL 課程索引 涵蓋語法、查詢和範例,帶有瀏覽器內編輯器。
- 結構化培訓,如 W3Schools SQL 培訓 和 SQL Bootcamp 提供練習、自動評分和認證。
- 實踐導向的網站,如 SQL Practice Online 的連接教學 和許多其他網站提供實際問題來解決。
- 專業資源,如 Use The Index, Luke! 專注於效能和索引,在基礎 SQL 和生產級調優之間架起橋樑。
實用的學習策略:
- 掌握 SELECT 和基本過濾。從簡單的 查詢開始,逐步新增
WHERE、ORDER BY和LIMIT層。 - 熟悉連接。練習所有連接類型 直到您可以自信地預測結果。
- 新增分組和聚合。學習使用
GROUP BY回答 "每月收入"或"前 10 名客戶"等問題。 - 學習綱要設計。研究正規化並練習 建模真實系統——例如商店、預訂系統、社交網路。
- 探索您最喜歡的引擎的特性。閱讀資料庫的官方文件——PostgreSQL 的 SQL 語言部分、MySQL 的 參考手冊或 SQLite 的 語言參考——以發現引擎特定的工具。
- 最後,學習效能。使用 Use The Index, Luke! 和類似資源中的概念進行索引實驗,並使用
EXPLAIN分析查詢。
如果您能夠舒適地讀寫 SQL,您可以直接在生產中檢查 資料,無需匯出到電子表格即可建構報告,通過查看底層表來除錯 應用程式邏輯,並與工程師和分析師更有效地協作。
14. 大局
SQL 處於一個獨特的交叉點:它已有 40 多年的歷史,但在當今雲原生、分析密集的系統中仍然 深度相關。 ISO/IEC 9075 標準 及其許多部分繼續發展,而 PostgreSQL、 MySQL和 SQLite 等開源資料庫推動實用功能和效能改進。
如果您處理資料——開發者、分析師、資料科學家或產品經理——SQL 是讓您直接向資料庫提問的共享語言。值得學習一次,它會在您職業生涯的剩餘時間裡回報。
常見問題
什麼是 SQL 格式化?
SQL 格式化是使用適當的縮排、換行和關鍵字大小寫來組織 SQL 查詢的過程,以提高可讀性和可維護性。
支援哪些 SQL 方言?
我們的格式化器支援多種 SQL 方言,包括 MySQL、PostgreSQL、SQL Server、SQLite、Oracle、MariaDB、BigQuery、DB2、Redshift、Spark、Snowflake、Trino、Presto 等。
我的 SQL 程式碼安全嗎?
是的!所有 SQL 格式化完全在您的瀏覽器中進行。您的查詢永遠不會離開您的電腦,確保完全的隱私和安全性。
我可以格式化多個 SQL 語句嗎?
是的,您可以一次格式化多個 SQL 語句。格式化器將根據所選方言適當地處理每個語句。
如果我的 SQL 有語法錯誤怎麼辦?
格式化器會嘗試格式化您的 SQL,即使它包含語法錯誤。但是,您可能會看到無法解析的無效 SQL 的錯誤訊息。請始終使用資料庫系統驗證您的 SQL。