SQL的思维方式
要写一个复杂的SQL,实际上是一个化繁为简,再由简单堆砌为复杂的过程。我们可以以一个例子来说明这一点。
比如要实现这样的查询:查询最近一个月登陆三次以上并且最近一个月消费10元以上并且品牌不是1的用户。
这个查询实际上包括三个集合:
(1)最近一个月登陆三次以上的用户
(2)最近一个月消费10元以上的用户
(3)品牌是1的用户
查询结果=((1) and (2)) minus (3),即集合(1)和集合(2)取交集,结果还是集合,再和集合(3)做差集。
那么如何获取这三个集合呢?
(1)最近一个月登陆三次以上的用户:
集合(11):首先获取一个月内所有登陆用户记录得到集合,这个通过查询登陆日志表可以直接获取到;
集合(12):对(11)集合按用户分组,统计每个用户的登陆次数,再过滤出登陆三次以上的用户可以得到集合(12)
(2)最近一个月消费10元以上的用户:
集合(21):首先获取一个月内有消费记录的用户,这个通过查询消费日志表可以直接获取到;
集合(22):对(21)集合按用户分组,统计每个用户的消费金额,再过滤出消费10元以上的用户可以得到集合(22);
(3)品牌是1的用户:查询用户信息表使用品牌属性可以直接过滤出品牌为1的用户。
所以,最终的SQL是这样的:
(((11)分组=〉(12)) and ((21)分组=〉(22)))minus (3)
SQL基础的重要知识点
要掌握SQL基础,不包括性能优化,我们至少需要掌握哪些知识点呢?
知识点 | 掌握要求 |
单表基本SQL | (1)会加查询条件,知道哪些语句需要commit或rollback (2)会用for update或rowid方式更新数据,知道二者区别 (3)会写delete/truncate/insert语句,知道delete和truncate的区别 (4)查询SQL会筛选部分列,会给列加别名/显示名(双引号) (5)知道insert语句没有值的列会使用列的默认值 (6)会用distinct,order by,rownum (7)会用create创建表,掌握varchar2,date,number/integer三种数据类型,会建索引,主键,增加列和删除列 (8)会用in,not in,is null,is not null |
group by | (1)会用group by对数据分组,知道为什么分组后不能选择未分组列 (2)会对分组结果使用having做过滤,对分组结果做排序 (3)会用集函数(count,sum,min,max,avg) |
SQL嵌套 | (1)在select语句嵌套SQL,知道只能查出一条数据的一个列 (2)from后嵌套SQL (3)where条件中嵌套SQL (4)select和where中嵌套存储过程 |
表基本联结 | (1)掌握三个表的联结,明白结果和连接表数据之间的关系 (2)知道如何避免笛卡儿积联结 (3)明白多表联结中表的联结顺序 |
半联结 | (1)会用in和exists做半联结 (2)掌握in和exists的区别,in嵌套的SQL可以单独执行,但exists一般不可以 |
反联结 | (1)会用not in和not exists做反联结 (2)掌握not in和not exists对空值的差异 |
外联结 | (1)掌握left outer join和(+)的区别 (2)掌握多个条件的外连接写法(a.userid=b.userid(+) and b.usertype(+)=1) (3)注意外连接和where条件的顺序 (4)掌握全外连接full outer join |
集合操作 | (1)掌握集合操作方法:union,union all,minus,intersect (2)union all不需要排序,其他都需要 (3)查询出来的列必须一致 |
null | (1)如何判断空值 (2)注意判定一个子查询是否为空,nvl函数要加在select语句上,而不是查询列上 (3)count和sum,decode和case,not in和not exists对null的区别 |
SQL函数 | (1)nvl (2)decode (3)instr (4)replace (5)substr (6)to_char/to_date/to_number (7)listagg/wm_concat |
其他特性 | (1)会用connect by做树形查询 (2)会用partition,row_number做分析查询 (3)会写分页查询 |
微信关注【Java技术堂】