1.where和having的区别。
1、where是对原始数据的条件约束,约束的是原始表格的字段。
2、having是对分组后数据的筛选,having 前面多和group by l连用,后面跟聚合函数
2.join 的几种用法区别
(1) inner join/join级联查询两个表时,返回的结果是两个表中均存的记记录,即两个结果集的交集
(2) left join
级联查询两个表时,会返回的左表的所有记录 以及右表存在的记录,没有则返回null
(3)right join
级联查询两个表时,会返回的右表的所有记录以及左表存在的记录,没有则返回null。
(4)outer join /full join
会返回的两个表中所有的记录,没有则返回null
(5)cross join
交叉连接,得到的结果是两个表的乘积,即笛卡尔积
3. UNION 和UNION ALL的区别
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。
4. 归纳总结SQL中各种排序函数的用法、性能、区别
(1)通用
row_number/rank/dense_rank() over(partition by 分组列 order by 排序列 asc/desc)
在使用row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行。
(2)ROW_NUMBER 是去重排序
每一条的排名都不一样,不存在并列排名,如果一个字段数据相同,进行下一个字段的排序,直到每一条的排名都不一样为止
(3)RANK 属于跨越排序
根据某列的数据排序,如果数据相同则并列,下一位跨越排名
比如如果3条数据并列排第六名,那下一条数据排第九名
(4)DENSE_RANK 连续排序,
根据某列的数据排序,如果数据相同则并列,下一位顺延排名
比如如果3条数据并列排第六名,那下一条数据排第七名
5.窗口函数
窗口函数分为:
1) 专用窗口函数,比如rank, dense_rank, row_number等
2) 聚合函数,如sum. avg, count, max, min等
聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响。
窗口函数有以下功能:
1)同时具有分组(partition by)和排序(order by)的功能
2)不减少原表的行数,所以经常用来在每组内排名
6.in 和exists的区别
1)效率:
in 返回数值,exists返回布尔值,当子查询数据量较小,使用in更快,子查询数据量较小,使用exists更高效
2)查询
in可以选择数值和子查询,exists只能选子查询
3)NULL
EXISTS 子句可以将所有内容与 NULL 进行比较,而 IN 子句不能将任何内容与 NULL 进行比较。
详细介绍见https://www.javatpoint.com/in-vs-exists
持续更新~