牛客数据库SQL实战刷题记录 D-2

SQL刷题记录 D-2

1. 题目:查找当前薪水详情以及部门编号dept_no

  • 题目描述
查找各个部门当前(to_date='9999-01-01')领导
当前薪水详情以及其对应部门编号dept_no
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`));
  • 输出:
emp_nosalaryfrom_dateto_datedept_no
10002725272001-08-029999-01-01d001
10004740572001-11-279999-01-01d004
10005946922001-09-099999-01-01d003
10006433112001-08-029999-01-01d002
10010944092001-11-239999-01-01d006
  • 代码
SELECT s.*,dep.dept_no
FROM salaries as s
INNER JOIN dept_manager as dep
ON s.emp_no=dep.emp_no
WHERE s.to_date='9999-01-01'
and dep.to_date='9999-01-01'
  • 思路
    利用INNER JOIN连接两个表,其中主表是salaries,因为输出中dept_no在最后一列。找出 “当前领导” 和 “当前薪水”。

2. 题目:查找所有已经分配部门的员工的last_name和first_name

  • 题目描述
查找所有已经分配部门的员工的last_name和first_name
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
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`));
  • 输出
last_namefirst_namedept_no
FacelloGeorgid001
省略省略省略
PiveteauDuangkaewd006
  • 代码:
SELECT e.last_name, e.first_name,dep.dept_no
FROM employees as e
JOIN dept_emp as dep
ON e.emp_no=dep.emp_no
  • 思路:
    使用inner join连接两个表中需要输出的列

3. 题目:查找所有员工的last_name和first_name以及对应部门编号dept_no

  • 题目描述
查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
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`));
  • 输出:
last_namefirst_namedept_no
FacelloGeorgid001
省略省略省略
SluisMaryMary
  • 代码:
SELECT e.last_name,e.first_name,dep.dept_no
FROM employees as e
LEFT JOIN dept_emp as dep
ON e.emp_no=dep.emp_no
  • 思路:
    使用LEFT JOIN连接左右两表,无论右表是否有值,左表都会全部读取

下图描述了INNER JOINFULL OUTER JOIN,LEFT JOINRIGHT JOIN的区别
在这里插入图片描述来源:SQL 连接(JOIN)用法

4. 题目:查找所有员工入职时候的薪水情况

  • 题目描述:
查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序
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`));
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`));
  • 输出:
emp_nosalary
1001125828
省略省略
1000160117
  • 代码:
SELECT e.emp_no,s.salary
FROM employees as e
INNER JOIN salaries as s
ON e.emp_no=s.emp_no
AND e.hire_date=s.from_date 
ORDER BY e.emp_no DESC
  • 思路:
    由于会涨薪,每个人的薪水可能对应多个值,所以salaries表中emp_no不是唯一的,但是employees表中emp_no唯一,这样可以根据employees表中的emp_no找到salaries表中的对应emp_no。
    对于入职时薪水,salaries的时间应该和employees表中的hire_date相同。
    最后按照emp_no降序排列。

2019/11/13 好像JOIN的题暂告一段落了?按你胃,明天继续吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值