SQL语句整理(2)| 青训营笔记

95 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

以实例分析(一)分组查询

大范围语句套小范围语句 显示的东西写在“Select”

user_iduser_nameuser_sexpasswordregister_time
1熊猫66662022-08-14 15:22:01
2竹子12342022-09-14 16:17:44
3子竹43212022-09-16 07:42:21
4黑熊88882022-09-17 23:48:29
8猫熊88882022-09-27 17:22:29
9棕熊03692022-10-17 23:48:29

需求

  • 基于性别字段分组,然后 ID 排序,最后显示各组中的所有姓名,每个姓名之间用 隔开。

拆分需求 基于性别字段分组,然后 ID排序,最后显示各组中的所有姓名,每个姓名之间用 ,隔开。

涉及语句 Select 姓名 + From 表 + Group 性别 + Order By ID

注意点

  1. Select 显示有时需要包括 Group By 或者 Order By 的部分

逐步实现

  1. 基于姓名分组 —— Group By user_sex
select user_sex as "性别", convert(group_concat(user_id) using utf8) as "ID" from `zz_users` group by user_sex;

group_concat() 用分组结果组合选中结果

  1. 根据 ID 排序 —— Order By ID
select user_id from zz_users order by user_id desc;

这两步之后的拼接是:取并集

select user_sex as "性别", 
convert( group_concat(user_id order by user_id desc separator ",") using utf8) as "ID" 
from `zz_users` group by user_sex;

==将范围更小的套入到范围更大的==

  1. 按顺序显示姓名 -- Select 姓名
select user_sex as "性别",
convert( group_concat(user_name order by user_id desc separator ",") using utf8) as "姓名" 
from `zz_users` group by user_sex;

和前面的区别在 user_id 改为 user_name,id 本就不用显示。

以实例分析(二)控制流

都套在 Select 语句中

-- if的用例
select if(user_id > 3,"√","×") from zz_users;

-- ifnull的用例
select ifnull(user_id,"×") from zz_users;

-- case语法1:
case <表达式>
   when <1> then <操作>
   when <2> then <操作>
   ...
   else <操作>
end;
-- 用例:判断当前时间是星期几
select case weekday(now()) 
	when 0 then '星期一' 
	when 1 then '星期二' 
	when 2 then '星期三' 
	when 3 then '星期四' 
	when 4 then '星期五' 
	when 5 then '星期六'
	else '星期天'
end as "今天是星期几?";

-- case语法2:
case
    when <条件1> then <命令>
    when <条件2> then <命令>
    ...
    else commands
end;
-- 用例:判断今天是星期几
select case
	when weekday(now()) = 0 then '星期一' 
	when weekday(now()) = 1 then '星期二' 
	when weekday(now()) = 2 then '星期三' 
	when weekday(now()) = 3 then '星期四' 
	when weekday(now()) = 4 then '星期五' 
	when weekday(now()) = 5 then '星期六'
	else '星期天'
end as "今天是星期几?";