MySQL刷题-day1

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
)

你可能感兴趣的:(mysql)