硬刚LeetCode之数据库系列


1.查找相邻两天的温度差,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。
原先的SQL是 :

select id from Weather w where exists (select 1 from Weather ww where w.recordDate - ww.recordDate =1 and w.Temperature  > ww.Temperature )

结果用例过了15个。。。死在最后一个。最后发现是时间相减的问题,
最后用上【DATEDIFF】函数:

select id from Weather w where exists (select 1 from Weather ww where DATEDIFF(w.recordDate,ww.recordDate )  =1 and w.Temperature  > ww.Temperature )

直接A。
附一下:TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 函数,主要用来计算两个时间差

interval取值:SECOND,MINUTE,HOUR,DAY,MONTH,YEAR

2.[查找N个部门中最高的薪资]
虽然自己写的比较臃肿,最后也是A了,不过看到了一种in的用法,比较巧妙,特此记录。

select 
    d.Name as Department,
    e.Name as Employee,
    e.Salary 
from 
    Employee e,Department d 
where
    e.DepartmentId=d.id 
    and
    (e.Salary,e.DepartmentId) in (select max(Salary),DepartmentId from Employee group by DepartmentId);

3.substr(string,pos,end) end不填默认到最后面,mysql中pos从1开始。
upper 转换大写,lower转换小写。
求最大不仅可以用max 还可以 排序完limit1


4.连续空余座位 主要是考察 找出连续几条的某个值都是一样的情况,自己写的sql还是比较囊肿了一点- -<,参考了下别人的做法,巧妙的运用了abs函数。

select distinct c1.seat_id
from cinema c1, cinema c2
where abs(c2.seat_id-c1.seat_id)=1
and c1.free=1 and c2.free=1
order by c1.seat_id

5.using的用法。

select * from 表1 inner join 表2 on 表1.相同的列=表2.相同的列;

等同于

select * from 表1 inner join 表2 using(相同的列);

6.列转行和行转列
行转列用group by+sum if(case when),列转行用union all


7.count(字段)不会计算null的数量,但是count(*) 或者 count(1)会把null的也统计进去

8.统计中文字符变量的长度,用char_length(),用length()的话,汉字会默认占3个长度

声明:Codererrr's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 硬刚LeetCode之数据库系列


Coding Changes The World