连表查询 和 逗号隔开的区别_多表查询

  1. 表的加法 Union

42c891f8509c491e39ab64ea5dd51aaa.png

加法会把表当中重复的值删掉

如果想要保留重复的行,用union all, 这样重复的行就会原封不动地出现,如下图:

3c637aa32561e14a5bf100a49e472269.png

2. 表的联结 Join

关系数据库里,各个表之间都是有关系的

比如学生表和成绩表是由 ‘学号’联结起来的

77dfaf1475656ffd43f21af7377a4343.png

2.1 常用的联结

2.2.1交叉联结 cross join

A表的所有行和B表的所有行分别联结在一起

2.2.2 内联结 inner join

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

a815bd5937e16d5b347c447602d61859.png
  • 取出同时存在于两张表元素的所在行
  • 然后进行交叉联结
  • 输出的表里有两张表的所有列的信息

可想而知,整张表是很庞大的

2.2.3 左联结 left join

以左边的表为中心

从右边的表中,选出和左边表中cue一样的行

edb0f2b8a8177ece58a09de1825c7ff9.png

如图所示,cue数量不一样的话,通过复制行来填满;

如果只想要获得Student(左边表格)当中独特的那一行,即学号为0004的那一行,加上Null就可以了;

b6fbd84cd93cba714f308a64d00410a5.png

2.2.4 右联结 right join

和左联结类似,以右边表为中心。

2.2.5 全联结

Mysql里面没有全联结

2.3 运行顺序

0778d754dcec96928484a7111c0605b8.png

联结是放在from子句后面,并不影响整体的运行顺序;

3. 联结应用案例

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

bd6dda071088aef2d67d9c9d6146ff3d.png

要注意的是既然现在每张表都给了代号,而且是联结在一起看,在提及每一个列名/参数的时候都需要加上a/b表示来源,否则sql就会报错;

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

055883a903d6866319ed428df1996912.png

注意:注明参数来源的时候需要紧贴着列名/参数,而不要写到函数前面去。我一开始写的是 ‘b.avg(成绩)’,就错了。

案例3: 查询学生的选课情况 (学号、姓名、课程号、课程名称)

f9eb4f705902a196efec6ce50c0a781e.png

自己额外做了一个小练习,来确保自己懂得了左联结/右联结:

首先我给course那张表加了一个栏目:课程0004,如下图

1e177ac204697fe10b9eef7aaf98c38f.png
左边score表b,右边course 表c

然后我输入如下四段代码,分别‘拷问’自己出来的结果会是什么:

0a6abcd3bbcfed809f93cd872786f6dc.png

4a018af26634cdd87a4672792f2209ae.png
第一段代码:b left join c,以b显示出的所有column为主

0d4e02dc7f0e7afaf01f1b0af270fb92.png
第二段代码:c left join b,以C的所有项为主,所以这里出现了0004

d480d82abc70eaaf26c43cd1e7d195bf.png
第三段代码:b right join c,以c的所有项为主,所以和第二段的结果是一样的

a7c5a896b1c328e1abd8da935b5089f0.png
第四段代码:c right join b,以b的所有项为主,所以和第一段的结果是一样的

总之就是left join是代码左边的表格为主导,right join是此代码右边的表格为主导;

4. Case表达式

使用Case表达式可以帮助我们解决复杂的查询问题

Case表达的作用相当于一个判断条件的函数:用来判断每一行是不是满足某个条件,每一行返回一个结果;

c2a9f53c944468c944c3c2d845f30a6e.png

注意:这一长串case子句是数据输出里面的一个元素,不要忘记把它与前面的元素用逗号隔开。

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

54094c87be6d32bfcf1350dc245dd962.png

注意:记得是case when…不是when…我就是漏写了case,结果检查了好久;另外要注意的是,不要因为行数/转折变多就开始空行!一段指令里面不能空行!不然报错找死你……

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

*在使用group by子句的时候,select的列名一定是group by里面定义的列名;

ebcfe361528b71aeb2b892142c1d0fd6.png

7c835e4d3388e079ba6c924470a7d8e4.png

注意:在打函数的时候,不要莫名其妙来一个空格….‘sum ()’ 这里的空格检查了我十分钟….

5. Sqlzoo

8440037e302beb9525b1fa05bef9ae57.png

注意:这里select里面想要提取的列名,group by里面就得用这个,这里虽然id和teamname是对应的,但是既然最后要提取teamname,那么必须要teamname,id可以额外写,但是不可以只写id;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值