SQL | 多表连接 | 薪水涨幅

一、查找当前所有雇员入职以来的薪水涨幅,给出雇员编号以及其对应的薪水涨幅,并按照薪水涨幅进行升序。

(注:薪水表中结束日期为2014-5-1的才是当前员工,否则是已离职员工)
1、创建表

# 表employee
CREATE TABLE IF NOT EXISTS employee(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
birthday DATE,
name VARCHAR(10),
sex VARCHAR(10),
hiredate DATE
);

# 表salary
CREATE TABLE IF NOT EXISTS salary(
emp_id INT,
salary INT,
startdate DATE,
enddate DATE,
CONSTRAINT FOREIGN KEY(emp_id) REFERENCES employee(emp_id)
);

2、插入数据

INSERT INTO employee VALUES(1,'1988-5-7','小明','男','2003-4-1'),
						   (2,'1989-7-7','小红','女','2008-9-9'),
						   (3,'1990-8-18','小兰','女','2006-5-1'),
						   (4,'1994-8-7','小飞','男','2010-3-17');

INSERT INTO salary VALUES(1,7680,'2003-4-1','2005-4-1'),
						 (1,12000,'2005-4-1','2008-4-1'),
						 (1,14560,'2008-4-1','2014-5-1'),
						 (2,8000,'2008-9-9','2010-5-1'),
						 (3,9000,'2006-5-1','2008-5-1'),
						 (3,11800,'2008-5-1','2014-5-1'),
						 (4,13000,'2010-3-17','2014-5-1');

3、逻辑SQL
(1)求出还在职人员的当前薪水

mysql> SELECT emp_id,salary AS endsalary
    -> FROM salary
    -> WHERE enddate='2014-5-1';
+--------+-----------+
| emp_id | endsalary |
+--------+-----------+
|      1 |     14560 |
|      3 |     11800 |
|      4 |     13000 |
+--------+-----------+
3 rows in set (0.00 sec)

(2)求出人员的起始薪水
两表连接,当startsalary=hiredate时,薪水为起始薪水
因后面考虑到两表做内连接,此步骤WHERE enddate='2014-5-1’可加可不加

mysql> SELECT e.emp_id,e.name,s.salary AS startsalary
    ->  FROM employee e LEFT JOIN salary s
    ->  ON e.emp_id=s.emp_id
    ->  AND e.hiredate=s.startdate;
+--------+--------+-------------+
| emp_id | name   | startsalary |
+--------+--------+-------------+
|      1 | 小明   |        7680 |
|      2 | 小红   |        8000 |
|      3 | 小兰   |        9000 |
|      4 | 小飞   |       13000 |
+--------+--------+-------------+
4 rows in set (0.00 sec)

(3)一二步骤的中间表内连接,求薪水差

mysql> SELECT t1.emp_id,t1.name,(t2.endsalary-t1.startsalary) AS '薪水涨幅'
    -> FROM (SELECT e.emp_id,e.name,s.salary AS startsalary
    ->  	FROM employee e LEFT JOIN salary s
    ->  	ON e.emp_id=s.emp_id
    ->  	AND e.hiredate=s.startdate) t1
    -> INNER JOIN
    ->  	(SELECT emp_id,salary AS endsalary
    ->  	FROM salary
    ->  	WHERE enddate='2014-5-1') t2
    -> ON t1.emp_id=t2.emp_id;
+--------+--------+--------------+
| emp_id | name   | 薪水涨幅     |
+--------+--------+--------------+
|      1 | 小明   |         6880 |
|      3 | 小兰   |         2800 |
|      4 | 小飞   |            0 |
+--------+--------+--------------+
3 rows in set (0.00 sec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值