牛客网Sql练习1~10
1.请你查找employees里最晚入职员工的所有信息![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/539c4bac0f90b23b48aa9e5b0a954dc1.png)
- 运用子查询
*注意:子查询where后要加括号
SELECT *
FROM employees
WHERE HIRE_DATE = (SELECT MAX(HIRE_DATE)
FROM employees );
- 通过倒序排列入职时间表找出第一条数据
*缺点:可能存在多条同时最晚入职的人 无法显示出
SELECT * FROM EMPLOYEES E
ORDER BY HIRE_DATE DESC
LIMIT 0,1;
##
limit是mysql独有的。
1. 语法:limit 开始的索引,每页查询的条数;
2. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
-- 每页显示3条记录
SELECT * FROM student LIMIT 0,3; -- 第1页
SELECT * FROM student LIMIT 3,3; -- 第2页
SELECT * FROM student LIMIT 6,3; -- 第3页
2.请你查找employees里入职员工时间排名倒数第三的员工所有信息
思路1:倒序排列 选择第三个
SELECT * FROM employees
ORDER BY HIRE_DATE DESC
LIMIT 2,1;
## 缺陷同题目1
思路2:用distinct 改进方法1
SELECT * FROM EMPLOYEES E
WHERE HIRE_DATE =
(SELECT DISTINCT HIRE_DATE FROM EMPLOYEES E ORDER BY HIRE_DATE DESC
LIMIT 2,1);
3.请你查找各个部门领导薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列
思路1:多表查询
- 注意:多表查询如果后面(用as)取了别名,前面的查询语句需要用别名.内容来查询
SELECT salaries.EMP_NO , salaries.SALARY , salaries.FROM_DATE , salaries.TO_DATE , dept_manager.DEPT_NO
FROM salaries, dept_manager
WHERE salaries.EMP_NO = dept_manager.EMP_NO
ORDER BY salaries.emp_no ASC;
4.请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示
分析:未分配部门的员工不显示 左连接后表中可能存在dept_no=null的情况
- 左连接 会产生null
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
WHERE d.dept_no IS NOT NULL ;
- 判断一个元素是否不为null 应该用 xx is not null
- 右连接
SELECT e.last_name, e.first_name, d.dept_no
FROM employees e
RIGHT JOIN dept_emp d ON
d.emp_no = e.emp_no ;
5.请你查找所有已经分配部门的员工的last_name和first_name以及dept_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 ;
7. 请你查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t
分析:使用聚合函数
- 当聚集函数和非聚集函数出现在一起时,需要将非聚集函数进行group by,当只做聚集函数查询时候,就不需要进行分组了。
- where 和 having 的区别?
* where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
* where 后不可以跟聚合函数,having可以进行聚合函数的判断。
SELECT EMP_NO ,COUNT(EMP_NO) t
FROM salaries
GROUP BY EMP_NO
HAVING t>15;
8.请你找出所有员工具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示
分析 :练习distinct
SELECT DISTINCT s.SALARY
FROM salaries s
ORDER BY s.SALARY DESC ;
10.请你找出所有非部门领导的员工emp_no
思路一:not in + 子查询
SELECT emp_no
FROM employees
WHERE emp_no NOT IN (SELECT emp_no
FROM dept_manager);
思路2:左连接+又表pk is null
SELECT e.emp_no
FROM employees e
LEFT JOIN dept_manager d ON
e.emp_no = d.emp_no
WHERE dept_no IS NULL;