sql常用函数-case函数、if条件函数、日期函数

题目
题解:https://www.nowcoder.com/practice/30f9f470390a4a8a8dd3b8e1f8c7a9fa

解法1:利用CASE函数

select 
    case 
    when age<25 or isnull(age) then "25岁以下" # 注意这里写age is not null,是错的
    when age>=25 then '25岁及以上'
    end  as age_cut,
    count(*) as number
from 
    user_profile
group by
    age_cut;

或使用else:

select 
    case 
    when age<25 or isnull(age) then "25岁以下" # 注意这里写age is not null,是错的
    else '25岁及以上'
    end  as age_cut,
    count(*) as number
from 
    user_profile
group by
    age_cut;

注意:在case…when…子句中,例如 age在20-25之间(大于等于20、小于等于25)的写法只能为:age between 20 and 25.
拓展:
分为:
简单CASE函数
搜索CASE函数

简单 CASE函数

CASE 测试表达式
WHEN 简单表达式1 THEN 结果表达式1
WHEN 简单表达式2 THEN 结果表达式2WHEN 简单表达式n THEN 结果表达式n
[ ELSE 结果表达式n+1 ]
END AS 列名

计算测试表达式,按从上到下的书写顺序将测试表达式的值与每个WHEN子句的简单表达式进行比较。
如果某个简单表达式的值与测试表达式的值相等,则返回第一个与之匹配的WHEN子句所对应的结果表达式的值。
如果所有简单表达式的值与测试表达式的值都不相等,
若指定了ELSE子句,则返回ELSE子句中指定的结果表达式的值;
若没有指定ELSE子句,则返回NULL。

搜索CASE函数

CASE
WHEN 布尔表达式1 THEN 结果表达式1
WHEN 布尔表达式2 THEN 结果表达式2WHEN 布尔表达式n THEN 结果表达式n
[ ELSE 结果表达式n+1 ]
END AS 列名

按从上到下的书写顺序计算每个WHEN子句的布尔表达式。
返回第一个取值为TRUE的布尔表达式所对应的结果表达式的值。
如果没有取值为TRUE的布尔表达式,
则当指定了ELSE子句时,返回ELSE子句中指定的结果;
如果没有指定ELSE子句,则返回NULL。

解法2:if条件函数判断

if(条件,‘条件为真则是此值’,‘条件为假则是此值’)

select
    if (age>=25, "25岁及以上", "25岁以下") as age_cut,
    count(device_id) as number # count(*)、count(id)都可以
from 
    user_profile
group by 
    age_cut;

**解法3:union 联合查询 **

select
    "25岁以下" as age_cut,
    count(device_id) as number
from 
    user_profile
where
    age<25 or age is null
    
union all # 本题union也行

select
    "25岁及以上" as age_cut,
    count(device_id) as number
from 
    user_profile
where
    age>=25;
  1. 题目

日期函数

select 
    day(date) as day,
    count(question_id) as question_cnt
from 
    question_practice_detail
where 
    month(date)=8 and year(date)=2021
group by 
    day;

拓展:
DAYOFWEEK(date)
返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准。

select DAYOFWEEK('1998-02-03')
-> 3

WEEKDAY(date)
返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。

mysql> select WEEKDAY('1997-10-04 22:23:00');
-> 5

DAYOFMONTH(date)
返回date的月份中日期,在1到31范围内。

mysql> select DAYOFMONTH('1998-02-03');
-> 3

DAYOFYEAR(date)
返回date在一年中的日数, 在1到366范围内。

mysql> select DAYOFYEAR('1998-02-03');
-> 34

MONTH(date)
返回date的月份,范围1到12。

mysql> select MONTH('1998-02-03');
-> 2

DAYNAME(date)
返回date的星期名字。

mysql> select DAYNAME("1998-02-05");
-> 'Thursday'

MONTHNAME(date)
返回date的月份名字。

mysql> select MONTHNAME("1998-02-05");
-> 'February'

QUARTER(date)
返回date一年中的季度,范围1到4。

mysql> select QUARTER('98-04-01');
-> 2

WEEK(date)
对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到52。

mysql> select WEEK('1998-02-20');
-> 7

WEEK(date,first)
2个参数形式WEEK()允许你指定星期是否开始于星期天或星期一。
如果第二个参数是0,星期从星期天开始,
如果第二个参数是1,从星期一开始。

mysql> select WEEK('1998-02-20',0);
-> 7
mysql> select WEEK('1998-02-20',1);
-> 8

YEAR(date)
返回date的年份,范围在1000到9999。

mysql> select YEAR('98-02-03');
-> 1998

HOUR(time)
返回time的小时,范围是0到23。

mysql> select HOUR('10:05:03');
-> 10

MINUTE(time)
返回time的分钟,范围是0到59。

mysql> select MINUTE('98-02-03 10:05:03');
-> 5

SECOND(time)
回来time的秒数,范围是0到59。

mysql> select SECOND('10:05:03');
-> 3

PERIOD_ADD(P,N)
增加N个月到阶段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。

mysql> select PERIOD_ADD(9801,2);
-> 199803

PERIOD_DIFF(P1,P2)
返回在时期P1和P2之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数P1和P2不是日期值。

mysql> select PERIOD_DIFF(9802,199703);
-> 11
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值