最近面试当中有考到sql的,但没有答上来,所以去leetcode刷了一下sql,不得不说,sql里面还是有很多知识点的。
我是开了一个sql专栏进行学习的。
第一天
第一天基本毫无压力
前三道题就是简单的添加where条件,第四道用到了in关键字。
in关键字一般这样用:列明 in 集合(一般是select的集合)
第二天
第二天用到了不熟悉的语句
比如case when
第三天
第三天遇到了很多函数,比如:
concat()
,Upper()
,left
,Lower()
,substring()
,group_concat()
不知道的函数的查询可以用这个网站链接🔗
第四天
遇到一个好玩的题型,列转行和行转列:
【总结】
行列转换就是如下图所示两种展示形式的互相转换:
(上表/行表:student1;下表/列表:student2)
【行转列——MAX/SUM+CASE WHEN+GROUP BY】
SELECT name,
MAX(CASE WHEN subject='语文' THEN score ELSE 0 END) AS "语文",
MAX(CASE WHEN subject='数学' THEN score ELSE 0 END) AS "数学",
MAX(CASE WHEN subject='英语' THEN score ELSE 0 END) AS "英语"
FROM student1
GROUP BY name
【列转行——MAX+UNION+GROUP BY】
SELECT NAME,'语文' AS subject,MAX("语文") AS score
FROM student2 GROUP BY NAME
UNION
SELECT NAME,'数学' AS subject,MAX("数学") AS score
FROM student2 GROUP BY NAME
UNION
SELECT NAME,'英语' AS subject,MAX("英语") AS score
FROM student2 GROUP BY NAME
还有一个就是用求两个表中,只出现一次的值:
select employee_id
from
(
select employee_id from Employees
union all
select employee_id from Salaries
) as em
group by employee_id
having count(employee_id) = 1
order by employee_id
思路是先用union all将所有的值连接在一起,然后用group by分一下组,然后挑选只出现一行的。
第五天
一些连接查询,比较easy。
第六天
简单查询,子查询,比较easy
第七天
总结一下关于时间计算的方式
sql语句计算时间差
SELECT DATEDIFF('2008-8-30','2008-12-29') AS 时间差
sql语句 转化时间为指定的格式
select DATE_FORMAT(NOW(),'%m-%d-%Y')
计算两个日期的时间差
between '2019-06-28' and '2019-07-28'
第八天
主要是考察的group by,找到分组里最大的一个就是这样:
select user_id,max(time_stamp) as last_stamp
from Logins
where date_format(time_stamp,"%Y") =2020
group by user_id