1. 关于空值

有如下一张表

那些SQL里面踩过的坑_sql

当我们输入如下查询语句时:


SELECT * FROM  Student
WHERE Sname != '吴兰'


得到如下结果:

那些SQL里面踩过的坑_字段_02

WHERE Sname !='吴兰'

这个条件取出的数据中,不仅不含“吴兰”,也不包含空值的数据。

这个坑千万要记住!很容易出现。

所以后来,当我在使用!=的时候,习惯性用(Sname != ‘吴兰’ or Sname is null)

只要使用不等于的时候就加上 or 字段 is null 的语句,但是如果where 后面有多个条件,不要忘记括号的存在哟,否则会出现逻辑问题。


2. 关于JOIN

不管是LEFT JOIN,RIGHT JOIN 还是INNER JOIN ,一定要确保连接两张表的字段在这两张表中都是不重复的;

不要偷懒,处理数据着急、心慌意乱、粗心、偷懒是大忌啊!

看一看COUNT(*) 和COUNT(DISTINCT 字段) 的值是不是相等的,因为如果不相等,关联匹配就会出现一对多的情况,导致有些数据重复计算。


3. 关于时间

切记不能写<=’2020-06-24’ !为啥?

这是SQL中的一个边界问题,一般情况下,数据库中的时间都是年月日时分秒格式的。

<’2020-06-24’ 是指2020年6月24日之前,不包括6月24日这一整天的意思;

但是,<=’2020-06-24’ 包含了2020年6月24日00时00分00秒,并不会包含2020年6月24这一整天,你多出这一个尴尬的时间是为啥?

如过你想要包含'2020-06-24'这一天的数据,你应该+1天,就是<'2020-06-25'。


4. 关于字段类型

WHERE字段里面涉及的字段,在写条件之前需要知道它们的格式,尤其是弄清楚是字符号串类型还是数字类型。

因为数字和字符串是不会隐式转换的!

当你输入WHERE Type=1时怎么都找不对结果,其实人家存的字符串格式!应该是WHERE Type='1'


5. SET @变量名称=变量值 真的十分方便

针对需要重复使用的代码,如果代码是嵌套式的,或者需要跑好几段SQL代码。

比如做每日数据监控的时候,WHERE DATE>‘2020-06-24’,时间是需要替换的,每次都重新输入好几个地方非常麻烦,还有可能因为手抖输错了,然后run的时候报错了!此时脑袋里面出现几个大大的问号!

这时,可以这样

SET @DT=‘2020-06-24’
SELECT * FROM TABLEA WHERE DATE>@DT


每次只需要修改一下 @DT后面的日期值就行啦~


6. CASE WHEN

我时常会忘记写END ,然后跑代码的时候报错!尴尬!如果你没有可以忽略

CASE WHEN Sage<18 then 1
WHEN Sage>=18 AND Sage<25 THEN 2
When
End



7. 标点符号要是英文格式的呀

有时候写完字段的中文别名,没有把输入法切换回来,顺手打个中文符号没有注意。跑代码的时候就报错!尴尬!比如以下这种

SELET DATE 日期,
TNAME 姓名,
SAGE 年龄
FROM TABLEA


不仔细看,你能发现第一个逗号和第二个逗号的区别吗?



8. LEFT/RIGHT/SUBSTRING习惯性和REPLACE() 嵌套使用

因为有的数据不知道为什么(可能是IT代码写得不够规范),某列数据有些值得前后或者中间居然有空值。

比如身份号码,所有如果此时使用SUBSTRING(字段,7,4) 取四个字符串,就不能取出想要的字段,可能个别的错误值成了建模样本中的异常数据。

后来,我习惯用SUBSTRING(REPLACE(字段,’ ‘,’’),7,4)来代替,有备无患,小心使得万年船嘛~


以上就是平时写代码时踩过的一些坑,后面想起来了再继续给大家分享~


——End——



后台回复关键字:1024,获取一份精心整理的技术干货

后台回复关键字:进群,带你进入高手如云的交流群。


这是一个能学到技术的公众号,欢迎关注那些SQL里面踩过的坑_数据_03