多表查询实例:学生成绩管理系统

简介: 多表查询实例:学生成绩管理系统

引言: 在今天的数据库应用中,多表查询是一项非常重要的技能。它允许我们从不同的数据表中获取有关联的数据,并且在实际的应用中非常常见。本篇博客将带你一步步了解如何使用多表查询来创建一个简单的学生成绩管理系统,以学生和成绩两个表为例进行演示。

第一步:创建数据库和数据表

首先,我们需要创建一个数据库,我们将其命名为"学生成绩管理系统"。然后,在该数据库中创建两个数据表,分别为"student"和"score"表。"student"表用于存储学生的基本信息,"score"表用于存储学生的成绩信息。

CREATE DATABASE 学生成绩管理系统;
USE 学生成绩管理系统;
CREATE TABLE student (
  id INT(10) NOT NULL UNIQUE PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  sex VARCHAR(4),
  birth YEAR,
  department VARCHAR(20),
  address VARCHAR(50)
);
CREATE TABLE score (
  id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
  stu_id INT(10) NOT NULL,
  c_name VARCHAR(20),
  grade INT(10)
);

第二步:插入数据

接下来,我们向"student"表和"score"表中插入一些示例数据,以便后续查询和演示。

INSERT INTO student VALUES(901, '张老大', '男', 1985, '计算机系', '北京市海淀区');
INSERT INTO student VALUES(902, '张老二', '男', 1986, '中文系', '北京市昌平区');
INSERT INTO student VALUES(903, '张三', '女', 1990, '中文系', '湖南省永州市');
INSERT INTO student VALUES(904, '李四', '男', 1990, '英语系', '辽宁省阜新市');
INSERT INTO student VALUES(905, '王五', '女', 1991, '英语系', '福建省厦门市');
INSERT INTO student VALUES(906, '王六', '男', 1988, '计算机系', '湖南省衡阳市');
INSERT INTO score VALUES(NULL, 901, '计算机', 98);
INSERT INTO score VALUES(NULL, 901, '英语', 80);
INSERT INTO score VALUES(NULL, 902, '计算机', 65);
INSERT INTO score VALUES(NULL, 902, '中文', 88);
INSERT INTO score VALUES(NULL, 903, '中文', 95);
INSERT INTO score VALUES(NULL, 904, '计算机', 70);
INSERT INTO score VALUES(NULL, 904, '英语', 92);
INSERT INTO score VALUES(NULL, 905, '英语', 94);
INSERT INTO score VALUES(NULL, 906, '计算机', 90);
INSERT INTO score VALUES(NULL, 906, '英语', 85);

第三步:多表查询实例

1.查询student表的所有记录

SELECT * FROM student;

2.查询student表的第2条到4条记录

SELECT * FROM student LIMIT 1 OFFSET 1; -- This will fetch the second record
SELECT * FROM student LIMIT 1 OFFSET 2; -- This will fetch the third record
SELECT * FROM student LIMIT 1 OFFSET 3; -- This will fetch the fourth record

3. 从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息

SELECT id, name, department FROM student;

4.从student表中查询计算机系和英语系的学生的信息

SELECT * FROM student WHERE department IN ('计算机系', '英语系');

5.从student表中查询年龄18~22岁的学生信息

SELECT * FROM student WHERE YEAR(CURRENT_DATE) - birth BETWEEN 18 AND 22;

6.从student表中查询每个院系有多少人

SELECT department, COUNT(*) AS total_students FROM student GROUP BY department;

7.从score表中查询每个科目的最高分

SELECT c_name, MAX(grade) AS max_grade FROM score GROUP BY c_name;

8.查询李四的考试科目(c_name)和考试成绩(grade

SELECT c_name, grade FROM score WHERE stu_id = (SELECT id FROM student WHERE name = '李四');

9.用连接的方式查询所有学生的信息和考试信息

SELECT s.id, s.name, s.sex, s.birth, s.department, s.address, sc.c_name, sc.grade
FROM student s
JOIN score sc ON s.id = sc.stu_id;

10. 计算每个学生的总成绩

SELECT s.id, s.name, SUM(sc.grade) AS total_score
FROM student s
JOIN score sc ON s.id = sc.stu_id
GROUP BY s.id, s.name;

11. 计算每个考试科目的平均成绩

SELECT c_name, AVG(grade) AS average_grade
FROM score
GROUP BY c_name;

12.查询计算机成绩低于95的学生信息

SELECT s.id, s.name, s.department, sc.c_name, sc.grade
FROM student s
JOIN score sc ON s.id = sc.stu_id
WHERE sc.c_name = '计算机' AND sc.grade < 95;

13. 查询同时参加计算机和英语考试的学生的信息

SELECT s.id, s.name, s.department, sc.c_name, sc.grade
FROM student s
JOIN score sc ON s.id = sc.stu_id
WHERE sc.c_name IN ('计算机', '英语')
GROUP BY s.id, s.name, s.department
HAVING COUNT(DISTINCT sc.c_name) = 2;

14. 将计算机考试成绩按从高到低进行排序

SELECT s.id, s.name, s.department, sc.c_name, sc.grade
FROM student s
JOIN score sc ON s.id = sc.stu_id
WHERE sc.c_name = '计算机'
ORDER BY sc.grade DESC;

15. 从student表和score表中查询出学生的学号,然后合并查询结果

SELECT s.id AS stu_id, s.name AS stu_name, sc.c_name, sc.grade
FROM student s
LEFT JOIN score sc ON s.id = sc.stu_id;

16. 查询姓张或者姓王的同学的姓名、院系和考试科目及成绩

SELECT s.name, s.department, sc.c_name, sc.grade
FROM student s
JOIN score sc ON s.id = sc.stu_id
WHERE s.name LIKE '张%' OR s.name LIKE '王%';

17.查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩

SELECT s.name, YEAR(CURRENT_DATE) - s.birth AS age, s.department, sc.c_name, sc.grade
FROM student s
JOIN score sc ON s.id = sc.stu_id
WHERE s.address LIKE '%湖南%';

总结

本文以学生成绩管理系统为例,通过多表查询实例的展示,详细介绍了使用SQL语句从不同数据表中获取相关联数据的方法。掌握多表查询的技巧可以帮助我们在实际应用中更高效地操作数据库,提高数据检索和分析的效率。希望这篇博文能够对你在学习和应用多表查询时有所帮助。希望能够点个关注,有问题也可以私信询问。


目录
相关文章
|
存储 供应链 安全
【区块链】智能交易模式下的数据安全流通模型
【区块链】智能交易模式下的数据安全流通模型
569 1
|
程序员 Shell Linux
01 python - 历史起源
01 python - 历史起源
229 0
|
存储 C语言
【C语言】学生管理系统
【C语言】学生管理系统
292 0
|
Dubbo Cloud Native 应用服务中间件
【Dubbo3 终极特性】「云原生三中心架构」带你探索 Dubbo3 体系下的配置中心和元数据中心、注册中心的原理及开发实战(中)
【Dubbo3 终极特性】「云原生三中心架构」带你探索 Dubbo3 体系下的配置中心和元数据中心、注册中心的原理及开发实战(中)
525 1
|
安全 机器人 API
简单几步,钉钉机器人秒变通义千问对话机器人
大模型不知不觉已经火了快一年了,拥有一个能够随时对话使用的大模型已经成为不少人的刚需。然而,最大的问题可能是如何访问和调用对话模型。如果,我是说如果,能在您的即时通讯软件钉钉中直接与通义千问对话,是不是会让这一切更方便快捷?! 按照传统方案,我们要实现上述场景可能需要非常繁琐的接入步骤,甚至还需要自行开发很多代码,这样的准入门槛实在,太!高!啦! 而今天,我要向各位隆重介绍一个新的解决方案——阿里云计算巢AppFlow应用与数据集成平台,无需任何代码开发,简单快捷,自动连接企业内部应用与外部应用或数据,搭建企业的自动化服务流程,帮助个人、企业降低了集成实施的周期和成本。
|
存储 C语言 C++
C++中STL常用容器(vector、deque、list、map、set)一文带你了解
C++中STL常用容器(vector、deque、list、map、set)一文带你了解
379 0
|
Java
IDEA安装class文件分析工具(binEd 和 JClassLib)
IDEA安装class文件分析工具(binEd 和 JClassLib)
325 0
|
编译器 Linux 开发者
内核模块(上)
内核模块
698 0
|
机器学习/深度学习 存储 数据库
LabVIEW+OpenCV快速搭建人脸识别系统下
LabVIEW+OpenCV快速搭建人脸识别系统下
545 0
LabVIEW+OpenCV快速搭建人脸识别系统下