mysql 多表联合查询_MySQL-五-多表查询

33

1.表的加法(union)

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

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

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

方法一:新建course1表后合并

90b101fe71e1ac42a4b4aee7852d3871.png

d5dbfd3af01cdb7e12b70d3e73177133.png

aa3615144e4eeae0bb18e24333646715.png

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

0538b69a0cf07123403b9b20a0680fff.png

7f4eb1295b598e8b21fedb8f577ad796.png

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无

5d23e387f577defbe90e62d5afbe0d17.png

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

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

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

d062b1fcf486018bc4ccfddf926cd250.png

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

5c57c8c951197663ec8e8eb766e5ab87.png

CASE 表达式

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

select 学号,成绩,课程号,
(case when 成绩>=60 then'及格'
when 成绩<60 then'不及格'
else null
end)as 是否及格
from score;

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

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

70c2359a257152c875f9a42232f63912.png

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

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

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

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

6ebfac1cfd2464755b72122db8e64c09.png

43a902546e10ab01d309879c2e6161f4.png
正确答案

SQLZOO 练习:Join Operation

4a83b7ec6a5775a8f5e9b555850af8d1.png

ea2e3b4b6d683f41d384e72649a793f1.png

11b580a0e7e17c86b333d5e84ff337db.png

0fa147d8848a0fa12029dabf6625dccb.png

36786948f7ccb87691dd740de441fb98.png

ed5a9eeca34e800cc30056dcf6a4f666.png

52e228db4aa2213a889356a7fa9e4767.png

88fb548209d9d233c0741b950440fffb.png

分析思路:

首先分析问题,求对德国的比赛中得分的球员姓名。
要用到哪张表?球员姓名在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')

db3b7ed0cae08627505671f3e862110a.png
错误答案;

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

68af3ee197cf29275d96e37463e3d3fb.png

5e5da9130548171a6f0b9cef2f6c53fb.png
查询结果要求有比赛日期

534e9ec8eead86122a4500eea6c4720c.png

22196cfe6e48f904ee55cb7b496b6e8e.png

6443e5f669975ec2d8f00022c7409275.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值