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)会加查询条件,知道哪些语句需要commitrollback

2)会用for updaterowid方式更新数据,知道二者区别

3)会写delete/truncate/insert语句,知道deletetruncate的区别

4)查询SQL会筛选部分列,会给列加别名/显示名(双引号)

5)知道insert语句没有值的列会使用列的默认值

6)会用distinctorder byrownum

7)会用create创建表,掌握varchar2datenumber/integer三种数据类型,会建索引,主键,增加列和删除列

8)会用innot inis nullis not null

group by

1)会用group by对数据分组,知道为什么分组后不能选择未分组列

2)会对分组结果使用having做过滤,对分组结果做排序

3)会用集函数(count,sum,min,max,avg

SQL嵌套

1)在select语句嵌套SQL,知道只能查出一条数据的一个列

2from后嵌套SQL

3where条件中嵌套SQL

4selectwhere中嵌套存储过程

表基本联结

1)掌握三个表的联结,明白结果和连接表数据之间的关系

2)知道如何避免笛卡儿积联结

3)明白多表联结中表的联结顺序

半联结

1)会用inexists做半联结

2)掌握inexists的区别,in嵌套的SQL可以单独执行,但exists一般不可以

反联结

1)会用not innot exists做反联结

2)掌握not innot 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

2union all不需要排序,其他都需要

3)查询出来的列必须一致

null

1)如何判断空值

2)注意判定一个子查询是否为空,nvl函数要加在select语句上,而不是查询列上

3countsumdecodecasenot innot existsnull的区别

SQL函数

1nvl

2decode

3instr

4replace

5substr

6to_char/to_date/to_number

7listagg/wm_concat

其他特性

1)会用connect by做树形查询

2)会用partitionrow_number做分析查询

(3)会写分页查询


微信关注【Java技术堂】

SQL基础知识点梳理_java

SQL基础知识点梳理_java_02