首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL 查詢練習題:學生-課程-成績三表關聯,查詢計算機導論成績高於「高峰」的學生姓名

     編輯:程式設計疑難解答

經典三表關聯查詢:student(學生)、course(課程)、scores(成績)。題目:查詢「計算機導論」課程成績高於學生「高峰」的學生姓名。

表結構假設

student(no PK, name, ...)
course(cno PK, cname, ...)
scores(no FK, cno FK, grades, ...)

標準 SQL(子查詢 + 多表連接)

SELECT s.name
FROM student s
JOIN scores sc ON s.no = sc.no
JOIN course c ON sc.cno = c.cno
WHERE c.cname = '計算機導論'
  AND sc.grades > (
      SELECT sc2.grades
      FROM student s2
      JOIN scores sc2 ON s2.no = sc2.no
      JOIN course c2 ON sc2.cno = c2.cno
      WHERE s2.name = '高峰' AND c2.cname = '計算機導論'
  );

解析

  1. 子查詢:先查出「高峰」在「計算機導論」的成績。
  2. 主查詢:連接三表,篩選課程名 = '計算機導論' 且成績 > 子查詢結果的學生。
  3. 使用別名 s, sc, c 簡化寫法,避免列名衝突。

等效 JOIN 寫法(無子查詢,MySQL 8.0+/PostgreSQL 支援 CTE)

WITH feng_grade AS (
    SELECT sc.grades
    FROM student s
    JOIN scores sc ON s.no = sc.no
    JOIN course c ON sc.cno = c.cno
    WHERE s.name = '高峰' AND c.cname = '計算機導論'
)
SELECT s.name
FROM student s
JOIN scores sc ON s.no = sc.no
JOIN course c ON sc.cno = c.cno
CROSS JOIN feng_grade fg
WHERE c.cname = '計算機導論' AND sc.grades > fg.grades;

避坑提醒

  • 題目未給表結構,實際寫 SQL 時**必須確認表名、列名、主外鍵關係**。
  • 子查詢可能返回多行(高峰重修多次),用 > ALL 或 > (SELECT MAX(...))。
  • 若無「高峰」記錄,子查詢返回 NULL,主查詢結果為空(符合邏輯)。

三表關聯查詢核心:**明確主外鍵路徑 → 選擇連接類型 → 逐層添加篩選條件**。多練幾道,肌肉記憶自然形成。

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