sql两张表纵向合并_SQL:多表查询

1.表的加法 union

b85c723b75d00eff9bbcf51394bd1d94.png
会把相同的数据删除,保留唯一值

e18b6d9621aec17f9bdabba92c7009d1.png
union all会保留重复值

2.表的联结 join(通过列产生对应关系)

通过表和表之间的关系连接在一起

常见的连接方式:

交叉联结(cross join)笛卡尔积(在实际业务中用的比较少,结果行数太多了)

表中的每一行都与另一张表中的每一行合并(最终行数时两张表中行数的乘积)

4115318c6d9367c0dd61eef77637803e.png

内联结(inner joint):查找出同时存在于两张表中的数据

在两张表中取出符合条件的行,交叉联结在一起

09f68883b73449bc6ae14aea2493e6c9.png

左联结

910c2ef5ffa206acdff62ea30a9c40e7.png
多表联结时select行要注意

fd8ff4c90f48ea44aa57d4763a7a8262.png
去除两张表中重复的部分

右联结

9339b6f14e5789b2129817cdfd216a61.png

190c4b88deb6705e1222d2103859bd2c.png
去掉两个表的公共部分

全联结 full join(返回两张表中的所有行,有匹配时两个表进行合并,没有匹配时用空值填充)

my sql不支持全联结

各种联结的使用场景:除非特别说明需要生成固定行数的表单,或者保留某张表的全部内容,其他情况都用内联结

3.联结应用案例(用sql解决实际的业务问题)

01da3034305dfb88aee43ab22aac4fdc.png
查询所有学生的学号、姓名、选课数、总成绩

598b5ed9e3d605aed384fe989627aac3.png
查询平均成绩大于85的所有学生、姓名、平均成绩

a293bad130832985a8503428562a7423.png

fc58e4d71775d295636158770ccd0d7b.png

4.case表达式(条件判断的函数,用来判断每一行是不是满足某个条件)

63aaa7bdc0fcfb6f775cf878b03a6e8c.png

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

查询

case表达式的注意事项:

1.else子句可以默认不写,默认为null

2.end不能省略不写

2cbc74770138ce10d9150907222aba86.png
使用分段来统计各科成绩人数,课程号和课程名称

5.SQL zoo 作业

55760e8f6184278e3c46248c7e6b54b2.png

e33abb11b98c9e068b2d6a01ad0dfa99.png

544cb2bbc7e5a1a5dab165231cbeec16.png

a0ea4d2c9f28043939e9058253ce472d.png

00b510c22b407a0eac3d57fa7ad74f6a.png

950fe52e36af7a56c60a3e08a6327d12.png

e8a13f54dd2f47f339c13acb815bbea1.png

b5e502df82c7ea756c662060dfd7e03d.png

8aec80b7623a3ab0fa6e29a990aec91c.png

e2c7b67bfe4b2ee70056391e2a0de883.png

6517f14196070e699f72635b3ed53978.png

2f21744a940f40225f9ca34d0162a794.png

4f55f9378932f9af9107833b51adedd6.png
因为需要查找出所有比赛的情况,所以也包括那些双方都没有进球的情况,使用 left join