【SQL 初级语法 5】集合运算

目录

5 集合运算

5.1 表的加减法

1、表的加法 —— union 并集

2、集合的注意事项

3、包含重复行的集合运算 —— union all

4、选取表中公共部分 —— intersect (交集)

5、记录的减法 —— except (差集),用法与 union 相同

5.2 联结(join 以列为单位对表进行联结)

1、内联结(inner join)

2、外联结(outer join)

3、3张以上的表的联结

4、交叉联结 —— cross join

5、联结的特定语法和过时语法


5 集合运算

5.1 表的加减法

集合运算在数据库领域表示记录的集合。具体来说,表、视图和查询的执行结果都是记录的集合。

1、表的加法 —— union 并集

union 会去除重复的记录

2、集合的注意事项

注意事项1:作为运算对象的记录的列数必须相同

列数不一致时会发生错误

注意事项2:作为运算对象的记录中列的类型必须一致

相同位置的列必须是同一数据类型,如果两列都是日期,但一个是数值类型,一个是日期类型,也会发生错误。

注意事项3:可以使用任何 select 语句,但 order by 子句只能在最后使用一次

order by 只能在两个表 的最后一个 使用一次。

3、包含重复行的集合运算 —— union all

4、选取表中公共部分 —— intersect (交集)

intersect 选取两个记录集合中公共的部分,使用位置 与 union 相同,无重复行。

intersect all 保留重复行。

5、记录的减法 —— except (差集),用法与 union 相同

保留第一个表中第二个表没有的部分。

注意:在 Oracle 中使用 minus;减法运算的减数与被减数 的位置不同,所得到的结果也会不相同,4 - 2 ,4 这张表在前面。

除法比较难理解,属于 中级内容,暂不介绍。

5.2 联结(join 以列为单位对表进行联结)

SQL 联结根据其用途可以分为很多种类,这节希望大家掌握的有 内联结 和 外联结

1、内联结(inner join)

1.别名不是必须的,但是表明太长影响可读性,建议使用别名。

2.on 用来专门指定联结条件的,能起到与 where 子句相同的作用,需要指定多个键时,同样也可以使用 and、or,on 子句是必不可少的,如果没有 on 会发生错误,并且 on 必须写在 from 和 where 之间。

3.使用 select 语句指定列时,必须按照 <表的别名>.<列名> 的格式进行书写,为了避免混乱。

2、外联结(outer join)

1.内联结只能选取出同时存在于两张表中的数据,而外联结,只要数据存在于某一张表中,就能够读取出来。

2.哪张表当作主表,指定主表的关键字是 left 和 right,所以使用 left 时,左侧是主表,使用 right 时,右侧是主表,使用外联结中的 left 和 right 来指定主表,使用二者所得的结果完全相同。

select
from product p left outer join shopProduct sp on p.product_id = sp.product_id

3、3张以上的表的联结

4、交叉联结 —— cross join

这种联结在业务中并不会使用,但交叉联结是所有联结运算的基础,所以还是要介绍下。

select sp.shop_id,sp.shop_name,sp.product_id,p.product_name
from shopProduct as sp cross join product p

会输出非常非常非常多行。

进行交叉联结无法使用内联结和外联结中所使用的 on 子句,这是因为交叉联结是对两张表中的全部记录进行交叉组合,因此结果中的记录通常是两张表中行数的乘积。在本例中,shopProduct表一共有13条记录,Product 表存在8条记录,所以结果中就包含了13 x 8 = 104 条记录。

内联结是交叉联结的一部分,“内”可以理解为“包含在交叉联结结果中的部分”。外联结的“外”可以理解为“交叉联结结果之外的部分”。

交叉联结没有应用到实际业务之中的原因有两个,一是其结果没有实用价值,二是由于其结果行数太多,需要花费大量的运算时间和高性能设备支持。

5、联结的特定语法和过时语法

上面提到的联结都是符合标准 SQL 规定的,接下来介绍些年长程序员和系统工程师还在使用的特定语法和过时语法,以免工作中遇到不认识。

select sp.shop_id,sp.shop_name,sp.product_id,p.product_name
from ShopProduct sp,product p
where sp.product_id = p.producr_id
and sp.shop_id = '000A'

 

———————————————————————————————————————————

 点击链接 查看SQL 专栏更多文章:https://blog.csdn.net/weixin_46249441/category_11913899.html?spm=1001.2014.3001.5482

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值