墨天轮社区的每日一题(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篇文章分类和索引》