MySQL--学生表联查

这篇博客介绍了如何在MySQL中进行学生表的联查操作,包括创建学生、教师、课程和成绩表,以及如何插入数据。还提供了一系列查询示例,如查询班级学生数、最高分、平均成绩、特定课程的平均分、教师任课成绩等,涵盖了多表联查的各种场景。

1.根据表的结构创建以下四个表

表一. student(学生表)

属性名 数据类型 可否为空 注 释
Sno varchar (20) 否 学号(主键)
Sname varchar (20) 否 学生姓名
Ssex varchar (20) 否 学生性别
Sbirthday date 可 学生出生年月
Class varchar (20) 可 学生所在班级
在这里插入图片描述
在这里插入图片描述

表二. teacher(教师表)

属性名 数据类型 可否为空 注 释
Tno varchar (20) 否 教工编号(主键)
Tname varchar (20) 否 教工姓名
Tsex varchar (20) 否 教工性别
Tbirthday datetime 可 教工出生年月
Prof varchar (20) 可 职称
Depart varchar (20) 否 教工所在部门
在这里插入图片描述
在这里插入图片描述

表三. course(课程表)

属性名 数据类型 可否为空 含 义
Cno varchar (20) 否 课程号(主键)
Cname varchar (20) 否 课程名称
Tno varchar (20) 否 教工编号(外键)

在这里插入图片描述
在这里插入图片描述
表四. score(成绩表)

属性名 数据类型 可否为空 含 义
Sno varchar (20) 否 学号(外键)
Cno varchar (20) 否 课程号(外键)
Degree Decimal(4,1) 可 成绩
主键:Sno+ Cno
在这里插入图片描述
在这里插入图片描述

2.分别向以上四个表中插入如下数据

Student表:
Sno Sname Ssex Sbirthday class
108 曾华 男 1977-09-01 95033
105 匡明 男 1975-10-02 95031
107 王丽 女 1976-01-23 95033
101 李军 男 1976-02-20 95033
109 王芳 女 1975-02-10 95031
103 陆君 男 1974-06-03 95031

Teacher表:
Tno Tname Tsex Tbirthday Prof Depart
804 李诚 男 1958-12-02 副教授 计算机系
856 张旭 男 1969-03-12 讲师 电子工程系
825 王萍 女 1972-05-05 助教 计算机系
831 刘冰 女 1977-08-14 助教 电子工程系

Course表:
Cno Cname Tno
3-105 计算机导论 825
3-245 操作系统 804
6-166 数字电路 856
9-888 高等数学 831

Score表:
Sno Cno Degree
103 3-245 86
105 3-245 75
109 3-245 68
103 3-105 92
105 3-105 88
109 3-105 76
101 3-105 64
107 3-105 91
108 3-105 78
101 6-166 85
107 6-166 79
108 6-166 81
在这里插入图片描述

3.查询‘95031’班级的学生数

在这里插入图片描述
4.查询成绩表中的最高分的学生学号和课程号
在这里插入图片描述
5.查询每门课的平均成绩

在这里插入图片描述
6.查询成绩表中至少有5名学生选修的并且以3开头的课程的平均分数
在这里插入图片描述

7.查询所有学生的sname,cno,degree的列

在这里插入图片描述
8.查询95033班级学生的平均分
在这里插入图片描述

9.查询张旭教师任课的学生成绩

在这里插入图片描述
10.查询选修某课程的同学人数多于5人的教师姓名
在这里插入图片描述

11.查找计算机系教师所教课程的成绩表

在这里插入图片描述
12.查询所有选修‘计算机导论’课程的‘男’同学的成绩表
在这里插入图片描述

<think>好的,我现在需要帮助用户解决关于MySQL联查的使用方法和示例的问题。首先,我得回顾下用户提供的引用内容,看看里面有哪些有用的信息。用户引用了四个资料,其中提到了子查询、索引添加、右连接以及多联查的示例,特别是三个联查情况。 用户明确想要多联查的示例和语法,所以我的回答应该涵盖不同类型的JOIN操作,比如INNER JOIN、LEFT JOIN、RIGHT JOIN,可能还需要提到FULL JOIN,不过MySQL不支持FULL JOIN,可能需要用UNION来模拟。然后,我需要给出具体的SQL示例,说明每个示例的作用,并解释执行流程。 接下来,用户提供的引用中有个子查询的例子,还有索引的添加,但用户的问题主要集中在多联查,所以可能不需要深入讨论子查询,除非有必要结合说明。例如,可以提到在WHERE子句中使用子查询来过滤数据,但主要焦点还是JOIN。 我需要确保语法正确,使用中文回答,结构清晰。根据用户之前的示例,回答需要分步骤,可能先介绍基本语法,再分类型讲解,最后给出多(三个联查的例子。同时,用户可能需要知道执行顺序,比如JOIN的顺序如何影响结果,或者ON和WHERE的区别。 另外,用户引用的资料4中提到了三个联查,使用EMP和SALGRADE的例子,这可能是个好的参考点。我可以构造类似的示例,比如员工、部门和工资等级联查,展示如何通过多次JOIN来连接多个。 还要注意,用户可能需要知道性能优化,比如使用索引,这在引用2中提到了添加索引的方法。虽然用户的问题是示例和语法,但或许在回答中可以简要提到优化建议,比如为连接字段添加索引,提高查询效率,这样回答会更全面。 最后,生成相关问题,需要围绕多联查展开,比如区别不同类型的JOIN、执行顺序、性能优化、多连接限制等。确保问题有针对性,帮助用户深入理解。 现在整理结构: 1. 先介绍多联查的基本概念和常用语法,包括INNER JOIN、LEFT JOIN等。 2. 分点讲解每种JOIN的语法和示例,结合用户提供的引用中的例子,比如引用3中的RIGHT JOIN。 3. 提供三个联查示例,如引用4中的情况,可能需要详细说明连接条件。 4. 提到性能优化的建议,如添加索引(引用2)。 5. 最后生成相关问题,引导用户进步学习。 需要注意避免错误,比如正确使用ON和USING的区别,确保示例中的名和字段名致,避免混淆。同时,检查LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$,但可能这里更多是SQL代码,所以用代码块包裹。 可能还需要指出子查询和多联查的区别,比如子查询适用于某些情况,而JOIN更适合关联多个的行。但用户的问题集中在联查,所以可能不需要深入讨论子查询,除非有相关示例。 现在开始组织内容,确保每个部分清晰,语法正确,引用适当的例子,并在末尾添加相关问题。</think>MySQL联查主要通过`JOIN`操作实现间关联,以下是核心语法和典型示例: ### 、多联查基础语法 ```sql SELECT 字段列 FROM 1 [INNER|LEFT|RIGHT] JOIN 2 ON 连接条件 [INNER|LEFT|RIGHT] JOIN 3 ON 连接条件 ... WHERE 过滤条件; ``` ### 二、常用联查类型及示例 #### 1. INNER JOIN(内连接) 查询员工姓名及所属部门: ```sql SELECT e.name, d.depart_name FROM employee e INNER JOIN department d ON e.dept_id = d.id; ``` *执行流程*:优先匹配两满足`ON`条件的记录[^3] #### 2. LEFT JOIN(左连接) 查询所有学生及选课信息(未选课学生): ```sql SELECT s.name, c.course_name FROM tb_students_info s LEFT JOIN tb_course c ON s.course_id = c.id; ``` *特性*:左数据完整保留,右无匹配时填充`NULL` #### 3. RIGHT JOIN(右连接) 查询所有部门信息及员工: ```sql SELECT d.name, e.id FROM employee e RIGHT JOIN department d ON e.dept_id = d.id; ``` *应用场景*:优先展示右完整数据[^3] #### 4. 三联查 查询员工姓名、部门名称和工资等级: ```sql SELECT e.name, d.depart_name, s.grade FROM employee e INNER JOIN department d ON e.dept_id = d.id INNER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal; ``` *执行过程*:先关联员工与部门,再与工资等级匹配[^4] ### 三、性能优化建议 1. 为连接字段建立索引可提升查询速度: ```sql ALTER TABLE employee ADD INDEX(dept_id); -- 添加索引[^2] ``` 2. 避免`WHERE`条件中的复杂计算 3. 使用`EXPLAIN`分析执行计划
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值