首页 > 数据库 >SQL查询技巧:深入解析学生选课系统数据库

SQL查询技巧:深入解析学生选课系统数据库

时间:2024-09-15 13:29:17浏览次数:3  
标签:INSERT 00 选课 数据库 查询 score VALUES SQL INTO

        在大学的学生选课系统中,数据库的管理和查询是日常操作中的重要部分。本文通过一系列具体的SQL查询示例,深入解析如何高效地从数据库中获取所需信息,包括学生选课情况、成绩分析、教师课程管理等。

系统数据库结构

首先,我们有一个包含以下表的数据库:

course - 存储课程信息

建表

CREATE TABLE `course` (
  `CNO` varchar(5) NOT NULL,
  `CNAME` varchar(10) NOT NULL,
  `TNO` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

导入数据

INSERT INTO `course` VALUES ('3-105', '计算机导论', '825');
INSERT INTO `course` VALUES ('3-245', '操作系统', '804');
INSERT INTO `course` VALUES ('6-166', 'Java编程', '856');
INSERT INTO `course` VALUES ('9-888', '马克思主义', '100');

查询数据是否导入成功

select * from course;

grade - 存储成绩等级

 建表

CREATE TABLE `grade` (
  `low` int(3) DEFAULT NULL,
  `upp` int(3) DEFAULT NULL,
  `rank` char(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

导入数据

INSERT INTO `grade` VALUES ('90', '100', 'A');
INSERT INTO `grade` VALUES ('80', '89', 'B');
INSERT INTO `grade` VALUES ('70', '79', 'C');
INSERT INTO `grade` VALUES ('60', '69', 'D');
INSERT INTO `grade` VALUES ('0', '59', 'E');

查询数据是否导入成功

select * from grade;

score - 存储学生成绩

 建表

CREATE TABLE `score` (
  `SNO` varchar(3) NOT NULL,
  `CNO` varchar(5) NOT NULL,
  `DEGREE` decimal(10,1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

导入数据

INSERT INTO `score` VALUES ('103', '3-245', '86.0');
INSERT INTO `score` VALUES ('105', '3-245', '75.0');
INSERT INTO `score` VALUES ('109', '3-245', '68.0');
INSERT INTO `score` VALUES ('103', '3-105', '92.0');
INSERT INTO `score` VALUES ('105', '3-105', '88.0');
INSERT INTO `score` VALUES ('109', '3-105', '76.0');
INSERT INTO `score` VALUES ('101', '3-105', '64.0');
INSERT INTO `score` VALUES ('107', '3-105', '91.0');
INSERT INTO `score` VALUES ('108', '3-105', '78.0');
INSERT INTO `score` VALUES ('101', '6-166', '85.0');
INSERT INTO `score` VALUES ('107', '6-106', '79.0');
INSERT INTO `score` VALUES ('108', '6-166', '81.0');

查询数据是否导入成功

select * from score;

student - 存储学生信息

 建表

CREATE TABLE `student` (
  `SNO` varchar(3) NOT NULL,
  `SNAME` varchar(4) NOT NULL,
  `SSEX` varchar(2) NOT NULL,
  `SBIRTHDAY` datetime DEFAULT NULL,
  `CLASS` varchar(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

导入数据

INSERT INTO `student` VALUES ('108', '曾华', '男', '1977-09-01 00:00:00', '95033');
INSERT INTO `student` VALUES ('105', '匡明', '男', '1975-10-02 00:00:00', '95031');
INSERT INTO `student` VALUES ('107', '王丽', '女', '1976-01-23 00:00:00', '95033');
INSERT INTO `student` VALUES ('101', '李军', '男', '1976-02-20 00:00:00', '95033');
INSERT INTO `student` VALUES ('109', '王芳', '女', '1975-02-10 00:00:00', '95031');
INSERT INTO `student` VALUES ('103', '陆君', '男', '1974-06-03 00:00:00', '95031');

查询数据是否导入成功

select * from student;

teacher - 存储教师信息

 建表

CREATE TABLE `teacher` (
  `TNO` varchar(3) NOT NULL,
  `TNAME` varchar(4) NOT NULL,
  `TSEX` varchar(2) NOT NULL,
  `TBIRTHDAY` datetime NOT NULL,
  `PROF` varchar(6) DEFAULT NULL,
  `DEPART` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

导入数据

INSERT INTO `teacher` VALUES ('804', '李诚', '男', '1958-12-02 00:00:00', '副教授', '计算机系');
INSERT INTO `teacher` VALUES ('856', '张旭', '男', '1969-03-12 00:00:00', '讲师', '电子工程系');
INSERT INTO `teacher` VALUES ('825', '王萍', '女', '1972-05-05 00:00:00', '助教', '计算机系');
INSERT INTO `teacher` VALUES ('831', '刘冰', '女', '1977-08-14 00:00:00', '助教', '电子工程系');

查询数据是否导入成功

select * from teacher;

SQL查询示例与分析

1. 查询特定班级的学生人数

查询“95031”班的学生人数

SELECT COUNT(1) FROM student WHERE class = '95031';

这条查询统计了班级“95031”的学生人数,使用COUNT(1)确保每个学生都被计数。

2. 查询最高分的学生信息

查询Score表中的最高分的学生学号和课程号

select SNO, CNO, DEGREE
from score
where DEGREE = (select max(DEGREE) from score);

通过子查询找到最高分,然后查询所有获得这一分数的学生信息。

3. 查询成绩在特定区间的学生编号

查询最低分大于70,最高分小于90的Sno列

SELECT SNO FROM score WHERE DEGREE BETWEEN 70 AND 90 GROUP BY SNO;

这条查询找出了成绩在70到90分之间的所有学生编号,使用BETWEEN简化了查询条件。

4. 查询特定班级所选课程的平均分

查询“95033”班所选课程的平均分

select CNO, AVG(DEGREE) as avg_score
from score
where SNO in (select SNO from student where class = '95033')
group by CNO;

通过子查询找到“95033”班的所有学生,然后计算他们每门课程的平均成绩。

5. 查询成绩高于特定学生的成绩记录

查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。

select stu.*
from student stu
         join score sco on stu.SNO = sco.SNO
where sco.CNO = '3-105'
  and DEGREE > (select DEGREE
                from score
                where SNO = '109' and CNO = '3-105');

这条查询首先找到课程“3-105”中编号为“109”的学生的成绩,然后找出所有成绩高于这一分数的学生记录。

6. 查询选修多门课程且成绩非最高的学生记录

查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。

select sco1.* from score sco1 where exists(
    select 1 from score sco2 where sco2.SNO = sco1.SNO and DEGREE < (
        select max(DEGREE)  from score sco3 where sco3.SNO = sco1.SNO))
    and sco1.SNO in (
        select SNO from score group by SNO having count(CNO) > 1);

通过子查询找到选修多门课程的学生,然后筛选出成绩不是最高的记录。

7. 查询选修学生多于5人的教师姓名

查询选修某课程的同学人数多于5人的教师姓名。

select tea.TNAME from teacher tea
    join course cou on cou.TNO = tea.TNO
    where cou.CNO in (select CNO from score group by CNO having count(SNO) > 5);

这条查询首先找出选修学生多于5人的课程,然后查询这些课程的任课教师姓名。

8. 查询不同系不同职称的教师

查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof

select TNAME, PROF from teacher where DEPART in ('计算机系', '电子工程系');

通过限定部门和职称,查询特定条件下的教师信息。

9. 查询成绩低于课程平均成绩的学生

查询成绩比该课程平均成绩低的同学的成绩表

select CNO, avg(DEGREE) from score where CNO = CNO group by CNO;
select * from score sco where DEGREE < (select avg(DEGREE) from score where CNO = sco.CNO );

这条查询找出了所有成绩低于其所在课程平均成绩的学生记录。

10. 查询所有任课教师的信息

查询所有任课教师的Tname和Depart

select TNAME, DEPART from teacher where TNO in (select  TNO from course);

通过关联查询,找出所有有授课记录的教师信息。

结论

        通过这些SQL查询示例,我们可以看到如何有效地从教育数据库中提取信息,无论是进行学生成绩分析、教师课程管理还是班级学生统计。这些技巧对于数据库管理员和教育工作者来说都是非常实用的。希望这篇文章能帮助你更好地理解和使用SQL进行数据查询。如果你有任何疑问或需要进一步的帮助,请随时联系。

标签:INSERT,00,选课,数据库,查询,score,VALUES,SQL,INTO
From: https://blog.csdn.net/weixin_64726356/article/details/142254681

相关文章

  • 如何解决MySQL + 字段锁表问题|如何优化MySQL DDL操作以减少锁表时间|深入理解MySQL的On
    在日常的数据库操作中,MySQL数据库的表结构修改是不可避免的操作之一。例如,添加新字段是常见的需求之一。然而,在生产环境中对表结构进行更改时,特别是在大数据量的表中,容易出现锁表问题,导致业务系统的性能下降甚至完全卡顿。MySQL在进行表结构修改时会加表级锁,从而影响到其他的查询和......
  • Elasticsearch和向量数据库的快速入门
    在比较Elasticsearch和向量数据库之前,让我们简要解释它们是什么:什么是Elasticsearch?Elasticsearch是一个流行的开源搜索和分析引擎,建立在ApacheLucene之上。它专为全文搜索、分析和日志分析用例而设计。主要特点:文档导向的NoSQL数据库分布式和可扩展的架构实时搜索和分析无需......
  • 通过脚本自动部署PostgreSQL数据库
    说明该脚本部署的pg数据库为源码通过编译安装的方式执行过程[root@olinux73_model~]#chmod+x./install.sh[root@olinux73_model~]#./install.sh####清理环境####关闭防火墙####关闭Selinuxsetenforce:SELinuxisdisabled####设置PG环境变量PGBASE=/u01/appFILE_CO......
  • MySQL索引
    2.1索引概述2.1.1介绍索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。在无索引情况下,就需要从第一......
  • SQL第三课——排序检索数据
    如何使用select语句的orderby子句,根据需要排序检索出的数据。3.1排序数据如果不排序,数据一般以它在表中出现的顺序显示,有可能是数据最初添加到表中的顺序。如果数据随后进行过更新或删除,那么这个顺序将会受到DBMS重用回收存储空间的方式影响。如果不明确控制的话,最终的结......
  • Mysql高级篇(中)—— 索引优化
    Mysql高级篇(中)——索引优化一、索引分析案例案例1:单表查询案例2:两表连接查询案例3:三表连接查询二、避免索引失效常见索引失效场景简述场景1场景2场景3场景4场景5场景6三、索引优化文字版示例版一、索引分析案例使用EXPLAIN分析SQL查询性能是数据......
  • SQL语句逻辑执行过程
    1.1SQL语句的逻辑处理顺序SQL语句的逻辑处理顺序,指的是SQL语句按照一定的规则,一整条语句应该如何执行,每一个关键字、子句部分在什么时刻执行。除了逻辑顺序,还有物理执行顺序。物理顺序是SQL语句真正被执行时的顺序(执行计划),它是由各数据库系统的关系引擎中的语句分析器、优化......
  • Can't connect to local MySQL server through socket
    mysql-urootERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(2)这是mysql登录时找不到套接字的问题。首先需要明白的是,Linux端的mysqlserver启动时会开启一个socket,Linux上的MySQL的客户端在不使用IP连接时mysqlserver时,默认......
  • StarRocks实时分析数据库的基础与应用
    1.什么是StarRocks?StarRocks是一款开源的在线分析处理(OLAP)数据库,专为实时、低延迟的分析场景而设计。它以其大规模并行处理(MPP)架构和列式存储设计,极大地提高了查询性能和处理效率。通过支持实时数据摄入、快速查询和高并发,StarRocks已经广泛应用于金融、互联网、广告、......
  • python+django+mysql 教师培训反馈系统05141-计算机毕业设计项目选题推荐(赠源码)
       目   录摘  要Abstract第1章  前  言1.1 研究背景1.2 研究现状1.3 系统开发目标第2章  系统开发环境62.1HTTP协议62.2HTML网页技术62.3B/S结构62.4django脚本语言72.5MySQL数据库72.6Apache简介8第3章  需求分析......