MySQL多表查询例题

本文通过创建student和score两张表,并填充数据,详细展示了多种MySQL多表查询操作,包括查询所有记录、指定范围记录、按条件查询、聚合函数应用等,旨在帮助读者掌握数据库查询技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二、多表查询
    1.创建student和score表
    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)
    );
mysql> 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)
    -> );
Query OK, 0 rows affected (0.32 sec)

mysql> describe student;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(10)     | NO   | PRI | NULL    |       |
| name       | varchar(20) | NO   |     | NULL    |       |
| sex        | varchar(4)  | YES  |     | NULL    |       |
| birth      | year(4)     | YES  |     | NULL    |       |
| department | varchar(20) | YES  |     | NULL    |       |
| address    | varchar(50) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

    创建score表。SQL代码如下:
    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)
    );
mysql> 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)
    -> );
Query OK, 0 rows affected (0.43 sec)

mysql> describe score;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(10)     | NO   | PRI | NULL    | auto_increment |
| stu_id | int(10)     | NO   |     | NULL    |                |
| c_name | varchar(20) | YES  |     | NULL    |                |
| grade  | int(10)     | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.11 sec)
    2.为student表和score表增加记录
    向student表插入记录的INSERT语句如下:
    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,'计算机系', '湖南省衡阳市');
    向score表插入记录的INSERT语句如下:
    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(NUL

交互式SQL的使用 环境:WINDOWS,Microsoft SQL Server 实验要求: 1,创建Student数据库,包括Students,Courses,SC结构如下: Students(SNO,SNAME,SEX,BDATE,HEIGHT,DEPARTMENT) Courses(CNO,CNAME,LHOUR,CREDIT,SEMESTER) SC(SNO,CNO,GRADE) (注:下划线示主键,斜体示外键),并插入一定数据。 2.完成如下的查询要求及更新的要求。 (1)查询身高大于1.80m的男生的学号和姓名; (2)查询计算机系秋季所开课程的课程号和学分数; (3)查询选修计算机系秋季所开课程的男生的姓名、课程号、学分数、成绩; (4)查询至少选修一门电机系课程的女生的姓名(假设电机系课程的课程号以EE开头); (5)查询每位学生已选修课程的门数和总平均成绩; (6)查询每门课程选课的学生人数,最高成绩,最低成绩和平均成绩; (7)查询所有课程的成绩都在80分以上的学生的姓名、学号、且按学号升序排列; (8)查询缺成绩的学生的姓名,缺成绩的课程号及其学分数; (9)查询有一门以上(含一门)三个学分以上课程的成绩低于70分的学生的姓名; (10)查询1984年~1986年出生的学生的姓名,总平均成绩及已修学分数。 (11) 在STUDENT和SC关系中,删去SNO以’01’开关的所有记录。 (12)在STUDENT关系中增加以下记录: (13)将课程CS-221的学分数增为3,讲课时数增为60 3.补充题: (1) 统计各系的男生和女生的人数。 (2) 列出学习过‘编译原理’,‘数据库’或‘体系结构’课程,且这些课程的成绩之一在90分以上的学生的名字。 (3) 列出未修选‘电子技术’课程,但选修了‘数字电路’或‘数字逻辑’课程的学生数。 (4) 按课程排序列出所有学生的成绩,尚无学生选修的课程,也需要列出,相关的学生成绩用NULL示。 (5) 列出平均成绩最高的学生名字和成绩。(SELECT句中不得使用TOP n子句) 4.选做题:对每门课增加“先修课程”的属性,用来示某一门课程的先修课程,每门课程应可记录于一门的先修课程。要求: 1) 修改结构的定义,应尽量避免数据冗余,建立必要的主键,外键。 2) 设计并插入必要的测试数据,完成以下查询: 列出有资格选修数据库课程的所有学生。(该学生已经选修过数据库课程的所有先修课,并达到合格成绩。) 注意:须设计每个查询的测试数据,并在查询之前用INSERT语句插入中。 提交作业形式: 1) 建立Student数据库的SQL脚本,插入所有数据项的SQL脚本(包括所有的测试数据)。 2) 完成查询要求的SQL语句脚本。 3) 选做题:须提交修改数据库定义的SQL脚本,插入测试数据的SQL脚本以及用于查询的SQL语句。
### SQL 联查 示例题目解析 #### 题目一:员工与部门信息查询 给定 `employees` 和 `departments` ,分别存储员工信息和部门信息。两通过 `department_id` 字段关联。编写 SQL 查询语句,返回每位员工的编号 (`employee_id`)、姓名 (`last_name`) 和所属部门名称 (`department_name`)。 ##### 解析: 此场景可以通过 INNER JOIN 实现,也可以利用 USING 简化等值连接条件。最终目标是从两张中提取所需字段并匹配对应关系[^1]。 ```sql SELECT e.employee_id, e.last_name, d.department_name FROM employees e JOIN departments d USING(department_id); ``` --- #### 题目二:学生选课情况统计 假设存在三张:`student`(学生)、`classes`(课程)以及中间关联 `s_c`(记录学生的选课)。现在需要查询所有选择了课程 ID 为 1 的学生及其所选课程名称列。 ##### 解析: 这是一个典型的关系处理案例。需借助中间完成筛选操作,并使用聚合函数 GROUP_CONCAT 来拼接字符串结果[^2]。 ```sql SELECT s.*, GROUP_CONCAT(c.NAME) AS course_names FROM student s JOIN s_c z ON z.sid = s.id JOIN classes c ON z.cid = c.id WHERE z.cid IN (1) GROUP BY s.id; ``` --- #### 题目三:最高分科目分析 已知有 `score` 用于保存学生成绩详情,而另一张 `subject` 则定义了各科目的基本信息。试设计一条 SQL 命令找出每门学科中的最高分数及对应的考生编号。 ##### 解析: 本题涉及子查询嵌套逻辑,目的是先计算出每个科目下的最大得分,再基于这些峰值进一步定位具体的学生记录[^3]。 ```sql SELECT b.StudentId, f.SubName, b.Score FROM ( SELECT MAX(s.Score) AS MaxScore, s.SubjectId AS SubId, sub.Name AS SubName FROM score s LEFT JOIN subject sub ON s.SubjectId = sub.SubjectNo GROUP BY s.SubjectId ) f JOIN score b ON b.SubjectId = f.SubId AND b.Score = f.MaxScore; ``` --- #### 题目四:客户订单明细展示 假设有两个实体对象——顾客(`Customers`)和订单(`Orders`),它们之间建立了一种一对的关系模型。尝试构建一段脚本来获取完整的订购历史清单,其中包含客户的唯一标识符(`cust_id`)以及其他附加属性。 ##### 解析: 当遇到相同命名列作为外键的情况时,推荐采用 USINg 结构来替代传统的 ON 子句达方式,从而提升可读性和简洁度[^4]。 ```sql SELECT * FROM Orders o JOIN Customers c USING(cust_id); ``` --- ### 总结 上述实例涵盖了种实际应用场景下如何运用 MySQL 进行复杂的数据检索任务。无论是简单的双交互还是更为复杂的层次组合模式,都离不开清晰的设计思路和技术手段的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值