mysql查询日期在当前日期之后的所有记录_面试必备sql知识点——MySQL基础进阶...

这篇博客深入探讨了如何使用MySQL查询日期在当前日期之后的所有记录,涵盖条件表达式、字符串和日期函数、算术函数以及窗口函数的用法。还介绍了自连接查询技巧,帮助读者提升SQL查询能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

65474a95f6804f7aed6ffe1eb5d131f7.png

上期讲解了MySQL的一些基础知识(面试必备sql知识点——MySQL基础)

本期继续深化知识点,基于基础,做进一步延伸。学习就是个不断反刍的过程,将碎片化的知识,搭建成完整的框架体系,才能够真正掌握。如果对你有帮助,建议点赞收藏!

内容大纲:

aa628cd9d53fe9559f6e7af597705c2c.png

一、条件

CASE表达式

case 函数的格式为:case when 判断表达式 then 表达式 else 表达式 end

else 可省略,end不可省略。

  • 连续数值转离散分类

d59e8ddbe48ae9cb95f8c0fae421c236.png
表格
--借款金额分组
select (case
when 借款金额>0 and 借款金额 <=5000 then '0-5000'
when 借款金额>5000 and 借款金额 <=10000 then '5000-10000'
when 借款金额>10000 and 借款金额 <=20000 then '10000-20000'
when 借款金额>20000 and 借款金额 <=50000 then '20000-50000'
else'50000以上' end )as "借款金额区间"
from table1
  • 行列转换

193dde3eeb4bd1c3c55b0636b46589ec.png
表格
SELECT 学号,
sum(case 课程号 when '001' then 成绩 else 0 end ) as '课程001',
sum(case 课程号 when '002' then 成绩 else 0 end ) as '课程002',
sum(case 课程号 when '003' then 成绩 else 0 end ) as '课程003'
from score
GROUP BY 学号;

9f518536042ea20b8df286eee682e342.png
查询结果

if函数

if函数格式为:if(条件,条件为真时的值,条件为假时的值)

如上述行列转换也可以这样写,得到的结果一致。

SELECT 
sum(if(课程号=001,成绩,0))as '课程001',
sum(if(课程号=002,成绩,0))as '课程002',
sum(if(课程号=003,成绩,0))as '课程003'
from score
GROUP BY 学号;

506d5af5ef3b3a883bc3457d60d72716.png
查询结果

但借款金额的分组就不如case when 书写方便了,但在计数算比列方面,if的写法可以减少查询的嵌套。

二、字符串函数

常用

  • concat 字符串拼接 —— concat(字符串,字符串···)

2a929310e7362be1b080cc2aa29be16d.png
表格
SELECT concat(str1,str2) as string
from str;

000f3dba7eeb3b99777311d39b83e476.png
查询结果
  • replace 字符串替换 —— replace(字符串,被替换的字符串,替换字符串)
-- 改变上表中str1列的值
UPDATE str set str1 = replace(str1,'ab','cc');

3055f25004df43e7a2023f340026a071.png
结果
  • substring字符串截取——substring(对象字符串 from 起始位置 for 截取字符数)

1436e127db537c6921483d628b1159a3.png
原表新增1列
UPDATE str set str3 = substring(str2 from 1 for 2);

ea5d30b135fcbceb59af659cdc1af039.png
str3列被赋值str2列字符串的前两个字符

不常用

  • length长度——length()
select length(str1) from str;

a6ca8d895af59c1466699c0a071c2749.png
str1列字符串对应长度
  • lower小写——lower()

28fedbca22e3c4ecc06d330ae0f8073d.png
修改一下str1列,将首字母改为大写
select lower(str1) from str;

d7d552b41a8e0493f896817a50dc40a1.png
结果
  • upper大写——upper()
select upper(str1) from str;

b4ba413ecee5c44c3d648b31189be539.png
结果

类型转换

cast——cast(值 as 类型)

select cast('20190308' as date ) as date;

a8814cd0e32da4b39d4d06e851a6a5e6.png
查询结果

三、日期函数

日期转换

  • str_to_date(format,date):将指定字符串格式转换成日期
SELECT STR_TO_DATE('2018/09/02', '%Y/%c/%d') AS output

e2a1bc1e99c10009df6b0192a223356b.png
  • date_format(date,format):将日期转换成指定字符串格式
SELECT DATE_FORMAT('2018-05-06', '%Y年%m月%d日')AS output;

4ebe3a156d160c7a73f04b216ebc79ca.png
  • from_unixtime(unix_timestamp,format):将时间戳转化为日期
SELECT FROM_UNIXTIME(1452959999,'%Y-%m-%d %H:%i:%s')as date;

c8b013bd5de915381baf22508d5934dd.png

日期提取

  • now( ) ——返回当前系统日期+时间
SELECT now( );

7f10676c87f98da1265f3b7b1771c9e1.png
  • curdate( )——返回当前系统日期,不包含时间
SELECT curdate( );

c1fc386a7f26fc4444e77ffa1d0f656b.png
  • curtime( ) ——返回当前时间,不包含日期
SELECT curtime( );

c953f041eb9fc6350ffb87d65ee0f27d.png
  • year ()month()day()——获取日期年月日(%Y-%m-%d)
SELECT YEAR('2019-01-08') AS 'year', MONTH('2019-03-06') AS 月, DAY('2019-02-09') "日";

1941eeb629fed164a577cef3d139c370.png
  • hour()minute ( ) second( ) ——获取日期时分秒(%h:%i:%s)
SELECT HOUR('2019-01-08 18:36:25') AS '时', MINUTE('2019-03-06 18:36:25') AS 分, 
SECOND('2019-02-09 18:36:25') "秒";

ed5e50d49ff8530b9d6b758f4d851661.png

日期运算

  • datediff——datediff(date1,date2) 返回起始时间 date1 和结束时间 date2 之间的天数。
SELECT DATEDIFF('2017-11-30','2017-11-27') AS date;

f0716cf7d22ccbe21dfe2c7317e0696d.png
  • date_sub——date_sub(date,INTERVAL expr type) 表示从日期减去指定的时间间隔后的日期,date参数是日期表达式。expr 参数是时间间隔,type 参数有很多,常用的是day。
SELECT DATE_sub('2017-11-30',interval 3 day) AS date;

b2477ef6de8d0f800cc828c2355edf47.png
  • dateadd——date_add(date,INTERVAL expr type) 表示向日期添加指定的时间间隔后的日期
SELECT DATE_add('2017-11-30',interval 3 day) AS date;

c42e6de615a20cffe49b55a17f3d876b.png

四、算术函数

  • + - * / —— 加减乘除:比较简单常用
  • round —— round(数值,保留小数的位数):对数据四舍五入处理
select round(1.3567,2) as number;

67ab2b7e7ec846b225c369831e7fa0ba.png
  • abs——abs(数值):求绝对值
select abs(-2) as number;

fb05680140b67596a7051322ec226134.png
  • mod——mod(被除数,除数):求余数
select mod(10,3) as number;

55eaf75d438c429544bd54608da81442.png

五、窗口函数

窗口函数语法: 窗口函数 over(partition by 列名 order by 列名)

partition by 后接的是分组列名 (可根据需求省略)

order by 后接的是排序的列名

简单来说,窗口函数的作用就是将数据表先分组后排序,然后根据选用的窗口函数来实现具体的功能。

mysql中窗口函数可以分为两类

【1】专用窗口函数(排序)

425ec0b13c21314e17a73e7fd0c3675f.png
  • rank 函数:计算排序时,存在相同位次记录,则会跳过之后位次:1,1,1,4····
-- rank()over(partition by 列名 order by 列名)
select*,rank()over(PARTITION by department ORDER BY salary desc)as rk
from table1;

8d61ab2553ee69967328242d125fcdd5.png
  • dense_rank函数:计算排序时,存在相同位次,也不会跳过之后的位次:1,1,1,2····
-- dense_rank()over(partition by 列名 order by 列名)
select*,dense_rank()over(PARTITION by department ORDER BY salary desc)as dr
from table1;

fa1579cdea44e56bcff951a4a99bdbde.png
  • row_number函数:计算排序时,哪怕值相同,也是连续排列:1,2,3,4·····
-- row_number()over(partition by 列名 order by 列名)
select*,row_number()over(PARTITION by department ORDER BY salary desc)as rn
from table1;

a3dcac85fa6a54c27d0807b375163d63.png

【2】聚合窗口函数(不常用)

聚合函数:sum、avg、count、max、min

  • sum作为窗口函数使用,计算累计值
select*,sum(salary)over(ORDER BY id)as sum_salary
from table1;

dd1ca23f87a765279cc5ed1c34afccbd.png
计算累计salary
  • avg作为窗口函数使用,计算移动平均

拓展:指定框架(汇总范围)

row N preceding :截止到当前记录之前N行——加上自身,一共计算N+1行值的平均值

row N following:截止到当前记录之后N行 ——加上自身,一共计算N+1行值的平均值

e7787edea2e12a1e933d482b16bcbe6c.png
某股票日收盘价格表
SELECT*,avg(close_price)over(ORDER BY date rows 1 preceding )as avg_2
from price;

bb0ced4a0487192e695655e85588f35b.png

六、自连接

自连接查询就是以类似多表对比的方式,实现对同一张表内的数据进行复杂的关系表示或关系处理。

示例1:成绩表score,查询001课程成绩>= 002课程成绩的学生的学号

1b60261f17c689d3b717664025787090.png

写法一:

SELECT a.学号,a.成绩 as score_001,b.成绩 as score_002
from score a ,score b
where a.学号=b.学号
and a.课程号 = 001 
and b.课程号 = 002
and a.成绩>=b.成绩;

写法二:

SELECT a.学号,a.成绩 as score_001,b.成绩 as score_002
from score a join score b
on a.学号 = b.学号
where a.课程号 =001 and b.课程号 =002
and a.成绩>=b.成绩;

53d2c8422e59b1b44442782ebd7bfc31.png

示例2:weather表,查询今日温度比昨天温度高的日期

7a56a34297a34ae0b05b2a3be731f5f2.png

写法一:

select a.recorddate
from weather a, weather b
where a.Temperature > b.Temperature
and datediff(a.RecordDate,b.RecordDate) = 1;

写法二:

select a.recorddate
from weather a join weather b
on a.Temperature > b.Temperature
where datediff(a.RecordDate,b.RecordDate) = 1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值