牛客网Sql练习 1~10

牛客网Sql练习1~10

1.请你查找employees里最晚入职员工的所有信息在这里插入图片描述
  1. 运用子查询
    *注意:子查询where后要加括号
SELECT *
FROM employees 
WHERE HIRE_DATE = (SELECT MAX(HIRE_DATE)
FROM employees );
  1. 通过倒序排列入职时间表找出第一条数据
    *缺点:可能存在多条同时最晚入职的人 无法显示出
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的情况
在这里插入图片描述

  1. 左连接 会产生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
  1. 右连接
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

分析:使用聚合函数

  1. 当聚集函数和非聚集函数出现在一起时,需要将非聚集函数进行group by,当只做聚集函数查询时候,就不需要进行分组了。
  2. 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;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值