[疯狂Java]SQL:对查询结果进行集合运算

1. 集合运算:

    1) 由于select查询结果是记录的集合,因此理所应当可以计算集合的交并补等;

    2) 对两个查询结果进行集合运算时两边的select查询都不需要加括号,因为这并不是子查询,这两个是平行的(地位相同的)查询;

    3) 集合运算的语法格式:select查询1 op select查询2;

    4) 因为实际问题并非数学问题那么抽象,因此查询结果的集合运算并不包括补,因为数学上一个集合经过补之后可能得到一个无限集合,但实际情况中是不存在无限集合的;

    5) 标准SQL之规定了3种集合运算:intersect(交)、union(并)、minus(减),但各个数据库对集合运算支持的并不是很好,比如MySQL就只提供了union,但并不支持intersect和minus,交和差需要通过where以及多表连接来手动实现;

    6) 在进行集合运算时,两边的查询结果必须满足列数相等、并且对应列的数据类型相同!

!这是显而易见的,因为两个表会合并成一张表;


2. union:

    1) 实现集合的并;

    2) 示例:select col1, col2 from t1 union select col3, col4 from t2;

    3) 注意两边查询结果的列数要相同,并且对应列的类型要一致;


3. minus:

    1) 实现集合的差,A-B=A中去除掉在B中也有的元素所得的集合;

    2) 对于标准SQL来说语法例如:select col1, col2 from t1 minus select col3, col4 from t2;

    3) 但是MySQL并不支持minus,因此需要用where not in来曲线实现minus:select col1, col2 from t1 where (col1, col2) not in(select col3, col4 from t2);


4. intersect:

    1) 实现集合的交;

    2) 对于标准SQL来说语法例如:select id, name from t1 intersect select id, name from t2;

    3) 但是MySQL并不支持intersect,因此需要使用多表连接查询来曲线实现intersect:select id, name from t1 join t2 on(t1.id = t2.id and t1.name = t2.name);

!!当然这里使用自然连接也行;

    4) 如果intersect的时候两边都用了where条件筛选,那么用多表连接查询时需要对两边where的条件合取!

         i. 例如:

select id, name from t1 where id < 4
intersect
select id, name from t2 where name like 'Pete%';
         ii. 用多表连接查询就要这样写:

select id, name from t1
join t2 using(id, name)
where t1.id < 4 and t2.name like 'Pete%';
!!不用担心查询底层是怎样实现的,这里你可能会认为该查询会先做连接,然后从连接的结果中再筛掉不满足where条件的,那这样岂不是效率很低;

!!但实际上现代数据库都非常只能,在连接的同时(或者在两条记录连接之前就会检查以下记录满不满足where条件,因此不会做一些重复的工作!!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值