暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL中的集合操作,你用过几个?

跟强哥学SQL 2021-04-19
887

记得以前在学校里,我的数学成绩还不错。不吹牛的说,初中时考试,考满分还是经常有的。后来上了高中,150分的题目拿个120+也是轻轻松松滴


不过上了高中才发现,山外有山,人外有人啊,数学学的好的同学真的一抓一大把,于是我这成绩,也就不怎么突出了。可虽说不突出吧,也差不多勉强够用了。


数学,是工作后为数不多的我觉得非常有用的学科,建议数学学的不好的同学可以多补补课。


扯远了。。。



集合的特性



还记得上高中的时候,学到的第一个数学概念就是集合。

在数学里,集合是指具有某种特定性质的对象汇总成的集体。而这些对象,被称为集合的元素。


数学里的集合有三个特性:确定性、互异性、无序性。


确定性:组成集合的元素的性质必须是明确的,不允许有模棱两可的情况;


互异性:组成集合中的元素不能重复;


无序性:组成集合中的元素是没有顺序的;


那么,数学里的集合,与我们在做数据处理时理解的数据集合有什么区别和相同点呢?


在数据库中,数据是按表存放的,一个表中的数据,可以理解为一个集合。表中的一行记录,可以理解为这个集合中的一个元素。


但与数学中的集合特性不同,数据库中的集合下的元素首先可以是不确定的。也就是说集合中的元素可以为未知的状态,比如NULL值。不了解NULL值的,可以参考之前的文章。


神秘的NULL值


其次,数据库中集合的元素,是可以重复的。也就是说,在数据库中,表中的两条记录可以完全相同。


不过在无序性这一点上,两者的特性是相同的。表中的数据本身在数据库中存储时,是完全无序的。如果想以某个顺序查询出来,就必须使用ORDER BY关键字。


有时候,没有添加ORDER BY关键字的SQL,查询出来的数据也是有序的。这是因为刚好这个表里的数据是按顺序插入的,存储的时候,也刚好以插入的顺序保存。但这个顺序是不稳定的,是会随着表里的数据被更新、被删除而变的无序。



集合的操作



在数学上,集合之间是可以做一些集合操作的。最常见的操作是取子集、并集、交集、差集等。


而我们知道,SQL语言就是一门处理数据集合的言。对应的,这些操作也都可以使用SQL语句来实现。


子集:一般来说,是从一个集合中,取出一部分元素,这部分元素,就是整个集合的子集。



比如对于上图,集合A就是集合B的一个子集。


如果集合B指的是某个学校的全部学生,集合A指的是所有一年级的学生,那么可以使用如下SQL语句获取集合A:


    select *
    from student
    where grade = '一年级';


    并集:指的是两个集合合并之后的集合。



    比如上图,并集指的是集合A和集合B合并后的阴影部分。


    如果集合A表示的是在一次学校运动会中,参加了长跑的学生,集合B表示的是参加了跳远的学生。那么并集指的是参加了长跑的学生或参加了跳远的学生。


    那么,可以使用如下SQL获取两个集合的并集:


      select student_id from a
      union all
      select student_id from b;


      上面说过,在数学中,集合是互异的。但在数据库中,数据集合中的元素是可以重复的。


      在上面的SQL中,使用了UNION ALL关键字获取两个集合的并集。如果有同学既参加了长跑,又参加了跳远。那么在SQL的执行结果中,student_id会出现重复。


      如果对重复的数据只想获取一条,也就是说,想要在集合合并时自动去重,需要使用UNION关键字:


        select student_id from a
        union
        select student_id from b;


        交集:顾名思义,指的是两个集合相交(公共)的部分。也就是两个集合中都出现过的元素。



        仍然以上面并集的例子说明,上图中的阴影部分指的是,既参加了长跑,又参加了跳远的同学。


        可以使用SQL语句中的INTERSECT关键字获取:


          select student_id from a
          intersect
          select student_id from b;


          差集:指两个集合相减,返回在一个集合中存在,而另一个集合中不存在的元素。



          上图中的阴影部分,就是集合A-集合B的结果,表示的是参加了长跑,但没有参加跳远的同学。


          可以使用关键字EXCEPT(也有数据库中使用MINUS)来获取:


            select student_id from a
            except
            select student_id from b;


            最后,预告一下,后天周四就是除夕夜了,我打算使用支付宝口令发100个红包。过年了,大家一起乐呵一下。口令推送时间,暂时定在周四中午12点,为了能及时收到推送,建议将本公众号置顶,并分享给需要的朋友。支付宝口令红包是先到先得,抢完为止,到时候大家关注下推文哈。


            推荐阅读:

            神秘的NULL值

            使用SQL进行数据去重的N种方法

            每周一练:第3周

            文章转载自跟强哥学SQL,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论