首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 基礎語法速查手冊:從別名、精確查詢到多表連接與巢狀子查詢

     編輯:關於SqlServer

前言

以「學生成績管理」資料庫為情境,彙整常用 SQL 查詢語法模式,涵蓋欄位別名、篩選條件、日期處理、彙總函數、分組統計、集合運算、多表連接、子查詢、排序技巧與實務陷阱,供快速查閱與實戰參考。

1. 欄位別名顯示

-- 方式 A:AS 關鍵字
SELECT name AS '姓名' FROM students ORDER BY age;

-- 方式 B:直接指定
SELECT name '姓名' FROM students ORDER BY age;

2. 精確查找與模糊比對

需求語法範例
列舉值範圍`WHERE native IN ('湖南','四川')`
數值區間`WHERE age BETWEEN 20 AND 30`
等值比對`WHERE name = '李山'`
前綴模糊`WHERE name LIKE '李%'`
包含關鍵字`WHERE name LIKE '%李%'`
第二字為李`WHERE name LIKE '_李%'`
字元集合/範圍`WHERE cno LIKE '[AC]%'` 或 `LIKE '[A-C]%'`

3. 日期時間處理 (smalldatetime)

SELECT * FROM students
WHERE birth >= '1980-01-01' AND birth <= '1980-12-31';

直接以字串常數比對,SQL Server 隱含轉換。

4. 彙總函數

  • `COUNT(*)`:筆數統計,如 `SELECT COUNT(*) FROM students`
  • `AVG(col)`:平均值,如 `SELECT AVG(mark) FROM grades WHERE cno='B2'`
  • `MAX(col)` / `MIN(col)`:極值

5. GROUP BY 分組統計

-- 單欄分組
SELECT gender, COUNT(sno) FROM students GROUP BY gender;

-- 多重分組
SELECT grade, mno, gender, COUNT(*)
FROM students
GROUP BY grade, mno, gender;

HAVING 過濾群組:

SELECT sno, COUNT(*)
FROM grades
WHERE mark < 60
GROUP BY sno
HAVING COUNT(*) > 1;  -- 不及格超過 1 門

6. UNION 集合運算

SELECT * FROM students WHERE name LIKE '張%'
UNION [ALL]
SELECT * FROM students WHERE name LIKE '李%';

`UNION` 去重,`UNION ALL` 保留重複,效能較佳。

7. 多表連接 (JOIN)

內連接

SELECT g.sno, s.name, c.coursename
FROM grades g
JOIN students s ON g.sno = s.sno
JOIN courses c ON g.cno = c.cno;

外連接

  • LEFT JOIN: 保留左表所有列,右表無對應則 NULL。
  • RIGHT JOIN: 保留右表所有列。
  • FULL JOIN: 兩表所有列皆保留。
-- LEFT JOIN 範例:顯示所有課程及修課人數
SELECT courses.cno, MAX(coursename), COUNT(sno)
FROM courses LEFT JOIN grades ON courses.cno = grades.cno
GROUP BY courses.cno;

自我連接

SELECT c1.cno, c1.coursename, c1.pno, c2.coursename
FROM courses c1, courses c2
WHERE c1.pno = c2.cno;

交叉連接

SELECT lastname + firstname
FROM lastname CROSS JOIN firstname;  -- 笛卡兒積

8. 巢狀子查詢

IN 子查詢

SELECT * FROM students
WHERE native IN (SELECT native FROM students WHERE name = '李山');

EXISTS 子查詢 (相關子查詢)

SELECT * FROM students
WHERE EXISTS (
    SELECT * FROM grades
    WHERE grades.sno = students.sno AND cno = 'B2'
);

兩者語意等價,`EXISTS` 在大資料集下常具效能優勢。

9. ORDER BY 排序技巧

  • `ASC` 升序 (預設)、`DESC` 降序。
  • 可用 SELECT 清單位置序號排序:`ORDER BY 3` 代表第 3 個欄位 (`AVG(mark)`)。

10. 實務常見陷阱與技巧

主題說明
含空格識別名用 `[]` 括住,如 `[Student Name]`
NULL 判斷`WHERE mark IS NULL`,不可用 `= NULL`
ANY vs ALL`ANY` 相當 OR 邏輯,`ALL` 相當 AND 邏輯
否定查詢陷阱`WHERE cno <> 'B2'` 仍會回傳有其他課程的學生;正確用 `NOT EXISTS`
多重 NOT EXISTS 模式「選修所有課程的學生」:最外層排除「存在未選修課程」的學生

11. 進階:關係除法模式 (選修全部課程)

SELECT * FROM students
WHERE NOT EXISTS (
    SELECT * FROM courses
    WHERE NOT EXISTS (
        SELECT * FROM grades
        WHERE grades.sno = students.sno
          AND grades.cno = courses.cno
    )
);

邏輯:找出「不存在任何一門課程是該學生未選修的」學生。

總結

熟練掌握上述語法模式,並理解 `EXISTS`/`NOT EXISTS`、連接類型、子查詢相關性對執行計畫的影響,能撰寫出正確且高效的 SQL 查詢。建議搭配查詢最佳化器圖形化執行計畫驗證實際存取路徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved