MySQL-五-多表查询

33

1.表的加法(union)

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

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

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

方法一:新建course1表后合并

《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》

《MySQL-五-多表查询》

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

《MySQL-五-多表查询》

《MySQL-五-多表查询》
《MySQL-五-多表查询》

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无

《MySQL-五-多表查询》
《MySQL-五-多表查询》

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

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

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

《MySQL-五-多表查询》
《MySQL-五-多表查询》

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

《MySQL-五-多表查询》
《MySQL-五-多表查询》

CASE 表达式

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

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

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

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

《MySQL-五-多表查询》
《MySQL-五-多表查询》

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

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

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

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

《MySQL-五-多表查询》
《MySQL-五-多表查询》

《MySQL-五-多表查询》
《MySQL-五-多表查询》 正确答案

SQLZOO 练习:Join Operation

《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》

分析思路:

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

《MySQL-五-多表查询》
《MySQL-五-多表查询》 错误答案;

《MySQL-五-多表查询》
《MySQL-五-多表查询》 正确答案,其中order by改为group by;from条件中,ON处matchid=teamid
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》 查询结果要求有比赛日期
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》
《MySQL-五-多表查询》

    原文作者:Lray Lray
    原文地址: https://zhuanlan.zhihu.com/p/84789172
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞