mysql 进阶之路_SQL进阶之路——多表查询

一、表的加法union 子句:将两个表格的数据整理到一个表格内coursecourse1

在这里我们看到有两个表,表的结构是相同的,数据仅有第一行是相同的。在这里,我们给他整合到一个表格内。

在这里我们可以看到,上表内的数据为表course与表course1表内数据整合,无重复数据。但是之前两表内第一行重复,如果保留重复行的话怎么办呢?

上图表内保留了重复行,我们只需在union子句后加入all即可。

二、表的联结

联结:通过表和表之间的关系将两个表合并在一起的操作(join子句)学生表student成绩表score

1.交叉联结(笛卡尔积)cross

将A表中的每一行与B表中的每一行都合并在一起。交叉联结后表格的行数是两个表格行数的乘积。交叉联结是所有联结的基础。

2.内联结 inner join

查找出同时存在于两张表的数据。

3.左联结 left join

查找左侧表格所有数据及与右侧相联结的数据。

在这里可以看到在表格b中没有学号为‘0002’学生的数据,如果在这基础上仅显示没有的数据,应该怎么进行呢?

4.右联结 right join

查找右侧表格所有数据及与左侧相联结的数据。

如果在这基础上仅显示没有的数据,应该怎么进行呢?

5.全联结 full join

两个表格的数据全部联结在同一表格中,返回结果为所有行,若没有对应的数据,则会出现空值行来补充。

但MYSQL不支持全联结,此处只做定义了解。

在这里,给大家展示一张示意图,便于理解。

三、联结应用案例

Q1:查询所有学生的学号、姓名、选课数、总成绩

分析思路:学号、姓名(学生表student)

选课数(每个学生的选课数目:成绩表score,按学号分组,对课程号进行计数count)

总成绩(每个学生的总成绩:成绩表score,按学号分组,对成绩求和sum)

sql子句:select查询结果[学号,姓名,选课数,总成绩]

from 从啊张表中查找数据[学生表student,成绩表score。两个表如何进行联结?通过学号。 on a.学号=b.学号 用哪种联结:左联结]

where 查询条件[无]

group by 分组[每个学生的选课数目:按学号分组,对课程号计数count;每个学生的总成绩:按学号分组,对成绩求和sum]

having 对分组结果指定条件[无]

order by 对查询结果排序[无]

limit 从查询结果中取出指定行[无]

Q2:查询平均成绩大于85的所有学生的学号、姓名和平均成绩

分析思路:查询出所有学生的学号,姓名和平均成绩[学号、姓名(学生表student);平均成绩(每个学生的平均成绩:在成绩表score;按学号分组,平均成绩avg(成绩))]

平均成绩>85

sql子句:select查询结果[学号,姓名,平均成绩]

from 从啊张表中查找数据[学生表student,成绩表score。两个表如何进行联结?通过学号。 on a.学号=b.学号 用哪种联结:左联结]

where 查询条件[无]

group by 分组[每个学生的平均成绩:按学号分组,对成绩求平均avg]

having 对分组结果指定条件[avg(成绩)>85]

order by 对查询结果排序[无]

limit 从查询结果中取出指定行[无]

Q3:查询学生的选课情况:学号、姓名、课程号、课程名称

分析思路:学号、姓名(学生表student)

课程号、课程名称(课程表course)

sql子句:select查询结果[学号,姓名,选课数,总成绩]

from 从啊张表中查找数据[学生表student,课程表course。两个表如何进行联结?通过成绩表中间联结。 on a.学号=b.学号 on b.课程号=c.课程号 用哪种联结:内联结]

where 查询条件[无]

group by 分组[无]

having 对分组结果指定条件[无]

order by 对查询结果排序[无]

limit 从查询结果中取出指定行[无]

四、case表达式

作用:用于判断每行数据是否满足某个条件

判断表达式:最终只返回一个结果case when xxx then xxx

when xxx then xxx

else xxx

end

注意事项:else子句可不写,此时默认为当else时为空值,但为了更好的书写习惯,建议不要省略

end不可省略

case子句可写在sql子句中的任意句段中

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值