一、关于Null
1. 存在null值的比较
如果null
参与比较运算,则结果会被视为false,即会跳过null的比较运算,如>=,<=,<>,>,<,not in,in,!=
,在where中使用比较运算符时会直接忽略存在null值的行,可能造成可用数据的缺失。
因此在数据清洗时最好根据需求填充或删除null值。
2. 分组键中存在null值
如果分组键中存在null值,则分组后会将所有null值行聚合为一个字段值为null的组。
3. null参与算术运算
null
参与任何算术运算均返回null,类似于numpy的nan
。同理,聚合函数对含有null的数据进行运算的时候一般也返回null,除了count()
,它会返回非null数值个数。
解决null值运算的方式有在聚合函数中嵌套ifnull
或isnull
函数
二、SQL执行顺序
from —> join —> on —> where —> group by —> having —> select —> distinct —> order by —> limit
-
where
的操作对象是from或join后生成的临时表,故其操作字段可以是全部字段 -
group by
的操作对象是where后生成的临时表,故可操作字段是全部字段 -
having
的操作对象仅可以是groupby后接的字段或者任何聚合函数
三、其他
- select与group by
select后聚合函数一定是仅能返回多个聚合函数加一个分组列,其他行无法返回,谨记,故求聚合数据如最大值的其他相关行数据时必须嵌套,若没有分组,则仅返回一个值,不能返回聚合值同行的其他字段。 - 外部联结条件失效
左连接时,使用table_a left outer join table_b and table_a =xx
时,后面的and条件无效,同理在右联结时,对右表的筛选也无效。 - 自联结的作用
- 通过自联结能够比较列与列之间的层次或逻辑关系
- 使得跨行比较转换为同行比较