首页 > 数据库 >【SQL】参加测试的次数

【SQL】参加测试的次数

时间:2024-08-11 15:23:33浏览次数:16  
标签:name 测试 次数 student SQL 科目 id subject

目录

题目

分析

代码


题目

学生表: Students

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| student_id    | int     |
| student_name  | varchar |
+---------------+---------+
在 SQL 中,主键为 student_id(学生ID)。
该表内的每一行都记录有学校一名学生的信息。

科目表: Subjects

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| subject_name | varchar |
+--------------+---------+
在 SQL 中,主键为 subject_name(科目名称)。
每一行记录学校的一门科目名称。

考试表: Examinations

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| student_id   | int     |
| subject_name | varchar |
+--------------+---------+
这个表可能包含重复数据(换句话说,在 SQL 中,这个表没有主键)。
学生表里的一个学生修读科目表里的每一门科目。
这张考试表的每一行记录就表示学生表里的某个学生参加了一次科目表里某门科目的测试。

查询出每个学生参加每一门科目测试的次数,结果按 student_id 和 subject_name 排序。

查询结构格式如下所示。

示例 1:

输入:
Students table:
+------------+--------------+
| student_id | student_name |
+------------+--------------+
| 1          | Alice        |
| 2          | Bob          |
| 13         | John         |
| 6          | Alex         |
+------------+--------------+
Subjects table:
+--------------+
| subject_name |
+--------------+
| Math         |
| Physics      |
| Programming  |
+--------------+
Examinations table:
+------------+--------------+
| student_id | subject_name |
+------------+--------------+
| 1          | Math         |
| 1          | Physics      |
| 1          | Programming  |
| 2          | Programming  |
| 1          | Physics      |
| 1          | Math         |
| 13         | Math         |
| 13         | Programming  |
| 13         | Physics      |
| 2          | Math         |
| 1          | Math         |
+------------+--------------+
输出:
+------------+--------------+--------------+----------------+
| student_id | student_name | subject_name | attended_exams |
+------------+--------------+--------------+----------------+
| 1          | Alice        | Math         | 3              |
| 1          | Alice        | Physics      | 2              |
| 1          | Alice        | Programming  | 1              |
| 2          | Bob          | Math         | 1              |
| 2          | Bob          | Physics      | 0              |
| 2          | Bob          | Programming  | 1              |
| 6          | Alex         | Math         | 0              |
| 6          | Alex         | Physics      | 0              |
| 6          | Alex         | Programming  | 0              |
| 13         | John         | Math         | 1              |
| 13         | John         | Physics      | 1              |
| 13         | John         | Programming  | 1              |
+------------+--------------+--------------+----------------+
解释:
结果表需包含所有学生和所有科目(即便测试次数为0):
Alice 参加了 3 次数学测试, 2 次物理测试,以及 1 次编程测试;
Bob 参加了 1 次数学测试, 1 次编程测试,没有参加物理测试;
Alex 啥测试都没参加;
John  参加了数学、物理、编程测试各 1 次。

分析

学生表、科目表、考试表,三表

需要多表拼接

每个学生参加每一门科目测试的次数

每名学生每门科目,首先交叉连接学生表和科目表 from Students s join Subjects su

考试表的每一行记录就表示学生表里的某个学生参加了一次科目表里某门科目的测试。 结果表需包含所有学生和所有科目(即便测试次数为0)

学生可以仅参加部分科目考试,参加部分科目测试数为0,左连接考试表 left join Examinations e

合计连接两项 on s.student_id = e.student_id and e.subject_name = su.subject_name

查询出每个学生参加每一门科目测试的次数,结果按 student_id 和 subject_name 排序

按照学生+科目分组 group by s.student_id, su.subject_name

按照学生+科目排序 order by s.student_id, su.subject_name

代码

select s.student_id, s.student_name, su.subject_name, count(e.subject_name) as attended_exams
from Students s join Subjects su 
left join Examinations e 
on s.student_id = e.student_id and e.subject_name = su.subject_name
group by s.student_id, su.subject_name
order by s.student_id, su.subject_name

标签:name,测试,次数,student,SQL,科目,id,subject
From: https://blog.csdn.net/weixin_73404807/article/details/141089405

相关文章

  • 240730-PostgreSQL的逻辑备份与物理备份
    PostgreSQL的逻辑备份与物理备份简介制定备份和恢复计划是每一个DBA最重要的工作之一,它决定了数据的有效性和完整性。也可以搭建跨越不同数据中心的流复制集群,能有效的帮助你避免单点故障。但是只有一份有效的备份能够帮助从delete或者drop的误操中恢复数据。制定备份和恢复计......
  • SQL转储
    PostgreSQL的备份和恢复-SQL转储与所有包含有价值数据的内容一样,应定期备份PostgreSQL数据库。虽然该过程本质上很简单,但清楚了解基础技术和假设非常重要。有三种从根本上不同的方法来备份PostgreSQL数据SQL转储文件系统级备份连续归档本文将重点介绍SQL转储使用的pg......
  • PostgreSQL的查询详解
    PostgreSQL的查询详解1.表表达式表表达式计算一个表。该表表达式包含一个FROM子句,该子句后面可以根据需要选用WHERE、GROUPBY和HAVING子句。最简单的表表达式只是引用磁盘上的一个表,一个所谓的基本表,但是我们可以用更复杂的表表达式以多种方法修改或组合基本表。表表达......
  • PostgreSQL的体系结构
    1.体系架构1、应用程序访问接口整个应用架构中,Postgresql数据库位于操作系统和应用程序之间,不同的编程语言使用不同的驱动程序链接到Postgresql数据库上,驱动分为两类:1.使用纯语言实现的Postgresql驱动,如JDBC、.NET等方式,这种链接方式不需要libpq库。2.通过包装Postgresql的......
  • PostgreSQL的数据类型
    PostgreSQL的数据类型1.布尔类型1.1布尔值对应表在Postgresql数据库中Boolean的值除了“true”(真)、“false”(假),还有一个“unknown”(未知)状态。如果是unknown时用NULL表示。布尔类型在Postgresql中可以用不带引号的TRUE或FALSE表示,也可以用更多表示真和假的带引号的字符表示:......
  • bugbountyhunter scope BARKER:第7滴血 存储型 XSS 编码测试和多处引用 报告
    注册后,来到UIDisplayName处直接点击更新之后,发现反射值的存在尝试一些编码,发现没有任何转换。编码测试更简单,语义一把梭:比如各种华丽花哨的编码到落地并没有被还原成<>'"等语义,此处没有漏洞https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSSInjectio......
  • PostgreSQL的物理备份
    PostgreSQL的物理备份1.简单了解1.1pg_basebackup备份1.1.1简介pg_basebackup是从postgresql9.1版本开始提供的一个方便基础备份的工具。pg_basebackup用于对正在运行的PostgreSQL数据库集群进行基本备份。备份是在不影响数据库的其他客户端的情况下进行的,并且可以用于时......
  • PostgreSQL-连续归档和时间点恢复
    PostgreSQL-连续归档和时间点恢复(PITR)PostgreSQL始终在群集数据目录的pg_wal/子目录中维护一个预写日志(WAL)。该日志记录对数据库数据文件所做的每一项更改。此日志主要用于崩溃安全性:如果系统崩溃,可以通过“重放”自上次检查点以来所做的日志条目来将数据库恢复到一致性......
  • PostgreSQL的同步异步复制简介及互相转换
    PostgreSQL的同步/异步复制简介及互相转换一、介绍1.概念1.1.同步流复制同步流复制就是当主库发生变化,比如有一条DML语句产生了WAL日志后,通过后台进程传送到备库,备库必须要应用这个日志,然后向主库返回一个成功应用的信号,主库才可以成功的commit;否则主库会一直等待到备库成功......
  • PostgreSQL的一主一从集群搭建部署
    1.PostgreSQL的一主一从集群搭建部署1.目标​ 掌握Postgresql数据库主从部署搭建配置2.脉络部署规划PostgreSQL单节点安装PostgreSQL主从部署配置主从同步验证3.部署搭建3.1基础准备1.1创建两台虚拟机虚拟机名IPhostname主从划分test11192.168.198......