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

几种去重的SQL写法

1138

墨天轮社区的每日一题(https://www.modb.pro/test),可以说是个小而精的专栏,利用碎片时间,就可以学习知识,非常推荐。

这是其中一道,考的就是SQL语法,基础中的基础,但乍一看,或许不是所有人能直接给出正确答案,不信你试试?

创建测试表,插入测试数据,一共4条,2条id=1,1条id=2,1条id是空,

    SQL> create table t1(id number);
    Table created.

    SQL> select rownum, id from t1;
    ROWNUM     ID
    -------- ---------
    1 1
    2 1
    3 2
    4

    选项A,按照id列执行group分组,会按照列id的值进行分组操作,包括空值,因此这个操作,是正确的选项,

      SQL> select id from t1 group by id;
      ID
      ----------
      1

      2

      选项B,他使用的是UNION,略微迷惑,但他是正确选项,

        SQL> select id from t1 union select null from dual;
        ID
        ----------
        1
        2

        UNION和UNION ALL的区别,UNION会做去重,UNION ALL则会返回所有的数据,

        The UNION operator returns only distinct rows that appear in either result, while the UNION ALL operator returns all rows.

        这就很清楚了,虽然select id from t1返回了所有数据,但通过使用UNION,就可以达到去重,而且连接UNION的可以是select 1 from t1,可以是select id from t1,只需要在数据类型上一致即可,

          SQL> select id from t1 union select 1 from t1;
          ID
          ----------
          1
          2


          SQL> select id from t1 union select id from t1;
          ID
          ----------
          1
          2

          选项C,是正确选型,可能有些朋友,很少见到unique的用法,其实他是Oracle的SQL风格支持的旧语法,在Oracle以外的数据库,很可能就报错了,

            SQL> select unique id from t1;
            ID
            ----------
            1

            2

            选项D,是正确选项,返回不重复记录,是distinct标准用途,distinct和unique的区别,就在于distinct是ANSI SQL标准语法,unique只在Oracle中支持,在其他的方面,两者是相同的,

              SQL> select distinct id from t1;
              ID
              ----------
              1

              2

              要是深挖下distinct和unique的用法,如下这个算是要注意的,如果表中无clob类型的字段,用distinct *和unique *都可以的,

              http://sqlfiddle.com/#!4/ce01b/51

              但是表中若存在clob类型的字段,此时用distinct *和unique *,就会报错,

              http://sqlfiddle.com/#!4/97d3e/26

              如果指定distinct和unique非clob类型的字段,就可以正常执行,

              http://sqlfiddle.com/#!4/97d3e/25

              近期的热文:

              六一儿童节带给我们的思考

              SQL查询总是先执行SELECT语句么?

              Oracle删除字段的方式和风险,你都了解么?

              最烧脑的珠峰高程测算过程

              了解阿克曼转向原理的作用

              《你就是孩子最好的玩具》学习笔记 - 第一章

              登录缓慢的诡异问题

              不可不知的7个JDK命令

              一个Full GC次数过多导致系统CPU 100%的案例排查

              ASCII码作用简介

              Java GC的基础知识

              Linux下的^M困惑

              Oracle相关提问的智慧技巧

              很久以前的一篇对初学Oracle建议的文章

              PLSQL Developer几个可能的隐患

              从70万字SRE神作提炼出的7千字精华文章

              从数据误删到全量恢复的惊险记录》《公众号600篇文章分类和索引

              最后修改时间:2020-06-08 09:23:53
              文章转载自bisal的个人杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论