文章目錄

  • 1.概述
  • 2.構建測試表
  • 3.插入數據
  • 4.測試常規分類場景
  • 4.1業務價值
  • 4.2業務場景
  • 4.3測試實例
  • 4.3.1代碼示例
  • 4.3.2運行結果
  • 5.測試教育數據的多維度交叉分類
  • 5.1業務價值
  • 5.2業務場景
  • 5.3測試實例
  • 5.3.1代碼示例
  • 5.3.2運行結果
  • 6.教育數據的計算型分類場景
  • 6.1業務價值
  • 6.2業務場景
  • 6.3測試實例
  • 6.3.1代碼示例
  • 6.3.2運行結果
  • 7.測評總結

1.概述

SQL99引入的CASE WHEN語法解決了SQL92中條件分類的繁瑣問題,其“多分支條件匹配”特性完美適配在線教育場景中“成績分級、學習狀態評估、課程難度匹配”等核心需求。
在K12教育信息化建設中,業務教育數據(如學生成績、教師授課數據、學習行為數據等)的多維度分類是學情分析、教學決策的核心支撐。CASE WHEN語句作為實現條件判斷與靈活分類的核心語法,其對SQL99規範的兼容性及功能完整性,直接影響K12教育數據處理的效率與準確性。
本次測評以openGauss數據庫為對象,基於K12教育業務模型,聚焦學生成績分析、學習狀態評估等核心場景,從基礎語法、複雜嵌套、NULL值處理、函數結合四個維度展開全場景測試,驗證openGauss對SQL99規範的兼容能力與業務落地價值。
本次測評採用的openGauss版本為6.0.2(CentOS7-x86_64),測試環境為CentOS 7操作系統,內存64GB,存儲採用SSD硬盤,確保硬件環境對數據庫性能的干擾最小化。測試數據基於K12教育業務模型構建,涵蓋學生信息表(student_info)、成績表(score_detail)、教師授課表(teacher_lesson)、出勤詳情表(attendance_detail),數據量分別為1萬條、1萬條、1萬條及3萬條,完整復現K12場景中學生、成績、教學、出勤的核心數據特徵。

2.構建測試表

-- 1. 生成學生信息表測試數據(10萬條)
INSERT INTO student_info (student_id, student_name, gender, grade, admission_date, major)
SELECT 
    -- 構造學號:G+年級編碼(10=高一,11=高二,12=高三)+班級編碼(01-10)+序號(001-333)
    'G' || (10 + (i % 3)) || lpad(((i % 10) + 1)::VARCHAR, 2, '0') || lpad(((i % 333) + 1)::VARCHAR, 3, '0') AS student_id,
    -- 構造隨機姓名(2-3個漢字,基於Unicode編碼)
    chr(19968 + (random() * 20901)::INT) || 
    chr(19968 + (random() * 20901)::INT) || 
    CASE WHEN random() > 0.5 THEN chr(19968 + (random() * 20901)::INT) ELSE '' END AS student_name,
    -- 隨機性別
    CASE WHEN random() > 0.5 THEN '男' ELSE '女' END AS gender,
    -- 隨機年級班級
    CASE (10 + (i % 3)) 
        WHEN 10 THEN '高一(' || ((i % 10) + 1) || '班)'
        WHEN 11 THEN '高二(' || ((i % 10) + 1) || '班)'
        WHEN 12 THEN '高三(' || ((i % 10) + 1) || '班)'
    END AS grade,
    -- 隨機入學日期(近3年)
    CURRENT_DATE - INTERVAL '3 years' + (random() * INTERVAL '3 years')::INTERVAL AS admission_date,
    -- 隨機專業方向
    CASE WHEN (i % 3) = 0 THEN '文科' WHEN (i % 3) = 1 THEN '理科' ELSE '綜合' END AS major
FROM generate_series(1, 100000) AS t(i);

-- 2. 生成成績表測試數據(10萬條,關聯學生信息表)
INSERT INTO score_detail (student_id, chinese_score, math_score, english_score, politics_score, history_score, physics_score, exam_date)
SELECT 
    si.student_id,
    -- 語文成績:50-100分,10%概率為NULL(模擬數據缺失)
    CASE WHEN random() < 0.1 THEN NULL ELSE (50 + random() * 50)::NUMERIC(5,1) END AS chinese_score,
    -- 數學成績:50-100分,8%概率為NULL
    CASE WHEN random() < 0.08 THEN NULL ELSE (50 + random() * 50)::NUMERIC(5,1) END AS math_score,
    -- 英語成績:50-100分,9%概率為NULL
    CASE WHEN random() < 0.09 THEN NULL ELSE (50 + random() * 50)::NUMERIC(5,1) END AS english_score,
    -- 政治成績:文科生成,理科為NULL
    CASE WHEN si.major = '文科' THEN (50 + random() * 50)::NUMERIC(5,1) ELSE NULL END AS politics_score,
    -- 歷史成績:文科生成,理科為NULL
    CASE WHEN si.major = '文科' THEN (50 + random() * 50)::NUMERIC(5,1) ELSE NULL END AS history_score,
    -- 物理成績:理科生成,文科為NULL
    CASE WHEN si.major = '理科' THEN (50 + random() * 50)::NUMERIC(5,1) ELSE NULL END AS physics_score,
    -- 考試日期:近1年的隨機日期
    CURRENT_DATE - INTERVAL '1 year' + (random() * INTERVAL '1 year')::INTERVAL AS exam_date
FROM student_info si
LIMIT 100000;

-- 3. 生成教師授課表測試數據(10萬條)
INSERT INTO teacher_lesson (teacher_id, teacher_name, lesson_name, lesson_hour, grade, lesson_date)
SELECT 
    -- 構造教師工號:T+學科編碼+序號
    'T' || 
    CASE (i % 6) 
        WHEN 0 THEN 'Chinese' WHEN 1 THEN 'Math' WHEN 2 THEN 'English'
        WHEN 3 THEN 'Politics' WHEN 4 THEN 'History' WHEN 5 THEN 'Physics'
    END || lpad(((i % 100) + 1)::VARCHAR, 2, '0') AS teacher_id,
    -- 構造教師姓名
    chr(19968 + (random() * 20901)::INT) || chr(19968 + (random() * 20901)::INT) AS teacher_name,
    -- 構造課程名稱
    CASE (i % 6) 
        WHEN 0 THEN '高一語文' WHEN 1 THEN '高二數學' WHEN 2 THEN '高三英語'
        WHEN 3 THEN '高一政治' WHEN 4 THEN '高二歷史' WHEN 5 THEN '高三物理'
    END AS lesson_name,
    -- 授課時長:5-60課時,15%概率為NULL
    CASE WHEN random() < 0.15 THEN NULL ELSE (5 + random() * 55)::NUMERIC(5,1) END AS lesson_hour,
    -- 授課年級班級
    CASE (i % 9) 
        WHEN 0 THEN '高一(1)班' WHEN 1 THEN '高一(2)班' WHEN 2 THEN '高一(3)班'
        WHEN 3 THEN '高二(1)班' WHEN 4 THEN '高二(2)班' WHEN 5 THEN '高二(3)班'
        WHEN 6 THEN '高三(1)班' WHEN 7 THEN '高三(2)班' WHEN 8 THEN '高三(3)班'
    END AS grade,
    -- 授課日期:近6個月的隨機日期
    CURRENT_DATE - INTERVAL '6 months' + (random() * INTERVAL '6 months')::INTERVAL AS lesson_date
FROM generate_series(1, 100000) AS t(i);

-- 4. 生成出勤詳情表測試數據(30萬條,每人3條記錄)
INSERT INTO attendance_detail (student_id, attendance_date, is_present, late_minutes)
SELECT 
    si.student_id,
    -- 出勤日期:近1個月的3個隨機日期
    CURRENT_DATE - INTERVAL '1 month' + (random() * INTERVAL '1 month')::INTERVAL AS attendance_date,
    -- 出勤狀態:90%出勤,10%缺勤
    CASE WHEN random() > 0.1 THEN TRUE ELSE FALSE END AS is_present,
    -- 遲到分鐘數:出勤時15%概率遲到(0-30分鐘),缺勤時為0
    CASE WHEN random() > 0.1 THEN 
        CASE WHEN random() < 0.15 THEN (random() * 30)::NUMERIC(5,1) ELSE 0 END
    ELSE 0 END AS late_minutes
FROM student_info si, generate_series(1, 3) AS t(j) -- 每人生成3條記錄
LIMIT 300000;

openGauss數據庫源碼解析系列文章_#分類

3.插入數據

以下代碼通過openGauss內置函數(如generate_series、random、chr等)生成符合K12場景的數據:1萬條學生信息(覆蓋高中學段3個年級、10個班級)、1萬條成績記錄(含主科與文理科選考科目)、1萬條教師授課記錄(匹配各學段科目)及3萬條出勤記錄(每人每月3條出勤數據),數據分佈貼合K12教育實際情況(如文科學生生成政治歷史成績,理科學生生成物理成績)

openGauss數據庫源碼解析系列文章_#數據挖掘_02

4.測試常規分類場景

4.1業務價值

基於K12成績分級需求,驗證openGauss對SQL99標準中CASE WHEN基礎語法的兼容度,包括簡單條件判斷、多條件分支及默認值設置,解決K12場景中“成績等級明確劃分”的基礎需求。

4.2業務場景

聚焦K12語文科目成績分析,這是K12各學段核心基礎學科。根據語文成績(chinese_score)將學生劃分為“優秀(≥90)”“良好(80-89)”“合格(60-79)”“不合格(<60)”四個等級,無成績時標記為“數據缺失”,適配學校成績統計的常規需求。

4.3測試實例

4.3.1代碼示例

SELECT 
    student_id,
    student_name,
    chinese_score,
    CASE 
        WHEN chinese_score >= 90 THEN '優秀'
        WHEN chinese_score BETWEEN 80 AND 89 THEN '良好'
        WHEN chinese_score BETWEEN 60 AND 79 THEN '合格'
        WHEN chinese_score < 60 THEN '不合格'
        ELSE '數據缺失'
    END AS score_level
FROM score_detailscore_detail sd JOIN student_info si ON sd.student_id = si.student_id
LIMIT 10;

4.3.2運行結果

語句執行成功,返回結果中成績分類準確,默認值“數據缺失”正確匹配無成績的記錄,無語法兼容性問題

openGauss數據庫源碼解析系列文章_#人工智能_03

5.測試教育數據的多維度交叉分類

5.1業務價值

結合K12學習狀態評估需求,驗證openGauss對SQL99 CASE WHEN嵌套語法的支持能力,實現“成績+出勤”多條件交叉分類,解決K12場景中“綜合學情評估”的複雜業務問題

5.2業務場景

K12教學中,學生學習狀態需結合成績與出勤綜合判斷。本次結合學生語文成績(chinese_score)與上課出勤率(attendance_rate),構建“綜合評估等級”。外層判斷成績等級,內層根據出勤率細化等級:成績優秀且出勤率≥95%為“全勤-優秀”,成績優秀但出勤率<95%為“缺勤-優秀”;以此類推,最終將學生劃分為8個綜合等級,為班主任精準管理提供數據支撐。

5.3測試實例

5.3.1代碼示例

SELECT 
    s.student_id,
    s.student_name,
    sc.chinese_score,
    a.attendance_rate,
    CASE 
        WHEN sc.chinese_score >= 90 THEN 
            CASE WHEN a.attendance_rate >= 95 THEN '優秀-全勤'
                 ELSE '優秀-缺勤' END
        WHEN sc.chinese_score BETWEEN 80 AND 89 THEN 
            CASE WHEN a.attendance_rate >= 95 THEN '良好-全勤'
                 ELSE '良好-缺勤' END
        WHEN sc.chinese_score BETWEEN 60 AND 79 THEN 
            CASE WHEN a.attendance_rate >= 95 THEN '合格-全勤'
                 ELSE '合格-缺勤' END
        ELSE '不合格/數據缺失'
    END AS comprehensive_level
FROM student_info s
LEFT JOIN score_detail sc ON s.student_id = sc.student_id
LEFT JOIN attendance_detail a ON s.student_id = a.student_id
WHERE s.grade = '高一(4班)';

5.3.2運行結果

語句執行正常,綜合等級分類完全匹配多條件交叉邏輯,無判斷邏輯混亂問題

openGauss數據庫源碼解析系列文章_#分類_04

6.教育數據的計算型分類場景

6.1業務價值

結合K12學生成績均衡性分析需求,驗證openGauss中SQL99 CASE WHEN與內置函數的結合使用能力,實現“成績計算+分類評估”一體化,為個性化教學提供數據依據。

6.2業務場景

K12教學中,學生三門主科(語文、數學、英語)的成績均衡性是個性化輔導的重要參考。本次計算學生這三門科目的平均分,結合平均分與成績標準差(反映成績穩定性)對學生進行“均衡優秀”“偏科優秀”“均衡合格”“偏科不合格”分類。使用AVG()計算平均分,STDDEV()計算標準差,通過CASE WHEN實現分類邏輯,直接輸出學生成績均衡性結果,輔助教師制定針對性輔導計劃。

6.3測試實例

6.3.1代碼示例

SELECT s.student_id, s.student_name, AVG(score) AS avg_score, STDDEV(score) AS score_std, CASE WHEN AVG(score) >= 85 AND STDDEV(score) <= 5 THEN '均衡優秀' WHEN AVG(score) >= 85 AND STDDEV(score) > 5 THEN '偏科優秀' WHEN AVG(score) BETWEEN 60 AND 84 THEN '均衡合格' ELSE '偏科不合格' END AS score_balance FROM (SELECT student_id, chinese_score AS score FROM score_detail UNION ALL SELECT student_id, math_score AS score FROM score_detail UNION ALL SELECT student_id, english_score AS score FROM score_detail) AS score_union JOIN student_info s ON score_union.student_id = s.student_id GROUP BY s.student_id, s.student_name HAVING AVG(score) > 50;

6.3.2運行結果

子查詢與聚合函數執行正常,CASE WHEN 基於 AVG() 和 STDDEV() 的計算結果完成分類

openGauss數據庫源碼解析系列文章_數據_05

7.測評總結

本次基於K12教育業務模型,從四個核心維度對openGauss的SQL99標準CASE WHEN語句進行測評,結果表明其在K12教育數據分類場景中表現優異,兼容能力與業務價值突出。

  • SQL99兼容度高:CASE WHEN基礎語法、嵌套語法完全遵循SQL99標準,與主流數據庫語法無差異,降低K12教育系統遷移至openGauss的開發成本。
  • 業務適配性強:全面支持NULL值處理、函數結合等複雜場景,能夠覆蓋K12教育中成績分級、學情評估、教務管理等核心業務的分類需求。
    基於以上結論,openGauss的SQL99標準CASE WHEN語句完全能夠支撐K12教育業務數據的多維度靈活分類工作,為K12教育信息化系統的學情分析、教學決策、教務管理等模塊提供可靠的數據庫層支持,具備極高的業務落地價值。