1. 关于空值
有如下一张表
当我们输入如下查询语句时:
SELECT * FROM Student
WHERE Sname != '吴兰'
得到如下结果:
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,获取一份精心整理的技术干货
后台回复关键字:进群,带你进入高手如云的交流群。