牛客网SQL练习题总结

练习过程中总结的零碎知识点

题目是找最晚入职员工信息,最先想到的做法是对date排序 desc,最后limit 1。问题是,严格意义上的最晚(严格到最新一秒)这个方法是可以的 但是如果那一天都算是最新的入职日,那天可能会有很多记录,so给date一个条件,这个date=max(date)。

**知识点:**1. limit M, n 表示从m+1条数据开始,取n条数据。
问题是找到入职时间倒数第三的员工信息
数据格式上时间没有精确到秒,只有日期,用limit 2,1可能会因为日期重复取到最新一天的日期,所以要给日期排序后去重,再取第三个日期。

Select * from employees where hire_date = (Select distinct hire_date from employees order by hire_date limit 2,1)

**知识点:**2. inner join 取得是两边表同时都有的数据,任何一边有缺失的数据都不会显示。
3. Having 用在 group by之后,对分组后的数据做条件筛选,比如某个ID对应多条记录时,用group by 对该ID分组,在having里选条件,选时间最晚的记录用having max(date)。
4. count函数不能用着where语句里,即没有where count(*)>3这种,但是可以写在having里。
5. distinct有多列去重功能,distinct name,address会把name和address都相同的记录去掉。
6. SQL的集合运算(交集、并集、差集),优先级intersect>except=union
交集intersect query1 返回结果m行,query2返回n行,两个查询中有h行相同,则query1 intersect query2返回那个相同的h行记录
并集union(all)
返回m+n行,union会删除重复值,union all不会
差集except
query1 except query2 返回m-n行,query2 except query1 返回n-m行
求除掉领导后的所有员工信息就可以利用except来做,

select * from employees except select * from managers;

未完,还在练习中~

你可能感兴趣的:(练习总结)