《10步完全理解SQL》收获

先贴蓝色神秘串:http://blog.jobbole.com/55086/#article-comment

非常好的一篇文章啊,读后收获颇多。虽然在校刚刚学完数据库系统,但课程重在讲述数据库系统原理,SQL只是讲了基本语法。自己虽然平时也用MySQL和Oracle,但也只是会用而已,对于语句背后的执行和意义并没有过多了了解。可能也是自己学习不精,没有去把SQL和数据库原理中的关系运算等知识联系在一起。下面是一些收获点:

1  SQL是一种声明式语言

SQL是一种声明式语言,所以在使用SQL时一定要转变传统编程观念--定义执行逻辑和顺序去指示数据库操作。我们在使用SQL的时候只是声明我们想要的结果集即可,数据库会自己处理好逻辑并返回结果。

2  SQL语法不按语法顺序执行

SQL语法执行顺序应该是:

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> UNION -> ORDER BY

FROM是第一个执行的这不难理解,因为要先将数据读入内存再进行WHERE和GROUP BY的筛选。SELECT是在之后执行的,这也是为什么一些数据库不支持在FROM中使用SELECT中定义的别名。

UNION是在ORDER BY之前执行的,也就是说我们的ORDER BY是可以将拼接后的结果进行排序的,也就是能保证拼接后有序。

3  SQL语句的核心是对表的引用

SQL的核心是对表的引用而不是SELECT。一个完整SQL执行过程就是一张张中间表的生成和传递的过程。

FROM语句输出一张“联合“表,来自所有引用的表在某一维度的集合。然后通过WHERE语句筛选和GROUP BY处理生成新的输出表。

注意这里GROUP BY也是对表的引用进行操作,它将WHERE过后的表的引用转换为一种新的引用方式。(注意GROUP BY语句的限制:用GROUP BY的时候,SELECT后没有使用聚合函数的列都要出现在GROUP BY后面)

这里如果结合数据库系统原理课上学的关系代数(集合论)来看,一张数据库的表就是一组数据元的关系,而每个 SQL 语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。

4  灵活的引用表可以创建功能强大的SQL语句

引用表主要通过JOIN关键字来实现。JOIN并不是SELECT语句的一部分,它是构建连接表的关键字。

尽量不要使用逗号来代替JOIN进行表连接。因为JOIN有两个优势在这里:安全和更多的连接方式。

JOIN有很多变体,提供内连接、外连接、半连接、全连接等等功能。

5  使用SQL中的派生表

派生表其实就是括号之间的子查询。使用派生表可以有效避免由于SQL逻辑产生的问题,同时一些情况下也可以提高SQL查询效率。

同样,因为SQL的核心是对表的引用,而不是对字段的引用,所以派生表是可以重用的。重用派生表可以通过WITH关键字实现。

6  SELECT实质是对关系的映射

这个不用过多解释,但SELECT语句有很多特殊规则,一些重要的如下:

  1. 你仅能够使用那些能通过表引用而得来的字段;
  2. 如果你有 GROUP BY 语句,你只能够使用 GROUP BY 语句后面的字段或者聚合函数;
  3. 当你的语句中没有 GROUP BY 的时候,可以使用开窗函数代替聚合函数;
  4. 当你的语句中没有 GROUP BY 的时候,你不能同时使用聚合函数和其它函数;
  5. 有一些方法可以将普通函数封装在聚合函数中;

7  灵活使用SQL语句中的几个关键字

  • DISTINCT:在映射之后对数据进行去重
  • UNION:将两个子查询拼接起来并去重
  • UNION ALL:将两个子查询拼接起来但不去重
  • EXCEPT:将第二个子查询中的结果从第一个子查询中去除
  • INTERSECT:保留两个子查询中都有的结果并去重
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值