10个简单步骤,完全理解SQL
副标题[/!--empirenews.page--]
多年前收藏在笔记中的一篇文章,今天偶然翻出,重读了一遍,依然大有收获。分享出来,大家一起探讨。 以本文是为了以下读者而特地编写的:
本文着重介绍 SELECT 句式。 10个简单步骤,完全理解SQL 1、 SQL 是一种声明式语言 首先要把这个概念记在脑中:“声明”。 SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果。sql的执行引擎会根据你声明的数据结果去获取对应的数据。
上面的例子很容易理解,我们不关心这些雇员记录从哪里来,我们所需要的只是工资大于10W的员工。 我们从哪儿学习到这些? 如果 SQL 语言这么简单,那么是什么让人们“闻 SQL 色变”? 主要的原因是:我们潜意识中的是按照命令式编程的思维方式思考问题的。就好像这样:“电脑,先执行这一步,再执行那一步,但是在那之前先检查一下是否满足条件 A 和条件 B ”。例如,用变量传参、使用循环语句、迭代、调用函数等等,都是这种命令式编程的思维惯式。 2、 SQL 的语法并不按照语法顺序执行 SQL 语句有一个让大部分人都感到困惑的特性,就是:SQL 语句的执行顺序跟其语句的语法顺序并不一致。SQL 语句的语法顺序是:
为了方便理解,上面并没有把所有的 SQL 语法结构都列出来,但是已经足以说明 SQL 语句的语法顺序和其执行顺序完全不一样,就以上述语句为例,其执行顺序为:
关于 SQL 语句的执行顺序,有三个值得我们注意的地方:
如果你想重用别名z,你有两个选择。要么就重新写一遍 z 所代表的表达式:
或者求助于衍生表、通用数据表达式或者视图,以避免别名重用。
我们学到了什么? 既然并不是所有的数据库都按照上述方式执行 SQL,那我们的收获是什么? 我们的收获是永远要记得: SQL 语句的语法顺序和其执行顺序并不一致,这样我们就能避免一般性的错误。如果你能记住 SQL 语句语法顺序和执行顺序的差异,你就能很容易的理解一些很常见的 SQL 问题。 当然,如果一种语言被设计成语法顺序直接反应其语句的执行顺序,那么这种语言对程序员是十分友好的,这种编程语言层面的设计理念已经被微软应用到了 LINQ 语言中。 3、 SQL 语言的核心是对表的引用(table references) 由于 SQL 语句语法顺序和执行顺序的不同,很多同学会认为SELECT 中的字段信息是 SQL 语句的核心。其实真正的核心在于对表的引用。 根据 SQL 标准,FROM 语句被定义为:
FROM 语句的“输出”是一张联合表,来自于所有引用的表在某一维度上的联合。我们们慢慢来分析:
上面这句 FROM 语句的输出是一张联合表,联合了表 a 和表 b 。如果 a 表有三个字段, b 表有 5 个字段,那么这个“输出表”就有 8 ( =5+3)个字段。 这个联合表里的数据是 a*b,即 a 和 b 的笛卡尔积。换句话说,也就是 a 表中的每一条数据都要跟 b 表中的每一条数据配对。如果 a 表有3 条数据, b 表有 5 条数据,那么联合表就会有 15 ( =5*3)条数据。 FROM 输出的结果被 WHERE 语句筛选后要经过 GROUP BY 语句处理,从而形成新的输出结果。 如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个 SQL 语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。 我们学到了什么? 思考问题的时候从表的角度来思考问题提,这样很容易理解数据如何在 SQL 语句的“流水线”上进行了什么样的变动。 4、 灵活引用表能使 SQL 语句变得更强大 灵活引用表能使 SQL 语句变得更强大。一个简单的例子就是 JOIN 的使用。 严格的说 JOIN 语句并非是 SELECT 中的一部分,而是一种特殊的表引用语句。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |