中国统计网 SQL太难?你离完全理解SQL就差这10步!
-点击上方“中国统计网”设置?星标不迷路!-

文章图片
很多程序员视SQL为洪水猛兽 。 SQL是一种为数不多的声明性语言 , 它的运行方式完全不同于我们所熟知的命令行语言、面向对象的程序语言、甚至是函数语言(尽管有些人认为SQL语言也是一种函数式语言) 。
我们每天都在写SQL并且应用在开源软件jOOQ中 。 于是我想把SQL之美介绍给那些仍然对它头疼不已的朋友 , 所以本文是为了以下读者而特地编写的:
在工作中会用到SQL但是对它并不完全了解的人
能够熟练使用SQL但是并不了解其语法逻辑的人
想要教别人SQL的人
本文着重介绍SELECT句式 , 其他的DML(DataManipulationLanguage数据操纵语言命令)将会在别的文章中进行介绍 。 011
SQL是一种声明式语言
首先要把这个概念记在脑中:“声明” 。 SQL语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例 , 而不是告诉计算机如何能够得到结果 。 这是不是很棒?(译者注:简单地说 , SQL语言声明的是结果集的属性 , 计算机会根据SQL所声明的内容来从数据库中挑选出符合声明的数据 , 而不是像传统编程思维去指示计算机如何操作 。 )SELECTfirst_name,last_nameFROMemployeesWHEREsalary>100000上面的例子很容易理解 , 我们不关心这些雇员记录从哪里来 , 我们所需要的只是那些高薪者的数据(译者注:salary>100000) 。 我们从哪儿学习到这些?如果SQL语言这么简单 , 那么是什么让人们“闻SQL色变”?主要的原因是:我们潜意识中的是按照命令式编程的思维方式思考问题的 。 就好像这样:“电脑 , 先执行这一步 , 再执行那一步 , 但是在那之前先检查一下是否满足条件A和条件B” 。 例如 , 用变量传参、使用循环语句、迭代、调用函数等等 , 都是这种命令式编程的思维惯式 。2
SQL的语法并不按照语法顺序执行
SQL语句有一个让大部分人都感到困惑的特性 , 就是:SQL语句的执行顺序跟其语句的语法顺序并不一致 。 SQL语句的语法顺序是:SELECT[DISTINCT]
FROM
WHERE
GROUPBY
HAVING
UNION
ORDERBY
为了方便理解 , 上面并没有把所有的SQL语法结构都列出来 , 但是已经足以说明SQL语句的语法顺序和其执行顺序完全不一样 , 就以上述语句为例 , 其执行顺序为:FROM
WHERE
GROUPBY
HAVING
SELECT
DISTINCT
UNION
ORDERBY
关于SQL语句的执行顺序 , 有三个值得我们注意的地方:1.FROM才是SQL语句执行的第一步 , 并非SELECT 。 数据库在执行SQL语句的第一步是将数据从硬盘加载到数据缓冲区中 , 以便对这些数据进行操作 。 (译者注:原文为“Thefirstthingthathappensisloadingdatafromthediskintomemory,inordertooperateonsuchdata.” , 但是并非如此 , 以Oracle等常用数据库为例 , 数据是从硬盘中抽取到数据缓冲区中进行操作 。 )2.SELECT是在大部分语句执行了之后才执行的 , 严格的说是在FROM和GROUPBY之后执行的 。 理解这一点是非常重要的 , 这就是你不能在WHERE中使用在SELECT中设定别名的字段作为判断条件的原因 。 SELECTA.x+A.yASzFROMAWHEREz=10--z在此处不可用 , 因为SELECT是最后执行的语句!如果你想重用别名z , 你有两个选择 。 要么就重新写一遍z所代表的表达式:FROMAWHERE(A.x+A.y)=10…或者求助于衍生表、通用数据表达式或者视图 , 以避免别名重用 。 请看下文中的例子 。 3.无论在语法上还是在执行顺序上 , UNION总是排在在ORDERBY之前 。 很多人认为每个UNION段都能使用ORDERBY排序 , 但是根据SQL语言标准和各个数据库SQL的执行差异来看 , 这并不是真的 。 尽管某些数据库允许SQL语句对子查询(subqueries)或者派生表(derivedtables)进行排序 , 但是这并不说明这个排序在UNION操作过后仍保持排序后的顺序 。 注意:并非所有的数据库对SQL语句使用相同的解析方式 。 如MySQL、PostgreSQL和SQLite中就不会按照上面第二点中所说的方式执行 。 我们学到了什么?既然并不是所有的数据库都按照上述方式执行SQL预计 , 那我们的收获是什么?我们的收获是永远要记得:SQL语句的语法顺序和其执行顺序并不一致 , 这样我们就能避免一般性的错误 。 如果你能记住SQL语句语法顺序和执行顺序的差异 , 你就能很容易的理解一些很常见的SQL问题 。 当然 , 如果一种语言被设计成语法顺序直接反应其语句的执行顺序 , 那么这种语言对程序员是十分友好的 , 这种编程语言层面的设计理念已经被微软应用到了LINQ语言中 。3
推荐阅读
- 中国科学报|无创血检可提前4年发现癌症
- 中国北斗横空出世纪实
- 中国青年网|如何入环火轨道,揭秘“天问一号”如何在太空保持轨道
- 一萌娱乐|美国12500公里,俄罗斯16000公里,中国,三国导弹射程
- 视听中国|伊外长强烈谴责,美军战机骚扰伊朗客机画面公开
- 中国青年网|指其策划设拉子清真寺爆炸,伊朗称拘捕涉美“恐怖组织”头目
- 中国青年网|有哪些不为人知的故事?,北斗心脏精度每三百万年差1秒
- IT之家|最强中国“心”!北斗心脏精度每三百万年差1秒
- 上游新闻|精度达到2-3米,北斗系统发言人:中国北斗攻克160余项关键技术
- 烽火营|中国导弹仅够用2天?俄罗斯答案打脸印度专家,如果爆发战争
