蓬莱小课:SQL常见的三种错误指南

本文梳理了SQL常见的三大类错误:语法错误、函数错误和逻辑错误。包括标点错漏、重命名混淆、数据拼接问题、拼写错误等语法错误;参数数量、参数格式和函数用法等函数错误;以及数据重复、无效筛选、标签重叠和时间错位等逻辑错误。理解并避免这些错误能帮助提高SQL查询的准确性和效率。
摘要由CSDN通过智能技术生成

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 existUnknown 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的效果是一样的。

selecta.col1,b.col2from aleft join b on(a.id = b.id)where b.tag = '1'

涉及到转化率的时候,表的顺序和转化率的顺序是一致的,且不能在where子句中添加后续流程的筛选条件,不然“隐藏前提”会过滤掉一部分数据而导致结果有误。

3、标签重叠

建立标签的时候要符合MECE原则(相互独立,完全穷尽);

一般来说建立标签的时候使用简单的逻辑,每个维度单独成列(基础标签);

例如:性别区分:男、女、未知;

编写SQL进行分组统计时,不建议使用“复合逻辑”标签,复合标签不仅逻辑上容易出错(标签重叠),维护成本也更高。

例如:一个用户在某一时刻,可能有多张优惠券,优惠券的状态可能是【已使用、已过期、未使用】等,现在要判断当前有“未使用”的优惠券。

4、时间错位

即数据匹配时要在时间维度上要对齐。

例如:T+1的用户标签匹配时,昨日的标签匹配今日的交易情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值