SQL复习(二)

142 阅读2分钟

CASE

SQL26 计算25岁以上和以下的用户数量

www.nowcoder.com/practice/30…

新知识点:

MySQL 的 case when 的语法有两种:

  1. 简单函数

CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END

SELECT NAME '英雄', 
CASE NAME WHEN '德莱文' 
THEN '斧子' WHEN '德玛西亚-盖伦' 
THEN '大宝剑' 
WHEN '暗夜猎手-VN' 
THEN '弩' 
ELSE '无' END '装备'
FROM user_info;

image.png

  1. 搜索函数

CASE WHEN [expr] THEN [result1]…ELSE [default] END

# when 表达式中可以使用 and 连接条件 
SELECT NAME '英雄', age '年龄', CASE WHEN age < 18 THEN '少年' WHEN age < 30 THEN '青年' WHEN age >= 30 AND age < 50 
THEN '中年' ELSE '老年' 
END '状态' 
FROM user_info;

image.png

题解:

select (case when age >= 25 then '25岁及以上' else '25岁以下' end) 'age_cut', count(device_id) as number from user_profile group by age_cut

day()、month()、year()

SQL28 计算用户8月每天的练题数量

www.nowcoder.com/practice/84…

收获:day(),month(),year()可以获取一个date的天,月,年

DISTINCT()、DATEDIFF()

DSQL29 计算用户的平均次日留存率

www.nowcoder.com/practice/12…

解题:

SELECT COUNT(distinct q2.device_id,q2.date)/count(DISTINCT q1.device_id,q1.date) as avg_ret from question_practice_detail as q1 left outer join question_practice_detail as q2 on q1.device_id=q2.device_id and DATEDIFF(q2.date,q1.date)=1

收获:

distinct 后面跟多个字段,就需要多个字段同时相同才去重,

datediff(q1.date,q2.date) 返回q1日期与q2日期的天数差值

SUBSTRING()、SUBSTRING_INDEX()

SQL30 统计每种性别的人数

www.nowcoder.com/practice/f0…

解题:

select substring_index(profile,',',-1) as gender, count(device_id) from user_submit group by gender; SELECT IF(u.profile LIKE '%female','female','male') as gender,COUNT(1) as number FROM user_submit u GROUP BY gender;

收获:

SUBSTRING(str,n,len)

mysql中下标是从1开始的。substring截取字符串。

SELECT SUBSTRING('computer',3) AS col1, -- 从第三个字符到最后 -> SUBSTRING('computer',3,4) AS col2, -- 从第三个字符截取4个 -> SUBSTRING('computer',-3) AS col3, -- 从右到左第三个到最后 -> SUBSTRING('computer',-5,3) AS col4; -- 从右到左第5个截取3个 +--------+------+------+------+ | col1 | col2 | col3 | col4 | +--------+------+------+------+ | mputer | mput | ter | put | +--------+------+------+------+

SUBSTRING_INDEX(str, delim, count)

str:需要分割的串

delim:分隔符

count:当 count 为正数,取第 n 个分隔符之前的所有字符; 当 count 为负数,取倒数第 n 个分隔符之后的所有字符。