这课讲了不同表之间的联结,还有如何查询不同表之间的数据以及判断
主要语句格式:
select.. from.. as a left/right/inner join .. as b on a...=b....
(where... 显示条件)// (group by.. 需要分组时)
select .. sum (case when.. then.. else..end)as '..'
from ...
----------------------------------------------------------
表的加法:并集
union
union all保留重复数据
![ebad9d7ee4ca3d2aa802d20374e9c56c.png](https://i-blog.csdnimg.cn/blog_migrate/223ecd0012571916c9a177a926e83c23.jpeg)
表的联结
表与表格之间的关系是通过列联结
例,学生表和成绩表之间的学号用来对应 join
交叉联结cross join
表中每一行与另一张表的每一行分别联结,结果是行数过多
结果举例,扑克牌
内联结inner join
两个表里面共同存在的数据才会保留:并集
练习:
on是表示根据什么列名将两个表联系起来
select后面要加上每个表的符号,说明显示哪个表的数据
Inner join 说明同时存在于两个表
![6fec1157301c6809623ca9e77846b3d4.png](https://i-blog.csdnimg.cn/blog_migrate/2aa53bd5b8fa7de795eab5404d1285e8.jpeg)
左连接:left join
左侧是主表,主表数据全部取出,右边的表格只取出和左边对应的数据
进阶:表示纯左表(取出左右两表的并集部分)
因为score表里面没有"王思*"的数据所以显示是空值
![dbf515630caadca41df68d40d29d5388.png](https://i-blog.csdnimg.cn/blog_migrate/53b2bc96e1bf9f7601fc8433de79f174.jpeg)
如果只要显示王思*,就是显示a表里有但b表里没有的数据
这里要注意空值的话用is不用等号表示
![260a2064b0cb7c83b47b29c346588d0c.png](https://i-blog.csdnimg.cn/blog_migrate/3731638139f98eed9b336cf2f8ac6687.jpeg)
右连接
和左连接相似,换一个方向
全连接
mysql不支持全连接
联结汇总
![54502e46d1996c4185aee2185d7d5c4d.png](https://i-blog.csdnimg.cn/blog_migrate/8cbc2895f1b254cf93a7cb366c831dd9.jpeg)
子查询--篮筐语句按书写顺序-select-红框语句
![7a6bcb262c8bc087c4c0c3677224f380.png](https://i-blog.csdnimg.cn/blog_migrate/14a2cfbed84875e157b681a9a46097e2.jpeg)
联结查询练习
![805c5386cc3d72b574db1f79c43a80df.png](https://i-blog.csdnimg.cn/blog_migrate/e273b4b1f79349ca4aec9497ea478a6c.jpeg)
![d2b664311a1bb51f3129425d8858e8af.png](https://i-blog.csdnimg.cn/blog_migrate/c2d834565bf74b41f19911d433acbd85.jpeg)
三表联结:用两个inner join来练习起来,on标明两两之间的对应条件
![cb55eb4da501ec49c2c2b50bb86f2e48.png](https://i-blog.csdnimg.cn/blog_migrate/7b3ad9171955fd773baa49b101a06db9.jpeg)
case表达式:是否符合我们的条件
case when.. then.. end
else可以省略不写,默认空值
end要写
case表达式可以放在任何位置
![0e2276ebf36c825b1fe5a4f3e4b6d523.png](https://i-blog.csdnimg.cn/blog_migrate/8e33da0d74c776aa9565e877e00dd920.jpeg)
分段统计人数:
1.要注意最后一个sum的语句后面不要加逗号,因为结构相当于 select A,B,C,D,E,F from , F跟from之间是不用加逗号的
2.因为between是包括边界的,这里虽然也运行出来了,但如果怕错的话用繁琐一点的 成绩>.. and 成绩<.. 更稳妥
![cac3fcd6ac1a6cb29b4724adfe6e96ed.png](https://i-blog.csdnimg.cn/blog_migrate/0c4c24e1c9dfb1d54c001fb414960f9a.jpeg)
![97ce64214bd6357ab88cae14995bfd91.png](https://i-blog.csdnimg.cn/blog_migrate/e671999b53832a537768698943858395.jpeg)
![ada89813a279f1915765522abd3c5e4f.png](https://i-blog.csdnimg.cn/blog_migrate/612f3b01068d8270890fea5ec86d87e8.jpeg)
第三题用right join或者inner join都可以
![69660d7598d87b1b2cd6d34838d0987c.png](https://i-blog.csdnimg.cn/blog_migrate/5c5d59008189882687e4681da0483601.jpeg)
![07f1a4bbd61ad8c3d42a95f3e67ed12d.png](https://i-blog.csdnimg.cn/blog_migrate/af0f95d49d629c007f63f222a5383a1f.jpeg)
第五题left join或者inner join都可以,核对了两边的答案都是一致的
![93350df5b0070c8544bcd6cc5fb2242f.png](https://i-blog.csdnimg.cn/blog_migrate/26b4f5731f10f644c883649e3b41da04.jpeg)
![773448ec94ba95f4f6b971efb9a2473c.png](https://i-blog.csdnimg.cn/blog_migrate/44645a806852d1515f96811c5ba3ea66.jpeg)
![505c2c7626e9e697a23b952555373b6d.png](https://i-blog.csdnimg.cn/blog_migrate/8fd60c381e934c7abcbd89002541a1ad.jpeg)
第8T注意点:
1.射入球门的球员名字在goal,赛事对决情况在game,两张表对应的列是id
2.德国对希腊,有可能team1是德国也有可能team1是希腊,所以这里涉及到两种可能
3.去除重合部分的球员名字,所以涉及distinct
![9500cae8b81e89fca7a070642a2c55fd.png](https://i-blog.csdnimg.cn/blog_migrate/68dc049e868790781a5b51067b1d2be0.jpeg)
第9T
1.要找出进球总数,只需要goal表格中和eteam表格中重合的teamid个数就行
![b4e67fe64fb142adf5e3a9042df25822.png](https://i-blog.csdnimg.cn/blog_migrate/61dc32613f5a48f68d287e32e6cef575.jpeg)
和第九题思路相似
![7c22835431aa19c1187f6f7212a1b759.png](https://i-blog.csdnimg.cn/blog_migrate/bda017d0021804924829d41fdc663ebd.jpeg)
因为select语句只能显示group by后面的列,所以group by后面要把列名都加上,11T和12T都要注意这一点
![cb2e298557e045257a0994883f4cec09.png](https://i-blog.csdnimg.cn/blog_migrate/1302cfde5404997266a5e04091a599b6.jpeg)
![c9a6fb932b781e412f40487f9c975e83.png](https://i-blog.csdnimg.cn/blog_migrate/5a5b2cb51f0864bf624eb47def520b2c.jpeg)
13T使用到case判断语句
题目意思是 如果是显示出每场比赛每个队伍的进球数目,那就是如果teamid跟team1/2一致的话加一否则为0
因为是显示每场比赛每个队伍的,所以根据team1/2分别列式
根据比赛场次来分组,同时group by语句要显示出select语句里面涉及的列名
![1c4dff109e11f44125b3bdb8b4022405.png](https://i-blog.csdnimg.cn/blog_migrate/b3041cf57ef9194ef3662b9926e1bc5d.jpeg)