SQL非常容易上手,是所有语言中最简单的语言之一。许多人甚至不认为它是一种编程语言。但是,不要被SQL的简单外观所迷惑,如果我们问自己:有多少次我尝试从大数据中抓取数据,但得到的数据不完整或错误?答案是:次数太多了,我都数不过来了!正是因为SQL代码不容易报错(通常只要语法正确,就会返回一些数据,但不一定是你原本想要的),我们需要花更多的精力在校对上,以确保数据的准确性。下面,我们总结了5个最关键的SQL常见错误,以示警示:1.Queries语句的执行顺序进入SQL的门槛很低。许多人认为他们可以使用Join,GroupBy语句来称自己为专家。但是“砖头”真的知道SQL语句的执行顺序吗?SQL查询不以SELECT开头。虽然我们写代码的时候,都是从编辑器中的Select开始写的,但是实际的执行并不是从SELECT开始的。数据库首先使用FROM和JOIN执行查询,这就是为什么我们可以在WHERE中使用来自合并表的值。为什么不能在WHERE语句中过滤分组(GROUPBY)的结果呢?因为GROUPBY会在WHERE之后执行。因此,我们需要通过HAVING进行进一步的条件筛选。通常,SELECT是最后执行的语句。它决定了查询结果中需要输出哪些列,进行什么样的聚合操作。此外,WINDOWFUNCTION在此步骤执行。这就是为什么当我们尝试在WHERE中过滤WINDOWFUNCTION的结果时会出错的原因。注意:数据库使用查询优化器来优化查询执行。优化器可能会更改某些操作的顺序,以便查询运行得更快。上面的介绍只是对常见情况下SQL执行幕后发生的事情的一般概述。2.窗函数有什么作用?很多人第一次遇到WINDOWFUNCTION的时候,都觉得它好像很神秘。为什么要使用Window函数作为一个组来聚合数据?WindowFunction(WF)通过特定的语句简化了很多操作步骤,方便语句的执行:WF允许直接访问当前记录前后的数据。请参见LEAD和LAG函数。WF可以使用GROUPBY对已经聚合的数据执行额外的聚合。请参见上图中的示例:CalculatingmovingcumulativesalesusingWF。ROW_NUMBER可以遍历每一行。也可用于删除重复记录。或者随机抽样。顾名思义,WF可以计算给定窗口的统计信息:上面的WF计算的是从第一条记录到当前记录的累计和。WindowFunction的基本原理值得你花时间去学习,否则很有可能查询语句过于复杂导致程序报错。3、使用CASEWHEN计算平均值CASEWHEN类似于编程语言中的IF条件语句。当我们需要计算特定数据子集的统计数据时,它会派上用场。上面的代码计算的是产品在美国销售的平均价格,但是这段代码有个小问题,就是Else的写法有问题。在第一个语句中,此代码将所有非美国产品价格设置为0,从而降低了总体平均价格。如果有很多非美国的产品,平均价格可能接近于0。在第二个例子中,它只计算在美国销售的产品的平均价格,这就是我需要的结果。请注意,在此处使用CASE时不需要包含ELSE,因为它默认为NULL。请注意,在使用CASE语句时,请注意使用“else0”。它对SUM没有影响,但对AVG平均计算有很大影响。4.对有缺失值的列执行JOIN语句。SQL中有4种不同的JOIN:Inner、Outer、Left和Right。当我们在查询中使用JOIN时,它默认为INNERJOIN。虽然我对JOIN做了一些研究和研究,但还是会犯一些小错误。执行如上图所示的JOIN语句,结果显示丢失了很多条记录。为什么是这样?这显然是一个非常简单的JOIN语句。真正的原因是表1和表2中的string_field列中有很多NULL值。通常人们认为JOIN会保留NULL记录,因为NULL等于NULL,不是吗?然后我运行下面的语句:结果返回NULL。对于这种情况,为了不丢失带有NULL的记录,解决方法应该是使用COALESCE将string_field中的NULL转换为空字符串。但需要注意的是,这样做会将表1中每条包含NULL的记录与表2中每条包含NULL的记录进行匹配。通过使用ROW_NUMBER()的WINDOWFUNCTION,我们可以去除这些重复的匹配:假设数据表有一个唯一标识符“XXID”和每一行的时间戳字段。只需保留每个标识符的第一行,这将删除重复项。5、对于复杂的查询语句,不使用临时表。SQL的另一个主要优点是它可以调试和纠正错误。我们可以拆分复杂的查询并创建多个临时表。然后可以在这些表上运行“健全性检查”以确保它们包含正确的记录。在设计新的重要查询或报告时,强烈建议使用此方法。临时表的唯一缺点是数据库中的查询优化器无法优化该查询。当需要保证执行效率时,可以重新定义创建临时表的语句,用with语句查询。
