前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer数据库语句

剑指offer数据库语句

作者头像
名字是乱打的
发布2022-05-13 09:04:15
2120
发布2022-05-13 09:04:15
举报
文章被收录于专栏:软件工程

表结构

代码语言:javascript
复制
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));

查找最晚入职员工的所有信息

代码语言:javascript
复制
SELECT * FROM employees
WHERE hire_date = (SELECT MAX(hire_date) FROM employees WHERE );

这里注意max min等函数属于对结果进行的统计,因此我们不能将其直接作为条件(如hire_date=MAX(hire_date)),可以另起语句

查找入职员工时间排名倒数第三的员工所有信息

代码语言:javascript
复制
SELECT * FROM employees WHERE 
hire_date=(SELECT hire_date FROM employees ORDER BY  hire_date DESC LIMIT 2,1);

这里,注意ORDER BY 后面需要指定按什么排序,ORDER BY hire_date DESC,这里指按入职降序排序,DESC降序,ASC升序,不指定升降默认升序 Limit 用法 :LIMIT index,count 即从第几个开始(序号从0开始),拿多少个.

代码语言:javascript
复制
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

题目描述

查找各个部门当前(to_date='9999-01-01')领导薪水详情以及其对应部门编号dept_no
代码语言:javascript
复制
select salaries.emp_no,salaries.salary,salaries.from_date,salaries.to_date,dept_manager.dept_no
from salaries inner join dept_manager
on dept_manager.emp_no = salaries.emp_no
and dept_manager.to_date = '9999-01-01'
and salaries.to_date = '9999-01-01';
查找所有已经分配部门的员工的last_name和first_name
代码语言:javascript
复制
SELECT e.last_name,e.first_name ,d.dept_no
FROM dept_emp d LEFT JOIN employees e
WHERE d.emp_no=e.emp_no;
查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序
代码语言:javascript
复制
SELECT e.last_name,e.first_name,d.dept_no
FROM employees e LEFT JOIN  dept_emp d
on d.emp_no=e.emp_no;

注意: INNER JOIN 两边表同时有对应的数据,即任何一边缺失数据就不显示。 LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。 RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据。

查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序
代码语言:javascript
复制
SELECT e.emp_no,s.salary FROM employees e LEFT JOIN salaries s 
ON e.emp_no=s.emp_no 
WHERE s.from_date=e.hire_date
 ORDER BY e.emp_no DESC;
查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
代码语言:javascript
复制
SELECT s.emp_no ,COUNT(s.salary) FROM salaries s 
 GROUP BY s.emp_no 
HAVING COUNT(s.salary)>15;
找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示
代码语言:javascript
复制
SELECT   s.salary  FROM  salaries s 
WHERE s.to_date='9999-01-01'  
GROUP BY s.salary 
ORDER BY s.salary DESC;

这里注意,虽然在select里用 distinct去重,但是大表一般用distinct效率不高,大数据量的时候都禁止用distinct,建议用group by解决重复问题。 另外: WHERE语句在GROUP BY语句之前,SQL会在分组之前计算WHERE语句。 HAVING语句在GROUP BY语句之后,SQL会在分组之后计算HAVING语句。

获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'
代码语言:javascript
复制
SELECT d.dept_no,d.emp_no,s.salary FROM dept_manager d LEFT JOIN salaries s ON d.emp_no=s.emp_no 
WHERE d.to_date='9999-01-01' AND s.to_date='9999-01-01';

注意,这里where必须是两个条件,如果值判断 s.to_date='9999-01-01' ,那么可能得到的部门管理者不是想求得,因为部分管理者可能离职

给出各部门工资第二高的雇员名字、工资及所在部门
代码语言:javascript
复制
select d.Name,e.Name ,e.Salary from Employee e ,Department d
on e.DepartmentId=d.Id where 
e.Salary<(select max(Salary) from Employee e1 where e1.DepartmentId = e.DepartmentId  )  ;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 表结构
  • 查找最晚入职员工的所有信息
  • 查找入职员工时间排名倒数第三的员工所有信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档