SQL笔记--语法

语法汇总:添加链接描述

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 BETWEEN2012-1-1 00:00:00AND2012-1-11 23:59:59AND
      t1.login_time >=2012-1-2AND 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是对分组后数据的筛选。
**举例:**下面以一个例子来具体的讲解:

  1. 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’为男),但是怎么把它转换成汉字显示**呢?
原始表数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值