SQL (Structured Query Language) 是關聯式資料庫的標準操作語言。它非完整程式語言 (無 IF/LOOP),但語法接近英語,易讀易寫。ASP 透過 ADO 將 SQL 送至 DBMS (SQL Server, Access, MySQL...) 執行並取回結果。
SELECT [ALL|DISTINCT] 選擇清單
FROM 表來源
[WHERE 搜尋條件]
[GROUP BY 分組欄位]
[HAVING 分組條件]
[ORDER BY 排序欄位 [ASC|DESC]];
只有 SELECT 和 FROM 是必須的。
| 姓名 | 性別 | 薪資 | 目標 | 實際 | 地區 |
|---|---|---|---|---|---|
| 書生 | 男 | 2500 | 8000 | 9000 | 上海 |
| 吳冠軍 | 男 | 3000 | 10000 | 9999 | 北京 |
| 雷鳴 | 男 | 2000 | 8000 | 10000 | 四川 |
| 雪兒 | 女 | 2500 | 5000 | 6000 | 廣州 |
| 顧一 | 男 | 2600 | 9000 | 9800 | 大連 |
| 阿卓 | 女 | 2000 | 4000 | 4000 | 天津 |
| 熠天 | 男 | 4000 | 20000 | 20000 | 全國 |
-- 指定欄位
SELECT 姓名, 目標, 實際 FROM Sales;
-- 所有欄位
SELECT * FROM Sales;
-- 運算式/別名
SELECT 姓名, 實際 - 目標 AS 差額, 實際 * 0.05 AS 提成 FROM Sales;
-- 常數欄位
SELECT '2024報表' AS 來源, 姓名 FROM Sales;
-- 單表
FROM Sales
-- 多表 (舊式連接)
FROM Sales, Regions
WHERE Sales.地區 = Regions.名稱
-- 多表 (JOIN 標準語法)
FROM Sales
INNER JOIN Regions ON Sales.地區 = Regions.名稱
LEFT JOIN Targets ON Sales.姓名 = Targets.負責人
-- 比較運算子
WHERE 實際 > 目標
WHERE 薪資 BETWEEN 2000 AND 3000
WHERE 地區 IN ('上海','北京','廣州')
WHERE 姓名 LIKE '書%' -- 以 書 開頭
WHERE 備註 IS NULL
-- 邏輯運算子
WHERE 性別 = '男' AND 實際 > 目標
WHERE 地區 = '上海' OR 地區 = '北京'
WHERE NOT (性別 = '女')
-- 各地區人數、平均薪資
SELECT 地區, COUNT(*) AS 人數, AVG(薪資) AS 平均薪資
FROM Sales
GROUP BY 地區;
-- 只顯示人數 >= 2 的地區
SELECT 地區, COUNT(*) AS 人數
FROM Sales
GROUP BY 地區
HAVING COUNT(*) >= 2;
差異: WHERE 過濾原始列,HAVING 過濾分組結果。
SELECT 姓名, 目標, 實際
FROM Sales
WHERE 性別 = '男'
ORDER BY 目標 ASC, 實際 DESC;
<!-- subDBTable.inc -->
<%
Sub QueryToTable(sql)
Dim conn, rs, fldCount, i
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DSN=Student;uid=student;pwd=aspmagic"
Set rs = conn.Execute(sql)
fldCount = rs.Fields.Count - 1
Response.Write ""
For i = 0 To fldCount
Response.Write "" & rs(i).Name & " "
Next
Response.Write " "
Do While Not rs.EOF
Response.Write ""
For i = 0 To fldCount
Dim val : val = rs(i)
If IsNull(val) Then val = " "
Response.Write "" & val & " "
Next
Response.Write " "
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
conn.Close: Set conn = Nothing
Response.Write "
"
End Sub
%>
<!--#include file="subDBTable.inc"-->
<%
Dim qry
qry = "SELECT 姓名, 目標, 實際 FROM Sales WHERE 實際 > 目標 ORDER BY 目標"
Call QueryToTable(qry)
%>
SELECT *,只選需要的欄位RS.PageSize + RS.AbsolutePage 或 SQL 分頁 (TOP/LIMIT/OFFSET)