sql-querylisted
Install: claude install-skill CloudyWing/ai-dotfiles
# SQL 撰寫規範
本規範涵蓋 SQL Server(T-SQL)與 Oracle 兩種資料庫的原生 SQL 撰寫,內容包含查詢、DML、交易與可讀性格式。規範分三層,先列兩庫共通規範,再分列 SQL Server 專屬與 Oracle 專屬語法。撰寫或審查原生 SQL 時自動套用。
## 共通規範
以下規範對 SQL Server 與 Oracle 皆適用。
### 查詢格式與可讀性
- **關鍵字大寫**:`SELECT`、`FROM`、`WHERE`、`JOIN`、`ON`、`GROUP BY`、`ORDER BY`、`INSERT`、`UPDATE`、`DELETE` 等 SQL 關鍵字一律大寫。
- **內建函式名大寫**:`COUNT`、`SUM`、`SYSDATE`、`NVL`、`SUBSTR` 等內建函式名一律大寫,與關鍵字風格一致。
- **縮排**:使用 4 個空格,不使用 Tab。
- **每個子句獨立一行**:`SELECT`、`FROM`、`WHERE`、`JOIN`、`GROUP BY`、`ORDER BY`、`HAVING` 各佔一行。
- **逗號前置**:多欄位 `SELECT` 時,逗號置於行首以利增刪欄位時的 diff 乾淨度。
```sql
SELECT
o.OrderId
,o.OrderDate
,c.CustomerName
,SUM(d.Quantity * d.UnitPrice) AS TotalAmount
FROM Orders o
INNER JOIN Customers c
ON o.CustomerId = c.CustomerId
INNER JOIN OrderDetails d
ON o.OrderId = d.OrderId
WHERE o.OrderDate >= @StartDate
AND o.Status = @Status
GROUP BY
o.OrderId
,o.OrderDate
,c.CustomerName
HAVING SUM(d.Quantity * d.UnitPrice) > @MinAmount
ORDER BY o.OrderDate DESC;
```
### 識別字大小寫
- 資料表名與欄位名照定義時的原始大小寫書寫,不刻意全大寫或全小寫。
- SQL Server 預設依 collation 判斷識別字,一般不區分大小寫;Oracle 對未加雙引號的識別字有折疊行為,見 Oracle 專屬節的「識別字大小寫折疊」。
### 資料表與欄位別名
兩種別名採不同規則,此組合在 SQL Server 與 Oracle 皆合法且行為一致。
- **資料表別名一律不加 `AS`**:寫 `FROM Orders o`,不寫 `FROM Orders AS o`。Oracle 的資料表別名禁止加 `AS`(加了會回 `ORA-00933`),SQL Server 則加不加皆可,因此統一不加以求雙庫一致。
- **欄位別名一律加 `AS`**:寫 `SUM(...) AS TotalAmount`。`AS` 在此處是防呆哨兵,漏寫逗號時多欄位不會被靜默併成別名,而是直接語法錯誤,便於即時發現。
- **別名簡短且有意義**:資料表別名通常取名稱首字母小寫(如 `Orders o`、`CustomerAddresses ca`)。
```sql
-- ❌