中国统计网 SQL太难?你离完全理解SQL就差这10步!( 四 )
SQL语句中的SELECT实质上是对关系的映射
我个人比较喜欢“映射”这个词 , 尤其是把它用在关系代数上 。 (译者注:原文用词为projection , 该词有两层含义 , 第一种含义是预测、规划、设计 , 第二种意思是投射、映射 , 经过反复推敲 , 我觉得这里用映射能够更直观的表达出SELECT的作用) 。 一旦你建立起来了表的引用 , 经过修改、变形 , 你能够一步一步的将其映射到另一个模型中 。 SELECT语句就像一个“投影仪” , 我们可以将其理解成一个将源表中的数据按照一定的逻辑转换成目标表数据的函数 。 通过SELECT语句 , 你能对每一个字段进行操作 , 通过复杂的表达式生成所需要的数据 。 SELECT语句有很多特殊的规则 , 至少你应该熟悉以下几条:你仅能够使用那些能通过表引用而得来的字段
如果你有GROUPBY语句 , 你只能够使用GROUPBY语句后面的字段或者聚合函数
当你的语句中没有GROUPBY的时候 , 可以使用开窗函数代替聚合函数
当你的语句中没有GROUPBY的时候 , 你不能同时使用聚合函数和其它函数
有一些方法可以将普通函数封装在聚合函数中
一些更复杂的规则多到足够写出另一篇文章了 。 比如:为何你不能在一个没有GROUPBY的SELECT语句中同时使用普通函数和聚合函数?(上面的第4条)原因如下:凭直觉 , 这种做法从逻辑上就讲不通
如果直觉不能够说服你 , 那么语法肯定能 。 SQL:1999标准引入了GROUPINGSETS , SQL:2003标准引入了groupsets:GROUPBY
无论什么时候 , 只要你的语句中出现了聚合函数 , 而且并没有明确的GROUPBY语句 , 这时一个不明确的、空的GROUPINGSET就会被应用到这段SQL中 。 因此 , 原始的逻辑顺序的规则就被打破了 , 映射(即SELECT)关系首先会影响到逻辑关系 , 其次就是语法关系 。 (译者注:这段话原文就比较艰涩 , 可以简单理解如下:在既有聚合函数又有普通函数的SQL语句中 , 如果没有GROUPBY进行分组 , SQL语句默认视整张表为一个分组 , 当聚合函数对某一字段进行聚合统计的时候 , 引用的表中的每一条record就失去了意义 , 全部的数据都聚合为一个统计值 , 你此时对每一条record使用其它函数是没有意义的) 。 糊涂了?是的 , 我也是 。 我们再回过头来看点浅显的东西吧 。 我们学到了什么?SELECT语句可能是SQL语句中最难的部分了 , 尽管他看上去很简单 。 其他语句的作用其实就是对表的不同形式的引用 。 而SELECT语句则把这些引用整合在了一起 , 通过逻辑规则将源表映射到目标表 , 而且这个过程是可逆的 , 我们可以清楚的知道目标表的数据是怎么来的 。 想要学习好SQL语言 , 就要在使用SELECT语句之前弄懂其他的语句 , 虽然SELECT是语法结构中的第一个关键词 , 但它应该是我们最后一个掌握的 。10
SQL语句中的几个简单的关键词:DISTINCT,UNION,ORDERBY和OFFSET
在学习完复杂的SELECT豫剧之后 , 我们再来看点简单的东西:集合运算(DISTINCT和UNION)
排序运算(ORDERBY , OFFSET…FETCH)
集合运算(setoperation)
集合运算集合运算主要操作在于集合上 , 事实上指的就是对表的一种操作 。 从概念上来说 , 他们很好理解:DISTINCT在映射之后对数据进行去重
UNION将两个子查询拼接起来并去重
UNIONALL将两个子查询拼接起来但不去重
EXCEPT将第二个字查询中的结果从第一个子查询中去掉
【中国统计网 SQL太难?你离完全理解SQL就差这10步!】INTERSECT保留两个子查询中都有的结果并去重
排序运算(orderingoperation)排序运算跟逻辑关系无关 。 这是一个SQL特有的功能 。 排序运算不仅在SQL语句的最后 , 而且在SQL语句运行的过程中也是最后执行的 。 使用ORDERBY和OFFSET…FETCH是保证数据能够按照顺序排列的最有效的方式 。 其他所有的排序方式都有一定随机性 , 尽管它们得到的排序结果是可重现的 。 OFFSET…SET是一个没有统一确定语法的语句 , 不同的数据库有不同的表达方式 , 如MySQL和PostgreSQL的LIMIT…OFFSET、SQLServer和Sybase的TOP…STARTAT等 。 让我们在工作中尽情的使用SQL!点击“在看”让更多朋友看到好内容!
推荐阅读
- 中国科学报|无创血检可提前4年发现癌症
- 中国北斗横空出世纪实
- 中国青年网|如何入环火轨道,揭秘“天问一号”如何在太空保持轨道
- 一萌娱乐|美国12500公里,俄罗斯16000公里,中国,三国导弹射程
- 视听中国|伊外长强烈谴责,美军战机骚扰伊朗客机画面公开
- 中国青年网|指其策划设拉子清真寺爆炸,伊朗称拘捕涉美“恐怖组织”头目
- 中国青年网|有哪些不为人知的故事?,北斗心脏精度每三百万年差1秒
- IT之家|最强中国“心”!北斗心脏精度每三百万年差1秒
- 上游新闻|精度达到2-3米,北斗系统发言人:中国北斗攻克160余项关键技术
- 烽火营|中国导弹仅够用2天?俄罗斯答案打脸印度专家,如果爆发战争
