Oracle SQL 常用语句练习:统计、计算与数据维护详解

山海之间
山海之间
发布时间:2026-10-14| 5人浏览过
原创

本文整理了一套完整的SQL语句练习案例,基于学生、课程及成绩单三张核心表。通过具体示例演示如何使用Oracle语法进行多维度统计、成绩等级判定、及格率计算以及数据的批量更新与格式化处理,旨在帮助开发者或学生快速理解并掌握复杂SQL逻辑。

1. 准备环境:理解表结构

在进行具体查询之前,首先明确涉及的三张核心表及其字段含义,这是编写准确SQL的前提。
  • 学生表 (ze_student):包含学号(s#)、姓名(sname)、出生日期(difdate)及所在班级(grade)。
  • 课程表 (ze_course):包含课程号(c#)及课程名称(cname)。
  • 成绩单 (ze_score):关联表,包含学号(s#)、课程号(c#)及对应成绩(score)。

第1步:基础统计与平均值计算

这一部分主要展示如何利用GROUP BY和子查询进行简单的计数和平均数运算。

1.1 统计每个班级的人数
通过对学生表的班级字段进行分组计数即可得到结果:

SELECT grade, COUNT(sname) FROM ze_student GROUP BY grade;

1.2 计算特定年级学生的平均成绩
要求计算2007级各学生的平均成绩,若无成绩记录则视为0分。这里使用子查询配合NVL函数处理空值:

SELECT a.sname, 
       (SELECT AVG(NVL(b.score, 0)) 
        FROM ze_score b 
        WHERE b.s# = a.s#) 
FROM ze_student a 
WHERE grade = 2007;

1.3 多科目平均分极值统计
筛选2007级学生的各科平均分、最高分和最低分(保留两位小数),需连接学生和成绩表:

SELECT b.c#, 
       ROUND(AVG(b.score), 2) AS avg_score,
       MAX(b.score) AS max_score,
       MIN(NVL(b.score, 0)) AS min_score
FROM ze_student a, ze_score b 
WHERE b.s# = a.s# AND a.grade = 2007 
GROUP BY b.c#;

第2步:高级数据处理与格式调整

此阶段涉及更复杂的逻辑判断,如分数等级分类、日期处理及字符串格式化。

2.1 基于条件的分数等级划分
统计每人平均成绩,并根据分数段标记为“优秀”、“及格”或“不及格”。利用CASE WHEN语句实现逻辑分支:

SELECT s#, c, 
       CASE 
         WHEN c >= 90 THEN '优秀' 
         WHEN c < 90 AND c >= 60 THEN '及格' 
         ELSE '不及格' 
       END AS jige_status
FROM (SELECT s#, AVG(NVL(score, 0)) AS c 
      FROM ze_score 
      GROUP BY s#) 
ORDER BY jige_status DESC;

2.2 按月统计出生人数
从学生表中提取月份信息并进行分组计数。使用TO_CHAR函数格式化日期字段:

SELECT TO_CHAR(difdate, 'MM') AS month, 
       COUNT(s#) AS birth_count 
FROM ze_student 
GROUP BY TO_CHAR(difdate, 'MM');

2.3 学号格式化处理
要求将学号统一格式化为以'S'开头,总长度不足12位时左侧补零。这涉及字符串拼接与填充函数:

-- 查询预览
SELECT CONCAT('S', LPAD(s#, 11, '0')) AS formatted_s# 
FROM ze_student;

-- 实际更新操作(谨慎执行)
UPDATE ze_student SET s# = CONCAT('S', LPAD(s#, 11, '0'));
UPDATE ze_score SET s# = CONCAT('S', LPAD(s#, 11, '0'));

注意:在执行UPDATE前建议备份数据或使用TRANSACTION控制范围。

第3步:复杂比率计算与维护操作

最后部分展示如何计算通过率/及格率,以及进行数据内容的修正。

3.1 课程与个人的及格率计算
及格率即及格人数占总人数的比例。以下示例展示了如何按课程计算各科平均成绩及及格率,以及按学生计算总科目的及格率:

-- 各科及格率
SELECT c#, 
       AVG(NVL(score, 0)) AS avg_score, 
       SUM(NVL(score, 0)) AS total_score, 
       COUNT(s#) AS student_count,
       TRUNC(SUM(CASE WHEN NVL(score, 0) > 60 THEN 1 ELSE 0 END) / COUNT(s#), 2) AS pass_rate
FROM ze_score 
GROUP BY c#;

-- 每人及格率
SELECT s#, 
       AVG(NVL(score, 0)) AS avg_score,
       SUM(NVL(score, 0)) AS total_score,
       COUNT(c#) AS course_count,
       SUM(CASE WHEN NVL(score, 0) > 60 THEN 1 ELSE 0 END) / COUNT(c#) AS personal_pass_rate
FROM ze_score 
GROUP BY s#;

3.2 数据修正与删除
包括为特定班级特定课程加分、重命名课程以及删除错误数据记录:

-- 给2007级数学课所有学生加5分
UPDATE ze_score 
SET score = NVL(score, 0) + 5 
WHERE s# IN (SELECT s# FROM ze_student WHERE grade = 2007) 
AND c# = (SELECT c# FROM ze_course WHERE cname = '数学');

-- 删除张三的大学语文成绩
DELETE FROM ze_score 
WHERE s# IN (SELECT s# FROM ze_student WHERE sname = '张三') 
AND c# = (SELECT c# FROM ze_course WHERE cname = '大学语文');

-- 将名为'数学'的课程改为'高等数学'
UPDATE ze_course 
SET cname = '高等数学' 
WHERE cname LIKE '%数学%';
END;

上述代码片段涵盖了日常数据库维护中的常见场景。在实际生产环境中,请务必先在测试库验证,并确认事务提交方式。

总结

以上介绍了SQL语句在多表关联、条件过滤、聚合统计及数据变更方面的典型用法。通过这些练习,可以加深对Oracle SQL语法的理解,提升处理复杂业务逻辑的能力。以上就是SQL语句练习与详细操作的详细内容,更多关于SQL入门教程的资料请关注本站其它相关文章!
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。