sqlzoo刷完之后在牛客上开始刷题,记录思路和解答。
今天的题目比较简单,发现自己日期类型【MySQL必知必会十一章】不熟悉、然后是LIMIT,才知道可以限制展示的起始行数、最后是WHERE比JOIN快。【目前题目有点简单,之后只记录较难的题目】
1、查找最晚入职员工的所有信息
分析:找出最大的hire_date,之前以为需要对日期进行操作,比如取出年月日,结果直接使用MAX()函数就能选出最大日期。因为要求返回所有信息,所有需要使用一个子查询。
SELECT * FROM employees
WHERE hire_date = (
SELECT MAX(hire_date) FROM employees)
-- 使用order by排序的
SELECT * FROM employees
ORDER BY hire_date DESC
LIMIT 1
2、查找入职员工时间排名倒数第三的员工所有信息
分析:和上一题类似,这次找倒数第三的人,主要考察LIMIT子句,LIMIT子句+num表示限定输出前num行;LIMIT num1, num2表示从num1行开始,输出num2行的内容。其中num1默认是从第0行开始计算。
SELECT * FROM employees
WHERE hire_date = (
(SELECT hire_date FROM employees
ORDER BY hire_date DESC
LIMIT 2,1))
3、查找领导的薪水详情以及部门编号
分析:有两张表,使用默认的JOIN即可,排序的话,默认是按照第一个进行升序,因此不用管。WHERE比JOIN要快一点。
SELECT salaries.emp_no, salary, from_date, salaries.to_date, dept_no FROM salaries
JOIN dept_manager ON salaries.emp_no = dept_manager.emp_no
-- 使用where
SELECT s.*, d.dept_no FROM salaries s, dept_manager d
WHERE d.emp_no = s.emp_no
4、查找所有分配部门的员工
也可以用join,关键是选择dept_emp的emp_no
--显示分配员工
SELECT last_name, first_name, dept_no from employees e, dept_emp d
WHERE e.emp_no = d.emp_no
-- 显示所有员工
SELECT e.last_name, e.first_name, d.dept_no FROM employees e
LEFT JOIN dept_emp d ON e.emp_no = d.emp_no
5、薪水记录超过15次员工
对员工分组,计算组内的个数
6、薪水逆序
唯一值,然后是逆序
SELECT emp_no, COUNT(*) AS t FROM salaries
GROUP BY emp_no
HAVING t > 15
-- 找出所有薪水逆序
SELECT DISTINCT(salary) FROM salaries
ORDER BY salary DESC
--10找出非领导的员工
SELECT e.emp_no FROM employees e
WHERE emp_no NOT IN (
SELECT emp_no FROM dept_manager
)