中国统计网|SQL太难?你离完全理解SQL就差这10步!( 二 )
如果你想重用别名z , 你有两个选择 。 要么就重新写一遍 z 所代表的表达式:FROMA WHERE(A.x + A.y) =10…或者求助于衍生表、通用数据表达式或者视图 , 以避免别名重用 。 请看下文中的例子 。3.无论在语法上还是在执行顺序上 , UNION 总是排在在 ORDER BY 之前 。 很多人认为每个 UNION 段都能使用 ORDER BY 排序 , 但是根据 SQL 语言标准和各个数据库 SQL 的执行差异来看 , 这并不是真的 。 尽管某些数据库允许 SQL 语句对子查询(subqueries)或者派生表(derived tables)进行排序 , 但是这并不说明这个排序在 UNION 操作过后仍保持排序后的顺序 。注意:并非所有的数据库对 SQL 语句使用相同的解析方式 。 如 MySQL、PostgreSQL和 SQLite 中就不会按照上面第二点中所说的方式执行 。我们学到了什么?既然并不是所有的数据库都按照上述方式执行 SQL 预计 , 那我们的收获是什么?我们的收获是永远要记得:SQL 语句的语法顺序和其执行顺序并不一致 , 这样我们就能避免一般性的错误 。 如果你能记住 SQL 语句语法顺序和执行顺序的差异 , 你就能很容易的理解一些很常见的 SQL 问题 。当然 , 如果一种语言被设计成语法顺序直接反应其语句的执行顺序 , 那么这种语言对程序员是十分友好的 , 这种编程语言层面的设计理念已经被微软应用到了 LINQ 语言中 。3
SQL 语言的核心是对表的引用
由于 SQL 语句语法顺序和执行顺序的不同 , 很多同学会认为SELECT 中的字段信息是 SQL 语句的核心 。 其实真正的核心在于对表的引用 。根据 SQL 标准 , FROM 语句被定义为:<fromclause>::= FROM<tablereference>[ {<comma><tablereference>}... ]FROM 语句的“输出”是一张联合表 , 来自于所有引用的表在某一维度上的联合 。 我们们慢慢来分析:FROMa, b上面这句 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 中的一部分 , 而是一种特殊的表引用语句 。 SQL 语言标准中表的连接定义如下:<tablereference>::= <tablename> |<derivedtable> |<joinedtable>就拿之前的例子来说:FROMa, ba 可能输入下表的连接:a1JOIN a2ONa1.id = a2.id将它放到之前的例子中就变成了:FROMa1 JOIN a2ONa1.id = a2.id, b尽管将一个连接表用逗号跟另一张表联合在一起并不是常用作法 , 但是你的确可以这么做 。 结果就是 , 最终输出的表就有了 a1+a2+b 个字段了 。(译者注:原文这里用词为 degree, 译为维度 。 如果把一张表视图化 , 我们可以想象每一张表都是由横纵两个维度组成的 , 横向维度即我们所说的字段或者列 , 英文为columns;纵向维度即代表了每条数据 , 英文为 record, 根据上下文 , 作者这里所指的应该是字段数 。 )在SQL语句中派生表的引用甚至比表连接更加强大 , 下面我们就要讲到表连接 。我们学到了什么?思考问题时 , 要从表引用的角度出发 , 这样就很容易理解数据是怎样被 SQL 语句处理的 , 并且能够帮助你理解那些复杂的表引用是做什么的 。更重要的是 , 要理解 JOIN 是构建连接表的关键词 , 并不是 SELECT 语句的一部分 。 有一些数据库允许在 INSERT 、 UPDATE 、 DELETE 中使用 JOIN。5
推荐阅读
- 中年|中国-东盟区块链应用创新实验室揭牌
- IT爆料猿|中国电信6月5G用户数净增779万户,累计3784万
- 2020|影谱科技入选“2020中国AI商业落地价值潜力100强榜单”
- 中国航务周刊|港航业再现跨界收购!
- 招生|有道词典与中国教育在线合作,开通“高考招生”直播服务
- CSDN|由 Apache 说开,中国开源项目已经走向世界!
- AI财经社|谷歌云为何“放弃”中国市场?有人为它算了账,投入产出比太低
- 网速|全球网速排名:中国手机网速世界第三,美国第34
- 驱动中国|国内首次应用!支付宝开放宠物鼻纹识别技术:猫狗都能买保险
- 魅族|2020年BrandZ中国全球化品牌50强新鲜出炉,魅族再上榜,位列34名
