本文整理自网络,侵删。
格式良好的SQL并不会比乱七八糟的SQL运行效果更好。数据库其实不怎么关心SQL语句中你把逗号放到了字段名的前面还是后面。为了你自己思路清楚,应该做一个有效率的SQL编写者,我建议你遵守以下这些格式规则。在本文中我将分享如何通过格式良好的SQL语句提升生产率。我定义的效率指的是能从SQL 输出准确的结果,并且代码清晰易于理解、修改和调试。我只列出了“SELECT”语句,因为我写的SQL语句99%都是查询语句。格式化SQL代码是非常个性化的事,我也很清楚因人而异,开发者都认为自己的格式化规则是最合理的。
样例问题
下面是一个典型的SQL应用场景,业务报表的数据来自三张表,客户表、销售表和地域表。基于2015年一月份的数据,该报表需要展示在每个行政区内的客户总数和销量总数。该需求通过一个简单的SQL语句就可以实现,需要关联查询三张表。
数据可能出现的问题
虽然SQL很简单,但保证你的结果正确仍然是真正的关键,因为有下面一些原因可能导致错误:
数据可能来自不同的数据源。也就是说你不能保证这几个表之间的完整性。具体举例来说,你不能假定客户表中所有的邮政编码都是有效的邮政编码,并且一定在地域表中存在。
录入客户表数据的应用可能捕获到未经验证的地点数据,可能会包括错误的邮政编码。
邮政编码表可能不是完整的。新发布的邮政编码可能没有在发布后及时导入到表中。
第一原则
对我来说,相比于编写清晰易读的SQL,从SQL得到正确的结果才是第一要务。我要做的第一件事就是编写下面的SQL语句来获取客户总数。在我写完整个语句之后我会再调整它。
我写的第一个语句是这样的:
SELECTCOUNT(DISTINCT cust_id) as count_customersFROMcustomers Result: count_customers “10”
这个查询很重要,因为它紧紧围绕第一原则。因为没有SQL管理查询,也就没有依赖,我知道这就是客户数量的正确结果。我把这个结果记下来,因为我总需要拿这个数字来衡量后面的SQL(是否正确),在本文后面也会多次提到。
下一步要做的事就是添加必要的字段和表完成查询。我特意把“添加”这个词高亮标注出来,因为根据我的规则,我会在应用第一原则时把能获取相同结果的查询注释掉。下面就是我最终格式化的查询语句。
格式化SQL
下面就是根据我的格式化思路推荐的格式化SQL。
SELECT 0 ,c.cust_post_code ,p.location ,COUNT(DISTINCT c.cust_id) number_customers ,SUM(s.total_amount) as total_sales FROM customers c JOIN post_codes p ON c.cust_post_code = p.post_code JOIN sales s ON c.cust_id = s.cust_id WHERE 1=1 AND s.sales_date BETWEEN ‘2015-01-01' AND ‘2015-01-31' —AND s.order_id = 5 GROUP BY c.cust_post_code ,p.location
总是使用表别名
时间会证明这么做是有必要的。如果你没有对SQL语句中用到的每个字段使用别名,在将来某个时候可能会给这个查询语句添加进来别的同名字段。到那时候你的查询乃至报表就会产生错误(出现了重名字段名)。
相关阅读 >>
更多相关阅读请进入《sql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。