一、排序的窗口函数
row_number(): 1,2,3
依次排序,在排序时序号连续不重复。rank(): 1,1,3
并列跳跃排名,并列即相同的值保留重复名次。遇到下一个不同值时,跳跃到总共的排名。DENSE_RANK(): 1,1,2
组内的数据按ORDER BY子句排序,然后给每一行赋一个序号,形成一个序列。该序列从1开始,每次ORDER BY表达式的值发生变化时,该序列的序号值也随之增加。如果有值相同的话,序号也是相同的(认为null时相等的)。
序列返回时序号无间隔。
二、IN 和 EXISTS 区别
- 内外表查询
(1)IN
先执行内表查询获取结果集,然后对外表查询匹配结果集,返回数据。
(2)EXISTS
先执行外表查询,将外表中的每一条数据代入内表查询中,看是否满足条件。
EXISTS
返回的结果是一个 boolean 值 true 或者 false ,而不是某个结果集。因为它不关心返回的具体数据是什么,只是外层查询需要拿这个布尔值做判断。 - 索引
IN
在内表查询和外表查询中都会用到索引,EXISTS
只在内表查询中使用索引。 - 效率
如果外表较小,子查询的结果集较大时,使用EXISTS
,效率高
如果外表较大,子查询的结果集较小时,使用IN
,效率更高 not in
和not exists
not exists
的效率比not in
的效率高,与子查询的结果集无关。
not in
对内外表都进行了全表扫描,没有用到索引。not exists
对内表使用了索引。
三、索引
四、连接
将两个表的数据连接在一起。
- 外连接
左外连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,
如果找不到与左表匹配的,用null表示。
右外连接:显示右表所有数据及左表中符合条件的记录,左边不符合条件的记录用null表示。 - 内连接
两表中符合条件的记录。 - 交叉连接
使用笛卡尔积的连接。