语法汇总:添加链接描述
目录
-
- 1.SQL 取连续登录7天的数据
- 标题2.having 和 where区别
- 标题3.SQL写语句顺序、执行顺序
- 4.窗口函数
- 7.case when的使用方法
- 9.SQL怎么行转列?? -- case when和某些函数
- 10.sql limit函数
- 11.datediff函数
- 12. SQL语句中单引号、双引号和反引号的区分
- 13.%与mod的区别:
- 14.计算留存率
- 15.SQL常用日期函数
- 16. Uninon 跟uninon all 的区别
- 17.除了distinct外还有什么方法去重
- 18.SQL中AVG()、COUNT()、SUM()等函数对NULL值处理
- 18.1 hive中count(*)、count(1)、count(某字段)的区别
- 19.SQL中ON和WHERE的区别(转)
- 20.on、where、having的区别**
- 21.exist语句
- 22.coalesce函数
- 23.sql模糊匹配
- 24.drop,delete,truncate区别
1.SQL 取连续登录7天的数据
基本思路 Loop Join
首先想到的思路是一个类似于Loop Join的方法:
A. 取出2012-1-1到2012-1-11的每一条记录.
B. 对取出的每一条记录,再去表中查询这个用户的接下来6天的记录。
如果总数为6条记录,则满足连续7天的条件
- Range Join
Loop Join的思路可以通过一个Join语句来实现。姑且称之为Range Join。通常join时,使用的都是
等值join. 如果join列的值是唯一的,那么就是左表的一条记录对应右表的一条记录。而Range Join
中,左表的一行数据对应右表的一个范围内的所有记录。
- COUNT(DISTINCT)
“计算连续7天”,可以通过GROUP BY分组和COUNT()来完成。因为一个用户在1天内可能会有多次登录,
这里需要使用(COUNT DISTINCT). SQL 语句为:
SELECT DISTINCT t.uid FROM tmp_test AS t JOIN tmp_test AS t1
ON date(t.login_time) + 1 <= date(t1.login_time) AND
date(t.login_time) + 7 > date(t1.login_time) AND
t.uid = t1.uid
WHERE t.login_time BETWEEN ’2012-1-1 00:00:00′ AND ’2012-1-11 23:59:59′ AND
t1.login_time >= ’2012-1-2′ AND t.login_time < ’2012-1-18′(可去掉)
GROUP BY t.login_time, t.uid
HAVING COUNT(DISTINCT date(t1.login_time))=6
参考 :添加链接描述
标题2.having 和 where区别
1.“Where” 是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数。
“Having”是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。
2. 执行顺序where-group by -having
. WHERE语句在GROUPBY语句之前;SQL会在分组之前计算WHERE语句。
HAVING语句在GROUPBY语句之后;SQL会在分组之后计算HAVING语句。
3.where是对原始数据条件的筛选,having是对分组后数据的筛选。
**举例:**下面以一个例子来具体的讲解:
- where和having都可以使用的场景
1)select addtime,name from dw_users where addtime> 1500000000
2)select addtime,name from dw_users having addtime> 1500000000
解释:上面的having可以用的前提是我已经筛选出了addtime字段,在这种情况下和where的效果是等效的,但是如果我没有select addtime就会报错!!因为having是从前面筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。
参考:添加链接描述
标题3.SQL写语句顺序、执行顺序
写:select -from -where -group by -having -order by
执行: from -where -group by -having -select- order by
4.窗口函数
添加链接描述
(1)用法
<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)**只能用在select语句
(2)专用窗口函数:rank(),dense_rank(),row_number()
聚合函数:sum,avg,count,max,min
1.窗口函数语法
<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)
<窗口函数>的位置,可以放以下两种函数:
1) 专用窗口函数,比如rank, dense_rank, row_number等
2) 聚合函数,如sum. avg, count, max, min等
专用窗口函数使用规则:
rank函数:这个例子中是5位,5位,5位,8位,也就是如果有并列名次的行,会占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,4。
dense_rank函数:这个例子中是5位,5位,5位,6位,也就是如果有并列名次的行,不占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,2。
row_number函数:这个例子中是5位,6位,7位,8位,也就是不考虑并列名次的情况。比如前3名是并列的名次,排名是正常的1,2,3,4。
2.窗口函数有以下功能**:
1)同时具有分组(partition by)和排序(order by)的功能
2)不减少原表的行数,所以经常用来在每组内排名
3.注意事项
窗口函数原则上只能写在select子句中
4.窗口函数使用场景
业务需求“在每组内排名”,比如:
排名问题:每个部门按业绩来排名
topN问题:找出每个部门排名前N的员工进行奖励
7.case when的使用方法
Case具有两种格式。简单Case函数和Case搜索函数。
第一种 格式 : 简单Case函数 :
格式说明
case 列名
when 条件值1 then 选项1
when 条件值2 then 选项2.......
else 默认值 end
eg:
select
case job_level
when '1' then '1111'
when '2' then '1111'
when '3' then '1111'
else 'eee' end
from dbo.employee
第二种 格式 :Case搜索函数
格式说明
case
when 列名= 条件值1 then 选项1
when 列名=条件值2 then 选项2.......
else 默认值 end
eg:
update employee
set e_wage =
case
when job_level = '1' then e_wage*1.97
when job_level = '2' then e_wage*1.07
when job_level = '3' then e_wage*1.06
else e_wage*1.05
end
提示:通常我们在写Case When的语句的时候,会容易忘记 end 这个结束,一定要记得哟!
比较: 两种格式,可以实现相同的功能。
简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,Case函数只返回第一个符合条件的 值,剩下的Case部分将会被自动忽略。
二、case when使用案例
关于case when的使用情况有三种,第一、等值转换,第二、范围转换,第三、列转行操作。
1.等值转换
咱们在设计数据库的时候总是会把用户的性别用int存储**('0’为女,'1’为男),但是怎么把它转换成汉字显示**呢?
原始表数据