powerbuilder查询符合条件的数据并且过滤掉其他数据_SQL—多表查询

7285080d994397b5923f9ab67d94006b.png

文章结构:

  • 表的加法
  • 表的联结
  • 表的联结案例
  • case表达式
  • sqlzoo练习题

表的加法【union|并集】:表的加法是指将表的数据按行合并在一起(要求两张表的数据结构一致),是按行进行添加数据。

关键字:union all可以将两个表的重复的数据也保存起来。

案例:合并下面两张表

2643bf3c52ac0e6903ce9fcd4592d2a2.png
表course

1deb20596df4b9729a916b74d3ddbf21.png
表course1
SELECT 

880ff0498ac2dc89810960b59b82f845.png

表的联结:表的联结是指通过表和表之间的关系,将两个表合并在一起的操作,联结(JOIN)运算,简单来说,就是将其他表中的列添加过来,进行“添加列”的运算,是按列进行数据的添加

6292866e405f9048b4ba2d41204ac4b8.png

①交叉联结【cross join 笛卡尔积】:其他联结都是建立在笛卡尔积的基础上的

35416fea3b96c4a741410f67e5731acc.png

②内联结【inner join】【只查询都存在于两张表中的数据,内联结会将各张表中符合条件的行记录都取出来】

d3a4365839f69b684fc79f60cc4dc5c7.png

d7f52517b2c102325e7db62b5a459069.png

c6bbcaa8bc1046cdbc340f9ba3401ca5.png
将各张表中符合条件的行记录都取出来

sql对表的所有操作都是基于行的!

72c031c28db5fff123f2f82e7fedb6a9.png

ON 之后指定两张表联结所使用的列(联结键),ON 是专门用来指定联结条件的,它能起到与 WHERE 相同的作用。需要指定多个键时,同样可以使用 AND、 OR。在进行内联结时ON 子句是必不可少的,并且 ON 必须书写在 FROM 和 WHERE 之间。

操作实例:

d034cfbc6000e48faf2db47ab18b092b.png

88f1aff209eafa076750291c10766bd6.png

③左联结【left join】:左联结会将left join关键字左侧表作为主表,并且将左侧的表的数据全部读取出来。

dc1813a0e706e5d9e03a7cf20eba03b6.png

b6341fd2bdd03b65d4adf179e1f57646.png
左连接会将left join关键字左侧表作为主表,并且将左侧的表的数据全部读取出来。

35a0524127eefd6ee768f5b604da5c4b.png

aa27441189aa4e06669ab182ad381ad5.png
如何取出学生表红色部分的值?

c8a436ffed6a3cdbf8cefc5680bd797d.png
Null是空值,大小表示不确定,不可以进行比较!

实例操作:

fa0c9af5192b93d968f3f6fc43d455aa.png

5942242e591b3ac9723a48a5a959cd84.png

4f7dab0054191879a61ffc93bd54f278.png

④右联结【right join】:右联结会将right join关键字右侧表作为主表,并且将右侧的表的数据全部读取出来。

a17793eeb655536a79ac95e646fec39c.png

9b93a646c06ac2684eb939e7187574cf.png

ea0754c58fc070f8b22e77c072dc697c.png

4176f596a40fa682bdaf2494f7d41cce.png

e22ec8de8ddb4195b6c71b6252077527.png

左右联结如何选择?

右联结和左联结本质上是相同的,只是指定的主表会有所差别,究竟是左联结还是右联结应该根据实际需求来决定,作为主表,需要做到的是,要覆盖所有查询主体【什么是查询主体,比如,我们要查询所有学生的身高,体重,.......,这个里面的主体就是学生】如果各表覆盖的主体个数没有差异,左右联结和内联结没有区别。

⑤全联结【full join】查询结果返回左表和右表中的所有行,如果某行和另一个表中的行匹配的时候,则进行交叉联结,如果某一行和另一个表中的行没有匹配地方的时候,另一表对应的值用空值填充。【mysql不支持全联结】

6a94d5709454839ca6f469a2869dd15d.png

各种联结应用场景的汇总:

内联结:获取两个表的公共部分

外联结-左联结/右联结:生成固定行数的表单,或者申明说要哪个表的全部数据的时候。

5d757caac709e1cb18aaff5495b0ee01.png

联结应用案例:

练习1:查询所有学生的学号,姓名,选课数,总成绩

eb61c398426e7b0c4c26700c85e44793.png

练习2:查询平均成绩大于60分的所有学生的学号 ,姓名和平均成绩

8bd0379efa584f0e643393e02f82dad2.png

练习3:查询[所有]学生的选课情况【没选课的也需要显示】:学号,姓名,课程号,课程名称,授课老师。

51783ce5d65a5b7d745fc200e7df08b2.png

咋一看只需要学生表和课程表,教师表就能解决问题,但是分析发现,学生表和课程表之间并没有直接关系,是通过成绩表作为桥梁来产生关系的,所以,该题涉及了四张表,因为题目需求是查询是所有学生的相关选课信息,主体是学生,所以,student表应该成为第一个主表,以student表为主表组成的新表,也应该成为后续联结的主表,所以全部采用左联结。

87aff296997b8b8ff654dbc1c5904d2d.png
涉及多张表的时候需要弄清楚各张表之前的关联关系

如果采用右联结,则王同学选课记录会被忽略,所以左右联结有别,需要根据题目进行选择,如下图:

b2c7222941ddff2b792ba6d6e57d5e68.png

CASE表达式

CASE 

案例1:查询成绩表中对及格和不及格分数做出区分。

3d1a99c0f8d34a9f1373074a3a4fd10f.png
sql所有操作都是基于行的:先拿出第一条数据,选出学号,课程号,成绩,是否及格【需要判断】

案例2:查询每门课程中,及格人数不及格人数

6c445cd2cdc698dff599fef4088c3770.png

ac6d1c3050882370c04fd76fb27c1165.png
理解这张图

a679619981c5f854a75c30a6736125b4.png

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

可以先看一下联结后的查询结果:

ea5d2d8b46c70c0d4e799d554d04af06.png

加入自定义分组条件后的查询结果:

d614984ec2bcf3659b388615ff7ece3d.png

CASE语句特点总结:①使用场景多涉及自定义分组,②在case语句分组后,常常会形成新的列。③CASE分成0/1两组的时候,多配合聚合函数一起使用。④CASE是基于行来操作的。

sqlzoo:

961313cf3a657c9958fe49a0ea1b91a4.png

467b7a7e264545a60608c24f309c9b6a.png

dc3031666f3706d75afd2848ef9e1bfb.png

cd85bf4b17a2d407bbf90f8132abbf2c.png

f65cfa7949b39fec464954b2d22a53e6.png

a42e04523e84f1ecbf25fb9e4a08df12.png

b9a62c9990a9cdf5a84d26e7cde0f1ae.png

eb0f8a2125fed2c4fa5408b84018d3ce.png

7db3afa45a90e0522ba4186465bd5c30.png

0ac51c1d06d0e41c8dc115cd601a735e.png

1e1dcff9703823b90d01b6ac3cc3854e.png

错误原因:

1d3d414166e95c2635e01da403bee1fa.png

65c2b2ee07f5f4cc33813a84b7fe5bf2.png
having也是一样的

正确示例【若想不分组,则可以把count函数去掉,但是不符合题目需要】

6a1eec6b8c7d4c01f68b6d081497639e.png

2f86314eeaecbcbd25b5f390363edef2.png

47b73ffe260c2858018334d2d55a2dbf.png

若13题采用右联结,则没有进球的球队会被漏掉,而题目是要统计所有球队的相关信息,所以统计的主体是球队,应该把包含所有球队信息的game表作为主表,goal表只是统计了进球的球队,并不是每个球队都能进球,比如国......。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值