以「學生成績管理資料庫」為情境,彙整新手最常用的 SQL 查詢模式與技巧,助您快速上手關聯式資料庫操作。
-- 使用 AS 關鍵字
SELECT name AS '姓名' FROM students ORDER BY age;
-- 直接指定別名
SELECT name '姓名' FROM students ORDER BY age;
SELECT * FROM students WHERE native IN ('湖南','四川');SELECT * FROM students WHERE age BETWEEN 20 AND 30;SELECT * FROM students WHERE name = '李山';name LIKE '李%' — 以「李」開頭name LIKE '%李%' — 含「李」者name LIKE '_李%' — 第二字為「李」SELECT * FROM courses WHERE cno LIKE '[AC]%'; 或 '[A-C]%'smalldatetime 可直接以字串比較:
SELECT * FROM students
WHERE birth >= '1980-1-1' AND birth <= '1980-12-31';
COUNT(*) — 統計筆數:SELECT COUNT(*) FROM students;AVG(欄位) — 平均值:SELECT AVG(mark) FROM grades WHERE cno='B2';MAX(欄位) / MIN(欄位) — 最大/最小值-- 單欄分組:統計男女生人數
SELECT gender, COUNT(sno) FROM students GROUP BY gender;
-- 多重分組:各屆、各系、各性別人數
SELECT grade, mno, gender, COUNT(*)
FROM students
GROUP BY grade, mno, gender;
HAVING 過濾分組: 查詢不及格超過 1 門的學生
SELECT sno, COUNT(*)
FROM grades
WHERE mark < 60
GROUP BY sno
HAVING COUNT(*) > 1;
SELECT * FROM students WHERE name LIKE '張%'
UNION [ALL]
SELECT * FROM students WHERE name LIKE '李%';
UNION 去重,UNION ALL 保留重複。
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;
SELECT courses.cno, MAX(coursename), COUNT(sno)
FROM courses LEFT JOIN grades ON courses.cno = grades.cno
GROUP BY courses.cno;
SELECT sno, name, major
FROM students FULL JOIN majors ON students.mno = majors.mno;
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;
SELECT * FROM students
WHERE native IN (SELECT native FROM students WHERE name = '李山');
SELECT * FROM students
WHERE EXISTS (
SELECT * FROM grades
WHERE grades.sno = students.sno AND cno = 'B2'
);
ASC 升序(預設),DESC 降序ORDER BY 3 表示按第三欄排序[] 括住WHERE mark IS NULLANY 相當邏輯 OR,ALL 相當邏輯 AND-- 錯誤寫法(會產生笛卡兒積導致錯誤結果)
SELECT students.* FROM students, grades
WHERE students.sno = grades.sno AND grades.cno <> 'B2';
-- 正確寫法:使用 NOT EXISTS
SELECT * FROM students
WHERE NOT EXISTS (
SELECT * FROM grades
WHERE grades.sno = students.sno AND cno = 'B2'
);
SELECT * FROM students
WHERE NOT EXISTS (
SELECT * FROM courses
WHERE NOT EXISTS (
SELECT * FROM grades
WHERE sno = students.sno AND cno = courses.cno
)
);
外層排除「存在未選課程」的學生,中層從課程表找出未被選修的課程,內層驗證該學生是否選修該課程。