彙整 SQL 常用查詢模式,含 WHERE 條件運算、LIKE 模糊比對、聚合統計、子查詢(單行/多行)、內連接/外連接,適合初學者建立查詢思維與語法肌肉記憶。
-- 總筆數
SELECT COUNT(1) FROM student;
-- 姓張的人數
SELECT COUNT(*) FROM student WHERE realName LIKE '張%';
-- 姓張且雙字名
SELECT COUNT(*) FROM student WHERE realName LIKE '張_';
-- 戶籍含「杭州」
SELECT COUNT(*) FROM student WHERE home LIKE '%杭州%';
-- 每位學生年齡 (MySQL 語法)
SELECT realName, YEAR(NOW()) - YEAR(birthday) AS age FROM student;
-- 90 年後出生
SELECT realName FROM student WHERE YEAR(birthday) >= 1990;
-- 1987-1990 年出生
SELECT realName FROM student WHERE YEAR(birthday) BETWEEN 1987 AND 1990;
-- 男女生人數
SELECT sex, COUNT(*) FROM student GROUP BY sex;
-- 血型 B 或 O
SELECT realName, blood FROM student WHERE blood IN ('B','O');
-- 薪資高於 ALLEN 或 KING 的員工
SELECT * FROM emp
WHERE sal > (SELECT sal FROM emp WHERE ename = 'ALLEN')
OR sal > (SELECT sal FROM emp WHERE ename = 'KING');
特性:子查詢先執行、需括號、習慣置於條件右側。
-- 薪資大於部門 30 任一員工
SELECT * FROM emp WHERE sal > SOME (SELECT sal FROM emp WHERE deptno = 30);
-- 薪資大於部門 30 所有員工
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30);
-- 學生-成績-課程 三表聯查
SELECT a.realname, c.courseName, b.score
FROM stu_student a
INNER JOIN stu_score b ON a.sid = b.sid
INNER JOIN stu_course c ON b.cid = c.cid;
舊式寫法(不推薦):
SELECT a.realname, c.courseName, b.score
FROM student a, score b, course c
WHERE a.sid = b.sid AND c.cid = b.cid;
-- 左外連:所有學生,無成績者 score 顯示 NULL
SELECT a.realname, b.score
FROM stu_student a
LEFT OUTER JOIN stu_score b ON a.sid = b.sid;
-- 右外連:所有成績,無對應學生者 realname 顯示 NULL
SELECT a.realname, b.score
FROM stu_student a
RIGHT OUTER JOIN stu_score b ON a.sid = b.sid;
| 類型 | 結果集包含 | 典型用途 |
|---|---|---|
| INNER JOIN | 雙方皆有對應的列 | 主流業務查詢 |
| LEFT JOIN | 左表全部 + 右表匹配 | 主表帶明細、報表列出所有主體 |
| RIGHT JOIN | 右表全部 + 左表匹配 | 較少用,可改 LEFT JOIN 交換順序 |
| FULL JOIN | 雙方全部 | 雙向完整比對 |
student/score/course 範例資料。LEFT JOIN 找出「從未選課的學生」。IN vs EXISTS 效能差異。熟練這些核心查詢模式,能應付 80% 以上的業務報表與資料分析需求。