萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> ASP 程式設計

ASP 入門教學:SQL 查詢語言 (SELECT) 基礎到進階完全指南

什麼是 SQL?

SQL (Structured Query Language) 是關聯式資料庫的標準操作語言。它非完整程式語言 (無 IF/LOOP),但語法接近英語,易讀易寫。ASP 透過 ADO 將 SQL 送至 DBMS (SQL Server, Access, MySQL...) 執行並取回結果。

SELECT 基本架構 (六大子句)

SELECT [ALL|DISTINCT] 選擇清單
FROM 表來源
[WHERE 搜尋條件]
[GROUP BY 分組欄位]
[HAVING 分組條件]
[ORDER BY 排序欄位 [ASC|DESC]];

只有 SELECT 和 FROM 是必須的。

範例資料表:Sales (銷售記錄)

姓名性別薪資目標實際地區
書生男250080009000上海
吳冠軍男3000100009999北京
雷鳴男2000800010000四川
雪兒女250050006000廣州
顧一男260090009800大連
阿卓女200040004000天津
熠天男40002000020000全國

子句逐一解析

1. SELECT 子句:決定輸出哪些欄位

-- 指定欄位
SELECT 姓名, 目標, 實際 FROM Sales;

-- 所有欄位
SELECT * FROM Sales;

-- 運算式/別名
SELECT 姓名, 實際 - 目標 AS 差額, 實際 * 0.05 AS 提成 FROM Sales;

-- 常數欄位
SELECT '2024報表' AS 來源, 姓名 FROM Sales;

2. FROM 子句:指定資料來源

-- 單表
FROM Sales

-- 多表 (舊式連接)
FROM Sales, Regions
WHERE Sales.地區 = Regions.名稱

-- 多表 (JOIN 標準語法)
FROM Sales
INNER JOIN Regions ON Sales.地區 = Regions.名稱
LEFT JOIN Targets ON Sales.姓名 = Targets.負責人

3. WHERE 子句:列篩選條件

-- 比較運算子
WHERE 實際 > 目標
WHERE 薪資 BETWEEN 2000 AND 3000
WHERE 地區 IN ('上海','北京','廣州')
WHERE 姓名 LIKE '書%'          -- 以 書 開頭
WHERE 備註 IS NULL

-- 邏輯運算子
WHERE 性別 = '男' AND 實際 > 目標
WHERE 地區 = '上海' OR 地區 = '北京'
WHERE NOT (性別 = '女')

4. GROUP BY / HAVING:分組彙總

-- 各地區人數、平均薪資
SELECT 地區, COUNT(*) AS 人數, AVG(薪資) AS 平均薪資
FROM Sales
GROUP BY 地區;

-- 只顯示人數 >= 2 的地區
SELECT 地區, COUNT(*) AS 人數
FROM Sales
GROUP BY 地區
HAVING COUNT(*) >= 2;

差異: WHERE 過濾原始列,HAVING 過濾分組結果。

5. ORDER BY:排序輸出

SELECT 姓名, 目標, 實際
FROM Sales
WHERE 性別 = '男'
ORDER BY 目標 ASC, 實際 DESC;

ASP 整合範例:通用查詢轉 HTML 表格

<!-- 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 ""
    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 ""
        Next
        Response.Write ""
        rs.MoveNext
    Loop
    
    rs.Close: Set rs = Nothing
    conn.Close: Set conn = Nothing
    Response.Write "
" & rs(i).Name & "
" & val & "
" End Sub %>

呼叫端頁面

<!--#include file="subDBTable.inc"-->
<%
Dim qry
qry = "SELECT 姓名, 目標, 實際 FROM Sales WHERE 實際 > 目標 ORDER BY 目標"
Call QueryToTable(qry)
%>

效能與安全提醒

  • 避免 SELECT *,只選需要的欄位
  • WHERE 條件欄位建立索引
  • 使用參數化查詢防止 SQL Injection
  • 大量資料分頁:RS.PageSize + RS.AbsolutePage 或 SQL 分頁 (TOP/LIMIT/OFFSET)
copyright © 萬盛學電腦網 all rights reserved