leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇

18056db608cc072144aa666677285828.png

本篇介绍SQL的多表查询,具体分享内容如下:

  1. 表的加法
  2. 表的联结
  3. 联结应用案例
  4. case表达式

1. 表的加法

a767aba24fafe3d3a75dabf8998bf220.png
合并这两个表

1.1 union——不包含重复值

c46f9a3bdafb269ce522418d51f7dfed.png

1.2 union all——包含重复值

887e2b4b13f30251f0f3783d6f0b9a11.png

2.表的联结

a8994c4059f64f7523530d6f87f05152.png
4张表之间的关系

d92bcd2c782b92dbb5530cb0784fab78.png

表的联结有以下5种:

  1. 交叉联结(cross join)
  2. 内联结(inner join)
  3. 左联结(left join)
  4. 右联结(right join)
  5. 全联结(full join)——此联结种mysql不适用

2.1 交叉联结(cross join)

交叉联结也称笛卡尔积,就是将表中的每一行都和另一个表中的每一行合并在一起。

b87fba4935fa17b65ae048667dbeab11.png

2.2 内联结(inner join)

内联结即查找出同时存在于两表中的数据。

9cec0f4d1e6b02014ceb3a62c582c770.png

d816719ee241dd25dcb20a806515c253.png
select <表别名1>.<列名1>,<表别名1>.<列名2>,<表别名2>.<列名3> 
from <表1> as <表别名1> inner join <表2> as <表别名2> 
on <表别名1>.<列名1> = <表别名2>.<列名1>;

2.3 左联结(left join)

左联结将左侧表的数据全都取出来联结右侧表的值,没有匹配的话生成null,左联结见下方方文图

433c603b8478990dbfb437cb353d081c.png

caa2ef983fd6f6bd14b20fa9ab5a405d.png

其中:以下表示使用左联结仅留下左表不包含右表部分

select a.学号,a.姓名,b.课程号
from student as a left join score as b
on a.学号 = b.学号
where b.学号 = Null;

5cfc14610907f81637ecf8e541992e88.png

2.4 右联结(right join)

右联结会将右侧表中的数据全都取出来联结左侧表的值,没有匹配的话生成null,右联结见下方方文图

1e4bae33ced4c7785f1cb77513ddeb20.png

5c9e3cf93888b9ab41648a26025bce33.png

其中:以下表示使用右联结仅留下左表不包含左表部分

select a.学号,a.姓名,b.课程号
from student as a right join score as b
on a.学号 = b.学号
where a.学号 = Null;

8af3c1353c5a524fa7fd33c19f2e8ff2.png

2.5 全联结(full join)——此联结种mysql不适用

e31a4dde4bc93d20543cab58e51624dd.png

3. 联结应用案例

案例一:查询所以学生的学号、姓名、选课数、总成绩

翻译成大白话如下

  1. 学号、姓名(student表)
  2. 选课数(每个学生的选课数目:score表,按学号分组,对课程号计数count)
  3. 总成绩(每个学生的总成绩:score表,按学号分组,对成绩求和sum)

查询语句如下

select a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩 
from student as a left join score as b
on a.学号 = b.学号
group by a.学号;

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

翻译成大白话如下

  1. 查询出所有学生的学号(student表)、姓名(student表)、平均成绩(每个学生的平均成绩:score表,按学号分组,平均成绩用avg(成绩))
  2. 平均成绩>85

查询语句如下

select a.学号,a.姓名,avg(b.成绩) as 平均成绩 
from student as a left join score as b
on a.学号 = b.学号
group by a.学号
having avg(b.成绩)>85;

案例三:查询学生的选课情况

select a.学号,a.姓名,c.课程号,c.课程名称
from student as a inner join score as b
on a.学号 = b.学号
inner join course as c 
on b.课程号=c.课程号;

6e74268245f2c2702fb878eee63e7baf.png

4. case表达式

case表达式相当于条件判断函数,判断某一行是否满足判断条件,都不符合则运行else语句的内容。

814fe1d069b9a7ae5f9034090b4eeedd.png

案例一:判断成绩是否及格,60分及以上为及格,60分以下为不及格

57e4ebdf09658e577a92ad9c505dbf04.png

案例二:查询出每门课程的及格人数和不及格人数

afa3b724648610f74ed0fddf6d377f9b.png

案例三:使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各科成绩,分别统计分数段人数,课程号和课程名称

ba5795034ec5e389782758d79482e2e8.png

使用case语句时注意用end结尾

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值