版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youngmiffy/article/details/84721159
一、CASE表达式(类似DECODE,IF)
1、两种表达式
--简单case表达式
case sex
when '1' then '男'
when '2'then '女'
else '其它' end
--搜索case表达式
case
when sex='1'then '男'
when sex='1'then '女'
else '其它' end
注意事项:
- 各分支条件返回的数据类型必须一致;
- 不要忘记写end;
- 养成写else子句的习惯;
2、解决场景如下:
- 行列转化:将group by计算出来的一维表进行行列转换,变成类似数据透视图的二维表;
- 已有数据重新更新:用case的时候只执行一次,防止了用两次update的时候第一次被更新的值用在了第二次的语句中,重复更新发生错误;
- 与约束的结合:check是对列值输入的时候加了限制,在使用check加限制的时候结合case when可以结合其他的列进行限制,更加灵活;
- 表之间的数据匹配:不同的表匹配涉及到(in,exists的用法)
- 针对聚合结果的条件分支:在case中可以使用聚合函数,在聚合函数中也可以使用case表达式
- 特别说明:新手用where、having子句进行分支,高手用select进行分支;
二、自连接
1、用自连接实现可重排列、排列、组合
- 直接取数就是笛卡尔积,就是可重排列;加上where条件<>就是排列,加上where条件>就是组合;
2、查找局部不一致的列;
3、排序(不依赖与数据库特有函数的排序,可拓展);
三、三值逻辑和NULL
- 三值:true false unknown;
- null不是值,对null使用比较谓词后得到的结果就是unknown,因为比较谓词只适用于值;
- in 和exists 可以互相替代使用,但是not in和 not exists不能互相替换,如果有null的时候,需要使用not exists;
- 极值函数在统计时会把null的数据排除掉;但是如果数据存在比较对象为空的时候,建议使用all,或者使用coalesce函数将返回的null处理为合适的值;