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

經典 SQL 考試題深度解析:非正規化資料表的多維查詢挑戰

     編輯:關於SqlServer

題目背景

單一二維表 T(F1-F7) 儲存學生、課程、成績、教師資訊,嚴重違反正規化原則 (重複群組、部分相依、轉移相依)。題目要求在不結構變更前提下完成多維查詢。

資料樣本 (節錄)

學生ID姓名課程ID課程成績教師ID教師
S3王五K4政治53T4趙老師
S1張三K1數學61T1張老師
S2李四K3英文88T3李老師
S1張三K4政治77T4趙老師
S2李四K4政治67T5周老師
S3王五K2國文90T2王老師
S3王五K1數學55T1張老師
S1張三K2國文81T2王老師
S4趙六K2國文59T1王老師
S1張三K3英文37T3李老師
S2李四K1數學81T1張老師

核心挑戰與解題思路

1. 同一學生多門課程 → 需分組彙總

-- 學生平均成績
SELECT 學生ID, 學生姓名, AVG(成績) AS 平均成績
FROM T
GROUP BY 學生ID, 學生姓名

2. 同一課程多位教師 (政治: 趙老師/周老師) → 霻去重或特定邏輯

-- 課程對應教師 (取第一筆或全部)
SELECT DISTINCT 課程ID, 課程名稱, 教師ID, 教師姓名
FROM T

3. 教師姓名不唯一 (王老師對應 T1/T2) → 必須用 ID 區分

-- 正確關聯教師
SELECT T1.教師ID, T1.教師姓名, COUNT(*) AS 授課門數
FROM T T1
GROUP BY T1.教師ID, T1.教師姓名

4. 找出「修過數學且成績>80的學生」

SELECT DISTINCT 學生ID, 學生姓名
FROM T
WHERE 課程名稱='數學' AND 成績>80

進階考點:分組條件與 Having

-- 平均成績超過 70 分的學生
SELECT 學生ID, 學生姓名, AVG(成績) AS 平均
FROM T
GROUP BY 學生ID, 學生姓名
HAVING AVG(成績) > 70

教學啟示

  • 非正規化資料表查詢極易產生邏輯錯誤 (重複計算、錯誤關聯)
  • 考題測試:對資料品質問題的敏感度、GROUP BY/HAVING 掌握度、DISTINCT 正確使用
  • 實務建議:若有權限,**優先正規化拆分**為 Student、Course、Teacher、Score 四表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved