SQL进阶篇

Posted 柳小葱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL进阶篇相关的知识,希望对你有一定的参考价值。

🐾今天我们来说一说SQL进阶篇的一些操作,主要的内容包含一些特殊函数介绍,例如:字符函数,时间函数,窗口函数等。详细内容请看下面👇:

1.字符函数

1.1 拼接两个字段

--CONCAT函数
SELECT CONCAT(user_id,Order_date) #拼接两个字段
from ord;

结果如下:

1.2 转换大小写

--LOWER与UPPER
SELECT LOWER("ABCDEFG");#转换为小写
SELECT UPPER("abdefg");#转化为大写

结果如下:

1.3 获取字符

--LEFT(str,n)取str左边起前n个字符
SELECT LEFT("abcdefg",3)#返回字符串右边3个字符

结果如下:

1.4 替换字符

--REPLACE(str,"s1","s2")使用s2代替str中的s1
SELECT REPLACE("ABCDEFG","CDE","cde");#使用cde代替字符串ABCDEFG 中的CDE

结果如下:

1.5 反转字符

-- REVERSE()函数
SELECT REVERSE("ABCDEFG");#反转字符

结果如下:

2.日期时间函数

2.1 获取当前日期时间

-- now()函数
SELECT now() #选择当前日期时间

结果如下:

2.2 获取当前日期

--CURDATE()函数
SELECT CURDATE()#选择当前日期

结果如下:

2.3 获取当前时间

--CURTIME()获取当前时间点
SELECT CURTIME()#选择当前时间点

结果如下:

2.4 获取年、月、日

--YEAR(),MONTH(),DAY()#选择当前的年,月,日
SELECT YEAR(NOW()),MONTH(NOW()),DAY(NOW())#选择当前的年,月,日

结果如下:

2.5 格林威治时间至某时间的秒数

--UNIX_TIMESTAMP()函数
SELECT UNIX_TIMESTAMP(NOW())#选择从1970-01-01到现在的秒数

结果如下:

也可以将秒数转换回去

--FROM_UNIXTIME()#反转秒数
SELECT FROM_UNIXTIME(1619712170,'%Y-%M-%d-%T')#将时间反转回去

结果如下:

2.6 天数之差

--DATEDIFF()#两日期之差,单位为天数。
SELECT DATEDIFF("2021-04-20","2021-04-10")#时间差,以天数为单位

结果如下:

2.7 转换时间格式

--DATE_FORMAT转换时间格式
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d')#转换时间格式

结果如下:

3.窗口函数

常见的窗口函数:

  • 聚合类
    sum()/count()/avg()/max()/min()over()
  • 排序窗口函数
    rank()over( ) 考虑数据重复,如1,1,3
    dense_rank()over()考虑数据重复 ,如1,1,2
    row_number()over()不考虑数据重复,如 1,2,3
  • 分组窗口函数
    ntile(n)over()
  • 偏移分析窗口函数
    lag(expr,n,default)over()
    lead(expr,n,default)over()

这里说一下窗口函数的范围,其实每个窗口函数后面都需要增加rows between来指定窗口的范围。

3.1 按照年份分组然后求和

#根据年与月份分组,然后求和
SELECT sales_date,SUM(sales)over(PARTITION by DATE_FORMAT(sales_date,'%Y-%m'))
FROM sales_rank;

结果如下:

3.2 按照年份分组然后求和(指定求和行)

#指定窗口的前后行
SELECT sales_date,AVG(sales)over(PARTITION by MONTH(sales_date) ORDER BY sales_date rows BETWEEN 1 preceding AND 1 following)
from sales_rank

结果如下:

解释一下:这里的第一行只有后面一行,前面没有行,所以计算的只有前两行的平均值,3-02只有前两个没有后两个。所以是(100+99)/ 2=99.5。

3.3 排序函数

rank() 考虑数据重复,挤占坑位

--rank排序
SELECT sales_date,sales,rank()over(PARTITION by MONTH(sales_date) ORDER BY sales DESC) rank1
FROM sales_rank;

结果如下:1,1,3

row_number() 考虑数据重复,不挤占坑位

#row_number()排序
SELECT sales_date,sales,row_number()over(PARTITION by MONTH(sales_date) ORDER BY sales DESC) rank1
FROM sales_rank;

结果如下:1,2,3

dense_rank() 不考虑数据的重复性,按照顺序依次标号

SELECT sales_date,sales,dense_rank()over(PARTITION by MONTH(sales_date) ORDER BY sales DESC) rank1
FROM sales_rank;

结果如下:1,1,2

3.4 分组函数ntile

这个函数可以获取前百分之n的数据。

--ntile函数
select sales_date,sales,NTILE(5)over(ORDER BY sales DESC) GROU
FROM sales_rank;

结果如下:

我们怎么获取前百分之n的数据呢?我们可以做一个子查询。

--做一个子查询,取1,2标签的值,就去取出了40%的数据 
SELECT * 
FROM (
select sales_date,sales,NTILE(5)over(ORDER BY sales DESC) GROU
FROM sales_rank
)tmp
WHERE GROU IN (1,2)
ORDER BY sales_date;

3.5 lag向前偏移

--LAG(sale,n,sale)向前n行偏移。
SELECT * ,LAG(sales,1,sales)over(ORDER BY sales_date) sal_lag
FROM sales_rank;

3.6 lead向前偏移

--## lead向上偏移
SELECT * ,LEAD(sales,1,sales)over(ORDER BY sales_date) sal_lag
FROM sales_rank;

结果如下:向上偏移

以上就是本章节的全部内容,有什么错误还行小伙伴们指点!

以上是关于SQL进阶篇的主要内容,如果未能解决你的问题,请参考以下文章

SQL进阶篇

SQL日常练习2-进阶篇-牛客网

SQL进阶篇之高级应用

SQL进阶篇之约束(Constraints)

mysql 开发进阶篇系列 5 SQL 优化

SQL进阶篇之函数