SELECT Name,
CASE Level
WHEN 1 THEN '骨灰'
WHEN 2 THEN '大蝦'
WHEN 3 THEN '菜鳥'
END AS Rank
FROM [User];
SELECT StudentID,
CASE
WHEN English >= 90 THEN '優'
WHEN English >= 80 THEN '良'
WHEN English >= 70 THEN '中'
WHEN English >= 60 THEN '可'
ELSE '差'
END AS Grade
FROM Score
ORDER BY English;
SELECT Name,
ISNULL(SUM(CASE Subject WHEN '語文' THEN Result END), 0) AS Chinese,
ISNULL(SUM(CASE Subject WHEN '數學' THEN Result END), 0) AS Math,
ISNULL(SUM(CASE Subject WHEN '物理' THEN Result END), 0) AS Physics
FROM StudentScore
GROUP BY Name;
SELECT 1,
(SELECT SUM(English) FROM Score) AS TotalEnglish,
(SELECT AVG(Age) FROM Student) AS AvgAge;
-- 查詢高一一班、高二一班學生
SELECT * FROM Student
WHERE ClassID IN (SELECT ClassID FROM Class WHERE ClassName IN ('高一一班','高二一班'));
-- 刪除劉備、關羽、張飛成績
DELETE FROM Score
WHERE StudentID IN (SELECT StudentID FROM Student WHERE Name IN ('劉備','關羽','張飛'));
SELECT s.Name,
(SELECT COUNT(*) FROM Score WHERE StudentID = s.StudentID) AS ExamCount
FROM Student s;
SELECT * FROM (SELECT * FROM Student) AS t;
-- 第 1 頁 (前 3 筆)
SELECT TOP 3 * FROM Student ORDER BY StudentID DESC;
-- 第 2 頁
SELECT TOP 3 * FROM Student
WHERE StudentID NOT IN (SELECT TOP 3 StudentID FROM Student ORDER BY StudentID DESC)
ORDER BY StudentID DESC;
DECLARE @PageSize INT = 3, @PageNum INT = 2;
SELECT * FROM (
SELECT ROW_NUMBER() OVER (ORDER BY StudentID DESC) AS RN, *
FROM Student
) AS t
WHERE RN BETWEEN (@PageNum-1)*@PageSize + 1 AND @PageNum*@PageSize;
SELECT * FROM Student
ORDER BY StudentID DESC
OFFSET (@PageNum-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY;
| 類型 | 語法 | 語意 | 結果列數 |
|---|---|---|---|
| CROSS JOIN | A CROSS JOIN B | 笛卡兒積 | A×B |
| INNER JOIN | A INNER JOIN B ON A.k = B.k | 雙方匹配 | 匹配列 |
| LEFT JOIN | A LEFT JOIN B ON A.k = B.k | A 全部 + B 匹配 | A 列數 |
| RIGHT JOIN | A RIGHT JOIN B ON A.k = B.k | B 全部 + A 匹配 | B 列數 |
| FULL JOIN | A FULL JOIN B ON A.k = B.k | 雙方全部 | A+B-匹配 |
-- 內連接:學生與班級資訊
SELECT s.Name, s.Age, c.ClassName
FROM Student s
INNER JOIN Class c ON s.ClassID = c.ClassID
WHERE s.Sex = '女';
-- 左連接:所有班級及其學生 (無學生班級也顯示)
SELECT c.ClassName, s.Name
FROM Class c
LEFT JOIN Student s ON c.ClassID = s.ClassID;
CREATE TABLE Test (Number VARCHAR(10), Amount INT);
INSERT INTO Test VALUES ('RK1',10), ('RK2',20), ('RK3',-30), ('RK4',-10);
SELECT Number,
CASE WHEN Amount > 0 THEN Amount ELSE 0 END AS Income,
CASE WHEN Amount < 0 THEN ABS(Amount) ELSE 0 END AS Expense
FROM Test;
OFFSET FETCH 或 ROW_NUMBER,避免 NOT IN 掃描CASE 運算式在 SELECT 列表中執行成本極低,放心使用掌握 CASE 條件邏輯、子查詢類型與 JOIN 連接語意,是編寫高效、可讀、可維護 SQL 的核心基礎。