关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 网站维护 »如何通过格式良好的SQL提高效率和准确性

    如何通过格式良好的SQL提高效率和准确性

    2015-09-14 00:00:00 出处:ITJS
    分享

    背景

    格式良好的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 server内容就是我最终格式化的查询语句。

    格式化SQL

    接下来的SQL server内容就是根据我的格式化思路推荐的格式化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语句中用到的每个字段使用别名,在将来某个时候可能会给这个查询语句添加进来别的同名字段。到那时候你的查询乃至报表就会产生错误(出现了重名字段名)。

    逗号放到字段之前

    在调试或者测试我的查询语句时,这么做可以方便地注释掉某个字段,而不需要修改其它行,所有的逗号都没有缺少或多余。不这么做的话你可能总要调整逗号才能保证语句正确。假如你经常要调试语句,这么做会带来极大方便,效率会更高。这个做法对“SELECT”部分和“GROUP BY”子句部分同样适用。

    在开发时我使用“SELECT 0”作为语句的开始,迁移到正式环境时它很容易删除掉。这样我们就可以在后面所有字段前面都写都好了。没有这个“0”的话,假如我想注释掉第一个字段(本例中是“c.cust_post_code”),我就必须处理后面的逗号问题。我必须临时注释掉它,将来还要加回来。在“GROUP BY”语句中也是一样的。这个“0”是额外加的。

    把“JOIN”放到独立行

    把“JOIN”语句放到独立行有以下好处:

    这么做很容易看到本查询语句涉及的所有表,只需要看滚动“JOIN”语句就可以了。

    使用“JOIN”相比于在“WHERE”子句中列出所有表和表达式关系,可以把所有逻辑关系都放到一个地方。我们不可能总是吧“JOIN”语句放到一行中,但是至少应该放到一起。

    这么做的话要注释掉“JOIN”语句也是相对容易的。这在调试时非常有用,你可能需要知道是否是“JOIN”引起了数据问题。

    列模式编辑

    在处理大量字段的情况时,列模式编辑非常方便。下面是我曾经做过的第一个动态GIF展示,你可以注释掉所有非聚集字段。我使用了列模式编辑,而不仅仅是注释掉字段:

    创建全部索引

    在使用字段较多的UNION语句时:

    注释掉“GROUP BY”子句的字段清单

    测试查询结果

    我必须使用外连接“OUTER”列出所有客户,因为不是所有客户的邮政编码都在地域表里有相应的邮政编码。我可以通过包含和排除不同字段和表反复操作来确保我查询的结果与最开始那个查询(单独查询客户的那个语句)结果相同,这其实是对第一原则的遵守。

    SELECT0,c.cust_post_code—,p.location,COUNT(DISTINCT c.cust_id) number_customers,SUM(s.total_amount) as total_salesFROMcustomers c—LEFT OUTER JOIN post_codes p ON c.cust_post_code = p.post_codeJOIN sales s ON c.cust_id = s.cust_idWHERE1=1AND s.sales_date BETWEEN ‘2015-01-01’ AND ‘2015-01-31’—AND c.cust_post_code = 2000—AND p.post_code = 200GROUP Byc.cust_post_code—,p.location 

    像这样的SQL对我来说意味着我必须写独立的测试来检查数据。通过注释掉的那几行语句我可以使用第一原则验证我查询数据的准确性。这么做提高了我的效率和报表的准确性。

    原文链接:http://www.searchdatabase.com.cn/showcontent_88809.htm

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。