mysql查询学生表的总人数_MySQL-五-多表查询

这篇博客介绍了MySQL中表的加法(UNION)、表的联结(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)以及CASE表达式的实际运用。通过多个练习案例,讲解了如何查询学生表的总人数、学生的学号、姓名、选课数、总成绩、平均成绩、课程的及格人数和不及格人数,以及如何在多表联结中解决问题。最后,给出了一个关于查询对德国比赛得分球员的SQL示例。
摘要由CSDN通过智能技术生成

33

1.表的加法(union)

表的加法是将两个表的数据,按照行合并到一起。合并时会把重复的数据删除。

如果想保留重复的行,应在union后加all

练习一:如何合并两个表?

方法一:新建course1表后合并

ZVbM7v.jpg

ZVbM7v.jpg

JzyeQv.jpg

588178

rEju2u.jpg

588178

方法二:course-复制表-数据与结构-重命名-打开表-修改数据-写下两表合并的sql语句

n2uMzu.jpg

588178

viMZRb.jpg

viMZRb.jpg

2.表的联结

使用as关键字方便使用,列名前要加表的别名,innerjoin 选出同时存在两个表中的数据。

内联结的sql语句:

select a.学号,a.姓名,b.课程号

from student as a inner join score as b

on a.学号=b.学号

左联结的sql语句:

select.a.学号,a.姓名,b.课程号

from student as a inner join score as b

on a.学号=b.学号

SELECT a.学号,a.姓名,b.课程号

from student as a LEFT JOIN score as b

on a.学号=b.学号

WHERE b.学号=NULL

右联结的aql语句:

SELECT a.学号,a.姓名,b.课程号

from student as a RIGHT JOIN score as b

on a.学号=b.学号

WHERE a.学号=NULL、

全联结

联结应用案例:

练习二:查询所有学生的学号,姓名,选课数,总成绩

分析思路:因为涉及到两张表所以要用到联结-如何联结?-通过学号-用哪种联结?因为查找每个学生的信息,要保留学生表里的所有学号-左联结-where 查询条件无-group by分组,每个学生的选课数-按学号分组对课程数计数count-按学号分组,对学生成绩进行求和sum-having无-order by 对结果排序无-limit无

RRnaAv.jpg

RRnaAv.jpg

练习三:查询平均成绩大于85分的所有学生的学号,姓名,平均成绩。

仍然涉及学生表student与score成绩表;因为是联结查询,要在select子句中的各个列名加上表的别名。

因为平均成绩是分组后得到的。分组结果加上条件—。用Having子句。

V7NRVf.jpg

V7NRVf.jpg

练习四:查询学生的选课情况:学号,姓名,课程号,课程名称(此题涉及三表联结)

e2mMna.jpg

e2mMna.jpg

CASE 表达式

练习五:查询成绩是否及格

select 学号,成绩,课程号,

(case when 成绩>=60 then’及格’

when 成绩<60 then’不及格’

else null

end)as 是否及格

from score;

查询出每门课程的及格人数和不及格人数

当有多种情况需要条件判断时候,使用case 表达式

YjQVJv.jpg

YjQVJv.jpg

使用分段【100-85】,【85-70】,【70-60】,【<60】来统计各科成绩,来统计各科成绩,分别统计各分数段人数,课程号和课程名称。

这道题遇到了很多问题,在社群会员的帮助下,终于得到了正确答案。

错误答案:错误原因是第一行select b.课程名称后面要加逗号,

from行中 a.课程号应该等于b.课程名称

6VVzmu.jpg

6VVzmu.jpg

mi6NR3.jpg

mi6NR3.jpg 正确答案

SQLZOO 练习:Join Operation

AFBVje.jpg

AFBVje.jpg

7R7jiq.jpg

7R7jiq.jpg

naeENj.jpg

naeENj.jpg

y6nquu.jpg

y6nquu.jpg

EB7Zfa.jpg

EB7Zfa.jpg

ENvaUn.jpg

ENvaUn.jpg

meeaAb.jpg

meeaAb.jpg

ZVrmQz.jpg

ZVrmQz.jpg

分析思路:

首先分析问题,求对德国的比赛中得分的球员姓名。

要用到哪张表?球员姓名在goal表,对战德国的比赛,说明主场team1或者客场team2有一方应是德国,用到game表。

两表关系:两表内联结,但有重复值,用distinct去掉

条件:用teamid!='GER'防止列出德国球员;主客场有一方是德国,所以a.team1='GER' or a.team2='GER

code:

SELECT distinct(b.player)

FROM game as a inner join goal as b ON a.id = b.matchid

WHERE b.teamid!='GER'and (a.team1='GER' or a.team2='GER')

iQF7V3.jpg

iQF7V3.jpg 错误答案;

RNJ7Nv.jpg

RNJ7Nv.jpg 正确答案,其中order by改为group by;from条件中,ON处matchid=teamid

zQfuAn.jpg

zQfuAn.jpg

UVr2iu.jpg

UVr2iu.jpg 查询结果要求有比赛日期

JjaqUj.jpg

JjaqUj.jpg

qeiaIb.jpg

qeiaIb.jpg

bYnmqm.jpg

bYnmqm.jpg

好的,根据你的说明,假设我们有以下三张: **学生**: | 字段名 | 类型 | 描述 | | ------ | ------ | -------- | | id | int | 学生id | | name | string | 学生姓名 | | class_id | int | 学生所在班级id | **班级**: | 字段名 | 类型 | 描述 | | ------ | ------ | ---------- | | id | int | 班级id | | name | string | 班级名称 | | counselor_id | int | 辅导员id | **专业**: | 字段名 | 类型 | 描述 | | ------ | ------ | ---------------- | | id | int | 专业id | | name | string | 专业名称 | | college_id | int | 学院id | | counselor_id | int | 辅导员id | 现在我们的任务是,根据辅导员id查找该辅导员所带的人数和各个班级对应的人数。 这个问题可以分为两个部分来处理: 1. 根据辅导员id查找该辅导员所带的人数 我们可以使用如下 SQL 语句来实现: ```sql SELECT COUNT(*) FROM 学生 WHERE class_id IN ( SELECT id FROM 班级 WHERE counselor_id = [辅导员id] ); ``` 这条 SQL 语句会先从班级中查找到所有的辅导员id为给定值的班级id,然后在学生中查找所有班级id为这些班级id的学生,并统计人数。 2. 根据辅导员id查找各个班级对应的人数 我们可以使用如下 SQL 语句来实现: ```sql SELECT 班级.name, COUNT(*) FROM 学生 JOIN 班级 ON 学生.class_id = 班级.id WHERE 班级.counselor_id = [辅导员id] GROUP BY 班级.name; ``` 这条 SQL 语句会先将学生和班级进行 JOIN 操作,将学生所在的班级名称和班级中的名称对应起来,然后根据给定的辅导员id筛选出对应的班级,并统计各个班级的人数。 希望这个回答能够帮到你,如果你还有其他的问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值