当前位置: 首页 > 科技观察

如何使用格式正确的SQL提高效率和准确性

时间:2023-03-18 15:50:13 科技观察

背景格式正确的SQL并不比格式错误的SQL执行得更好。数据库并不真正关心你在SQL语句中的字段名之前还是之后放置逗号。为了让自己的思路清晰,你应该是一个高效的SQL编写者,我建议你遵守以下格式规则。在本文中,我将分享如何使用格式良好的SQL语句提高工作效率。我把效率定义为能够从SQL输出准确的结果,代码清晰易懂,易于修改和调试。我只列出了“SELECT”语句,因为我写的SQL语句99%都是查询。格式化SQL代码是一件非常个人化的事情,我知道因人而异,开发者认为自己的格式化规则是最合理的。示例问题下面是一个典型的SQL应用场景。业务报表的数据来自三个表,客户表、销售表和地区表。以2015年1月的数据为基础,报表需要展示每个行政区域的客户总数和销售量。这个需求可以通过一个简单的SQL语句实现,需要关联查询三张表。数据可能出现的问题SQL虽然简单,但是确保你的结果正确仍然是非常关键的,因为有一些原因可能会导致错误:数据可能来自不同的数据源。也就是说,你不能保证这些表之间的完整性。具体来说,例如,您不能假设客户表中的所有邮政编码都是有效的邮政编码并且必须存在于区域表中。输入客户表格数据的应用程序可能会捕获未经验证的位置数据,可能包括不正确的邮政编码。邮政编码列表可能不完整。新发布的邮政编码可能没有及时导入到表中以供发布。***原则对我来说,从SQL中获得正确的结果是绝对优先的,而不是编写清晰易读的SQL。我要做的第一件事是编写下面的SQL语句来获取客户总数。我会在写完整个声明后对其进行调整。我写的第一条语句是这样的:SELECTCOUNT(DISTINCTcust_id)ascount_customersFROMcustomersResult:count_customers"10"这个查询非常重要,因为它紧紧围绕着第一原则。由于没有SQL管理查询,因此没有依赖性,我知道这是客户数量的正确结果。我记下这个结果,因为我总是需要用这个数字来衡量后续的SQL(是否正确),本文后面会多次提到。接下来要做的是添加必要的字段和表来完成查询。我特意突出了“添加”这个词,因为根据我的规则,我将注释掉应用***原则时得到相同结果的查询。下面是我最终的格式化查询语句。格式化SQL以下是根据我的格式化思路推荐的格式化SQL。SELECT0,c.cust_post_code,p.location,COUNT(DISTINCTc.cust_id)number_customers,SUM(s.total_amount)astotal_salesFROMcustomerscJOINpost_codespONc.cust_post_code=p.post_codeJOINsalesONc.cust_id=s.cust_idWHERE1=1ANDs.sales_date'2'2015'-01-31—ANDs.order_id=5GROUPBYc.cust_post_code,p.location始终使用表别名时间将证明这样做是合理的。如果您没有为SQL语句中使用的每个字段都使用别名,那么在将来的某个时候您可能会在查询中添加另一个具有相同名称的字段。那时,你的查询甚至报表都会产生错误(出现重复的字段名)。逗号放在字段之前。在调试或测试我的查询语句时,这可以很容易地注释掉某个字段而无需修改其他行。所有逗号都没有丢失或多余。否则,您可能总是需要调整逗号以使语句正确。如果你经常需要调试语句,这样做会带来很大的方便和更高的效率。这种做法也适用于“SELECT”部分和“GROUPBY”子句部分。在开发中,我以“SELECT0”开始声明,在迁移到生产环境时很容易删除。这样我们就可以把前面的所有字段都写上了。没有这个“0”,如果我想注释掉第一个字段(在本例中为“c.cust_post_code”),我将不得不处理尾随的逗号。只好暂时注释掉了,以后再补回来。“GROUPBY”语句中也是如此。这个“0”是额外的。将“JOIN”单独放在一行将“JOIN”语句单独放在一行有以下好处:很容易看到这条查询语句涉及的所有表,只要看滚动的“JOIN”语句即可。使用“JOIN”而不是在“WHERE”子句中列出所有表和表达式关系,可以让您将所有逻辑关系放在一个地方。我们不能总是将“JOIN”语句放在一行中,但至少应该这样做。注释掉“JOIN”语句也相对容易。这在调试时非常有用,您可能需要知道“JOIN”是否导致数据问题。列模式编辑列模式编辑在处理大量字段时非常方便。这是我制作的第一个动画GIF,您可以在其中注释掉所有非聚集字段。我使用了列模式编辑,而不只是注释掉字段:创建所有索引当使用带有许多字段的UNION语句时:注释掉“GROUPBY”子句的字段列表测试查询结果我必须使用外连接“OUTER”所有列出客户是因为并非所有客户的邮政编码都在地理表中具有相应的邮政编码。我可以通过包含和排除不同的字段和对表的重复操作来确保我的查询结果与原始查询(单独查询客户的语句)相同。这其实也是对***原则的遵守。SELECT0,c.cust_post_code—,p.location,COUNT(DISTINCTc.cust_id)number_customers,SUM(s.total_amount)astotal_salesFROMcustomersc—LEFTOUTERJOINpost_codespONc.cust_post_code=p.post_codeJOINsalesONc.cust_id=s.cust_id1WHERE1=EN_dates'AND'2015-01-01'—ANDc.cust_post_code=2000—ANDp.post_code=200GROUPBYc.cust_post_code—,p.location这样的SQL对我来说意味着我必须编写独立的测试来检查数据。通过注释掉那几行语句,我就可以用***原理来验证我查询数据的准确性了。这样做提高了我的效率和报告的准确性。原文链接:http://www.searchdatabase.com.cn/showcontent_88809.htm