sql 两条数据 空值合并_SQL 多表查询

a36575011605687b06930479a408b870.png

994822903b6eb420c71e89198c54aa04.png

一.表的加法 union

1.1 表的加法/并集

使用union子句,合并两张结构相同 的表。

union子句默认去重合并,即去除重复数据只保留一个,需要保留重复数据,就使用union all ,即在union子句后面加上 all子句。

/*表的去重合并*/
select <列名1>,<列名2>,...
from <表1>
union
select <列名1>,<列名2>,...
from <表2>;

-

/*保留重复数据合并*/
select <列名1>,<列名2>,...
from <表1>
union all
select <列名1>,<列名2>,...
from <表2>;

1.2 union 的应用

c732f269390e42a87d240e3f689188e4.png

e6b4aceb31a9c8b1466880f1f8f6e059.png

1.3 union 的注意事项

  • 列数必须相同
  • 列的类型必须一致
  • order by 只能用一次

二.表的联结 join

2.1 表的联结

关系数据库是由多张表组成的,各表之间通过关联的字段/列 建立联结关系。

联结时,如果主表在与另一张表未匹配到数据则会在相应的列输出空值。

4c1cf747e3a796e36bdf7783d490d31e.png

2.2 交叉联结 /笛卡尔积 cross join

66f937775141cb335890a064663a3d39.png

将表中的每一行数据都跟另一个表的全部数据合并在一起,以此逐条合并。交叉联结是所有联结的基础,其他联结方法即在交叉基础上加入了过滤条件。

/*交叉联结的书写*/
select <列名1>,<列名2>,...
from <表1> as <表别名1>
cross join
<表2> as <表别名2>
on <联结条件>

2.2.1 cross join 的应用

be94ec1aeb040611e56f89b9d68d9148.png

交叉联结由于输出的结果较多,在实际业务中应用较少。

2.3 内联结 inner join

3be05193a18b44c293c1f7d79e80a341.png

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

/*内联结的书写*/
select <列名1>,<列名2>,...
from <表1> as <表别名1>
inner join
<表2> as <表别名2>
on <联结条件>

2.3.1 inner join 的应用

99c0d71b35209cfdd4536b4b1bbe234c.png

2.4 左联结 left join

e1d08125b5da10ac96554468f31f4046.png

以左侧的表作为主表,提取左表中的数据全部,右侧的表只取出与左表联结相同的数据。(如果主表的数据次表没有则联结时次表没有的数据会显示空值)

/*左联结的书写*/
select <列名1>,<列名2>,...
from <表1> as <表别名1>
left join
<表2> as <表别名2>
on <联结条件>

2.4.1 left join 的应用

25b713484780f6039c9cd4b132646780.png

2.5 右联结 right join

d67ec02fef8831e7e9940d98582c0b9c.png

以右侧的表作为主表,提取右表中的数据全部,左侧的表只取出与右表联结相同的数据。(如果主表的数据次表没有则联结时次表没有的数据会显示空值)

/*右联结的书写*/
select <列名1>,<列名2>,...
from <表1> as <表别名1>
right join
<表2> as <表别名2>
on <联结条件>

2.5.1 right join 的应用

ee36044829f8ac9457c4c24b2601be55.png

2.6 全联结 full join (My SQL不支持全联结)

443a2bdab64c6d804ea675a2d7bf1cf2.png

全联结的查询结果会返回左表和右表中的所有行,当某行与另一个表中有匹配的时候,两个行会进行合并,如果某行数据另一个表没有匹配则用空值来填充。

三. 联结的运行顺序,及其运用方法

3.1 运行顺序

138d3cf330caf70012e5f0a1a659ba29.png

3.2 运用方法

  1. 当实际工作业务中要用到两个表以上的时候就要使用联结。
  2. 想要生成固定行数的表单或者特别说明了要那一张表中的全部数据的时候,使用左/右联结,其他情况都用内联结获取两个表的公共部分。

3.3联结的应用案例

3e509146e663a8357e75734dcb440678.png

dae5bb399ec0ffed79d7ee41235150a9.png

0c3ae4736d3a68d77d32ea66be5fa680.png

因为是联结多个表查询,所以要在select子句中给各个列名加上表的别名。

e7936fa7ba98476c9ea37b2da1f1c1b5.png

若只想要主表除次表以外的数据,只需在where 子句中将次表联结的列输入=NULL即可。

四.case 表达式

4.1 case 表达式的运用方法

case 表达式 相当于条件判断函数,满足条件输出一个值,不满足条件输出另一个值。

可以和汇总函数一起使用 ,可以使用多个case表达式。当有多种情况需要条件判断的时候,就要使用case 表达式。

/*case 表达式的书写*/
case when<判断表达式> then<表达式>
     when<判断表达式> then<表达式>
     ...
    else <表达式>
end

4.2 case 表达式的应用

f8bf42478bf5b66c0f48ec44b5f502a5.png

89cd6404cce0259c045af9a3d269977f.png

e20ff72f269e1ad3f737a32e80a4be58.png

4.3 case 表达式的注意事项

  1. else<表达式>可以省略不写,即默认为返回空值。(培养书写习惯,不建议省略不写)
  2. end 语句不能省略不写。
  3. case 语句能写在任何SQL子句中。

五.SQLZOO:SELECT 练习

9fa58709bd36fbd6a1b7f6044bc2ca38.png

79789bc0028b5679389df70e267c569d.png

5968e8dfc4f3088828011f0f519a064a.png

69c99c13bc6d0de32423571278a648c4.png

2342afde75b3bc33657b9414cf4f2651.png

9c611a3529804a2f4cc213d99cd24259.png

107c4b2bdab37c3db4c59398bed99be2.png

e3d050a8320abc8d532edf821067a7aa.png

492d7fefac6a750c9eb13ee4f9b4a5f0.png

c2e8fca4b862c3ee92ffcdd4ef5e744d.png

0e1308924fb1b0b9a4a4c4333ef0971d.png

0477f90fd859146f10962cc4f1d47380.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值