本次技总结术为SQL学习系列的一部分,本文主要对SQL语句及一些关键字使用一些白话
来展示我对SQL语句的一些了解和我在使用SQL的过程中会犯的一些错误,本次总结将围绕3点内容进行讨论:group by注意事项、Exist与In的区别、EXCEPT 与 NOT IN 的区别;
使用Group by必须要注意的点。第一就是GROUP BY后面跟着的列要与SELECT的列一一对应,若那一列是聚合函数则可以不用在GROUP BY后面加上。倘若一不小心SELECT上所有的列,那不好意思,除了改掉SELECT后的‘*’或在GROUP BY后面把所有列补上没有其他办法。如下图,或许有人会想这么做,但这种行为是不被支持的。
Exist与In的区别。Exist的功能是根据子查询内容的有无返回true或false;In的功能是判断子查询返回的列是否存在In左侧的固值决定true或false。它们之间的共同点是都可以作为条件查询;它们之间的不同点是Exist的子查询返回bool值,In的子查询返回结果集;而且Exist比In更灵活,In只能用于字段的判断,Exist可以通过子查询返回的结果集判断多个字段的有无或更多的复合筛选。还需要注意的一点是In的子查询返回集需要与In左侧固值的数据类型和列数一致
EXCEPT 与 NOT IN 的区别:EXCEPT再返回结果集时会对相同的数据去重复
NOT IN语句:
EXCEPT语句:
对比NOT IN语句与EXCEPT语句的会发现它们的不同:一样意思的查询语句,结果集却不一样,就是因为EXCEPT对数据额外做了一步:进行了去重复。那EXCEPT的背后是根据什么条件进行去重复的呢?在这里我对EXCEPT语句做了一些修改:
在SELECT中加入了一个score列,然后再执行,结果是4条和NOT IN语句返回的数据条数一样, 然后我又在sc里面加了一条“c002,81.90”数据
再使用NOT IN语句和新的EXCEPT语句查询结果分别如下:
由以上两图可知,EXCEPT的去重规则是:去除结果集中2或多条一模一样的数据(行)。