SQL上手比较简单,但是,不要被它简单外表迷惑了,如果我们问自己:多少次我尝试从大数据中抓取数据,但是获得了不完整或者错误的数据?答案是:太多次了,连自己都数不清!
今天,我们就来梳理下常见的SQL错误,可以归为三大类:
-
语法类
-
函数类
-
逻辑类
语法错误
1、标点错漏
逗号多或缺,括号等不成对,漏写引号、多余的空格等;
case when … end函数,有时候少写end;
select
col1,
col2,
col3,
from table
select含有 聚合函数(count, sum, avg)时,相应字段都要放入group by 后面。
2、重命名
如果有子查询,那么需要对子查询进行重命名
表的重命名不要搞混
3、数据拼接
union all时要求字段的名称和顺序都要保持一致;
join操作要求两边的字段格式一致;
join关联的时候注意是1对1映射还是1对多映射,小心出现笛卡尔积的情况。
4、拼写错误
表名、数据库名、字段名拼写错误。
Table 'XXX' doesn't exist
Unknown column 'XX' in 'field list'。
如果遇到这个报错时,去检查XXX拼写是否写正确,然后再去检查数据库中是否有这张表。
函数错误
1、参数数量
substring(str, pos)
substring(str, pos, length)
例如:上方 substring 函数需要两个参数,仅输入一个。
2、参数格式
select to_date('20210325') 返回值为null,因为数据格式不是日期时间
where order_time between '2021-03-01' and '2021-03-15'
使用between and时还要注意字段和条件的颗粒度匹配。
判断条件给到的格式是日期,而字段是日期时间格式,2021-03-15对应的日期时间格式是2021-03-15 00:00:00,那么实际上3月15号0点后的数据实际是没有被选中的,对于这种情况,可以将原有的日期时间字段用to_date或者substr处理一下。
3、函数用法
例如:between......and,注意最小值在前,最大值在后,是包含边界的;
例如:函数datediff中第1个参数是起始日期(通常是较小值),第2个参数是结束日期,如下:
select datediff(''d'','2021-01-01','2021-01-02')返回的是1;
select datediff(''d'','2021-01-02','2021-01-01')返回的是-1;
逻辑错误
1、数据重复
对于存在一对多关系的数据表关联后会产生数据重复,这种重复对于sum/avg等非去重的统计计算操作有影响,对count(distinct *)等去重计数操作没影响。
例如:一张母订单可以对应多张子订单;
例如:一个用户可以对应多条交易记录。
2、无效筛选
下方案例实际上b.tag='1' 这个筛选条件已经带有b.tag is not null 的“隐藏前提”了,所以这里用left join 和 join的效果是一样的。
select
a.col1,b.col2
from a
left join b on(a.id = b.id)
where b.tag = '1'
涉及到转化率的时候,表的顺序和转化率的顺序是一致的,且不能在where子句中添加后续流程的筛选条件,不然“隐藏前提”会过滤掉一部分数据而导致结果有误。
3、标签重叠
建立标签的时候要符合MECE原则(相互独立,完全穷尽);
一般来说建立标签的时候使用简单的逻辑,每个维度单独成列(基础标签);
例如:性别区分:男、女、未知;
编写SQL进行分组统计时,不建议使用“复合逻辑”标签,复合标签不仅逻辑上容易出错(标签重叠),维护成本也更高。
例如:一个用户在某一时刻,可能有多张优惠券,优惠券的状态可能是【已使用、已过期、未使用】等,现在要判断当前有“未使用”的优惠券。
4、时间错位
即数据匹配时要在时间维度上要对齐。
例如:T+1的用户标签匹配时,昨日的标签匹配今日的交易情况。