转载自牛客网:
1 查找最晚入职员工的所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天
创建表语句:
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`));
输出描述:
emp_no | birth_date | first_name | last_name | gender | hire_date |
---|---|---|---|---|---|
10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 |
插入8条数据记录:
INSERT INTO employees VALUES(10001,'1982-01-22','Sami','Kate','F','2010-06-10');INSERT INTO employees VALUES(10002,'1983-09-22','Simi','Kim','F','2011-06-18');INSERT INTO employees VALUES(10003,'1984-01-12','Tomas','Yang','M','2011-09-11');INSERT INTO employees VALUES(10004,'1985-08-19','Alice','Jim','F','2012-03-16');INSERT INTO employees VALUES(10005,'1985-11-13','Weddy','van','F','2013-01-08');INSERT INTO employees VALUES(10006,'1986-12-1','Wed','Water','M','2013-07-18');INSERT INTO employees VALUES(10007,'1987-12-19','Gorge','Lee','M','2013-10-18');INSERT INTO employees VALUES(10008,'1991-12-19','Rory','Ben','M','2020-1-18');
查询表数据内容:
SELECT * FROM employees;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-----------+--------+------------+
| 10001 | 1982-01-22 | Sami | Kate | F | 2010-06-10 |
| 10002 | 1983-09-22 | Simi | Kim | F | 2011-06-18 |
| 10003 | 1984-01-12 | Tomas | Yang | M | 2011-09-11 |
| 10004 | 1985-08-19 | Alice | Jim | F | 2012-03-16 |
| 10005 | 1985-11-13 | Weddy | van | F | 2013-01-08 |
| 10006 | 1986-12-01 | Wed | Water | M | 2013-07-18 |
| 10007 | 1987-12-19 | Gorge | Lee | M | 2013-10-18 |
| 10008 | 1991-12-19 | Rory | Ben | M | 2020-01-18 |
+--------+------------+------------+-----------+--------+------------+
8 rows in set (0.00 sec)
SELECT * FROM employees ORDER BY hire_date DESC limit 1;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-----------+--------+------------+
| 10008 | 1991-12-19 | Rory | Ben | M | 2020-01-18 |
+--------+------------+------------+-----------+--------+------------+
1 row in set (0.00 sec)
思路:查询雇佣表,排序根据hire_date(倒序),限制数据条目为1
select * from employees order by hire_date desc limit 2,1;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-----------+--------+------------+
| 10006 | 1986-12-01 | Wed | Water | M | 2013-07-18 |
+--------+------------+------------+-----------+--------+------------+
1 row in set (0.00 sec)
注释:select * from table limit 2,1;
//跳过2条取出1条数据,limit后面是从第2条开始读,读取1条信息,即读取第3条数
select * FROM employees order by hire_date desc limit 1 offset 2;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-----------+--------+------------+
| 10006 | 1986-12-01 | Wed | Water | M | 2013-07-18 |
+--------+------------+------------+-----------+--------+------------+
1 row in set (0.00 sec)
注释:select * from table limit 1 offset 2;
//从第1条(不包括)数据开始取出1条数据,limit后面跟的是1条数据,offset后面是从第2条开始读取,即读取第2条数据
(注:请以salaries表为主表进行查询,输出结果以p_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`));
Query OK, 0 rows affected, 2 warnings (0.02 sec)CREATE TABLE `dept_manager` (-> `dept_no` char(4) NOT NULL, -- '部门编号'-> `emp_no` int(11) NOT NULL, -- '员工编号'-> `to_date` date NOT NULL,-> PRIMARY KEY (`emp_no`,`dept_no`));
Query OK, 0 rows affected, 1 warning (0.01 sec)
插入数据
select * FROM salaries;
+--------+--------+------------+------------+
| emp_no | salary | from_date | to_date |
+--------+--------+------------+------------+
| 10001 | 72567 | 2000-09-11 | 9999-01-01 |
| 10002 | 72527 | 2001-08-02 | 9999-01-01 |
| 10003 | 49881 | 2001-07-30 | 9999-01-01 |
| 10004 | 94692 | 2001-09-09 | 9999-01-01 |
| 10005 | 93392 | 2001-03-01 | 9999-01-01 |
| 10006 | 87692 | 2001-02-09 | 9999-01-01 |
| 10007 | 94382 | 2002-01-11 | 9999-01-01 |
| 10008 | 87301 | 2001-06-29 | 9999-01-01 |
+--------+--------+------------+------------+
8 rows in set (0.00 sec)
SELECT * FROM dept_manager;
+---------+--------+------------+
| dept_no | emp_no | to_date |
+---------+--------+------------+
| d001 | 10001 | 9999-01-01 |
| d002 | 10002 | 9999-01-01 |
| d003 | 10003 | 9999-01-01 |
| d004 | 10004 | 9999-01-01 |
| d005 | 10005 | 9999-01-01 |
| d006 | 10006 | 9999-01-01 |
| d007 | 10007 | 9999-01-01 |
| d008 | 10008 | 9999-01-01 |
+---------+--------+------------+
8 rows in set (0.00 sec)
根据题干描述,需要两张表联合查询需要用到inner join,on (结合起来的条件s.emp_nop_no),salaries表为主表,限制条件为to_date='9999-01-01' ,使用emp_no字段进行排序,表名可以用as进行简写
SELECT s.*,d.dept_no from salaries as s
inner join dept_manager as d p_nop_no
_date='9999-01-01' _date='9999-01-01'
order p_no;
+--------+--------+------------+------------+---------+
| emp_no | salary | from_date | to_date | dept_no |
+--------+--------+------------+------------+---------+
| 10001 | 72567 | 2000-09-11 | 9999-01-01 | d001 |
| 10002 | 72527 | 2001-08-02 | 9999-01-01 | d002 |
| 10003 | 49881 | 2001-07-30 | 9999-01-01 | d003 |
| 10004 | 94692 | 2001-09-09 | 9999-01-01 | d004 |
| 10005 | 93392 | 2001-03-01 | 9999-01-01 | d005 |
| 10006 | 87692 | 2001-02-09 | 9999-01-01 | d006 |
| 10007 | 94382 | 2002-01-11 | 9999-01-01 | d007 |
| 10008 | 87301 | 2001-06-29 | 9999-01-01 | d008 |
+--------+--------+------------+------------+---------+
8 rows in set (0.00 sec)
或者:
SELECT salaries.*,dept_manager.dept_no from salaries
inner join dept_manager p_no=p_no
where _date='9999-01-01' _date='9999-01-01'
order p_no;
+--------+--------+------------+------------+---------+
| emp_no | salary | from_date | to_date | dept_no |
+--------+--------+------------+------------+---------+
| 10001 | 72567 | 2000-09-11 | 9999-01-01 | d001 |
| 10002 | 72527 | 2001-08-02 | 9999-01-01 | d002 |
| 10003 | 49881 | 2001-07-30 | 9999-01-01 | d003 |
| 10004 | 94692 | 2001-09-09 | 9999-01-01 | d004 |
| 10005 | 93392 | 2001-03-01 | 9999-01-01 | d005 |
| 10006 | 87692 | 2001-02-09 | 9999-01-01 | d006 |
| 10007 | 94382 | 2002-01-11 | 9999-01-01 | d007 |
| 10008 | 87301 | 2001-06-29 | 9999-01-01 | d008 |
+--------+--------+------------+------------+---------+
8 rows in set (0.00 sec)
SELECT e.last_name,e.first_p_no from employees as e inner join dept_manager as d p_nop_no;
+-----------+------------+--------+
| last_name | first_name | emp_no |
+-----------+------------+--------+
| Kate | Sami | 10001 |
| Kim | Simi | 10002 |
| Yang | Tomas | 10003 |
| Jim | Alice | 10004 |
| van | Weddy | 10005 |
| Water | Wed | 10006 |
| Lee | Gorge | 10007 |
| Ben | Rory | 10008 |
+-----------+------------+--------+
8 rows in set (0.00 sec)
select e.last_name,e.first_name,d.dept_no
from employees e left join dept_manager d
p_nop_no;
+-----------+------------+---------+
| last_name | first_name | dept_no |
+-----------+------------+---------+
| Kate | Sami | d001 |
| Kim | Simi | d002 |
| Yang | Tomas | d003 |
| Jim | Alice | d004 |
| van | Weddy | d005 |
| Water | Wed | d006 |
| Lee | Gorge | d007 |
| Ben | Rory | d008 |
+-----------+------------+---------+
8 rows in set (0.00 sec)
p_no,s.salary from salaries s
left join employees e p_nop_no
WHERE e.hire_date=s.from_date
ORDER p_no DESC;
+--------+--------+
| emp_no | salary |
+--------+--------+
| 10008 | 87301 |
| 10007 | 94382 |
| 10006 | 87692 |
| 10005 | 93392 |
| 10004 | 94692 |
| 10003 | 49881 |
| 10002 | 72527 |
| 10001 | 72567 |
+--------+--------+
8 rows in set (0.00 sec)
思路:薪水情况要查salaries表,以及employees表,使用left join关键词为两表关键词为emp_no,然后限制条件为from_date = hire_date雇佣日期等于开始日期(入职时间),然后使用逆序(emp_no)
p_no,count(*) t from salaries a
inner join salaries b p_nop_no
_date=b.from_date
where a.salary < b.salary
group p_no having t >= 2;
+--------+---+
| emp_no | t |
+--------+---+
| 10001 | 3 |
| 10002 | 2 |
| 10003 | 2 |
| 10005 | 2 |
+--------+---+
4 rows in set (0.00 sec)
思路:count(*) 为计算全部数据的行数地意思,比较关键的一个点就是联结条件a.to_date = b.from_date,这个条件限定了两个工资之比必须是相邻的,如果没有这个条件,那同一个emp_no下的任意两个salary都可以做对比,可以把这个条件去掉,对比两个查询结果,就明白了。
select salary from salaries
where to_date='9999-01-01'
group by salary order by salary DESC;
+--------+
| salary |
+--------+
| 99901 |
| 99011 |
| 98012 |
| 94692 |
| 94382 |
| 92901 |
| 87692 |
| 87301 |
| 58901 |
+--------+
9 rows in set (0.00 sec)
题目描述
获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'
SELECT d.dept_p_no,s.salary FROM dept_manager AS d
INNER JOIN salaries AS s p_nop_no
_date='9999-01-01' _date='9999-01-01'
ORDER p_no;
+---------+--------+--------+
| dept_no | emp_no | salary |
+---------+--------+--------+
| d001 | 10001 | 99901 |
| d002 | 10002 | 92901 |
| d003 | 10003 | 58901 |
| d004 | 10004 | 94692 |
| d004 | 10004 | 98012 |
| d005 | 10005 | 99011 |
| d006 | 10006 | 87692 |
| d007 | 10007 | 94382 |
| d008 | 10008 | 87301 |
+---------+--------+--------+
9 rows in set (0.00 sec)
解释:按照员工工号排序,使用内联inner join连接两张表
题目描述
获取所有非manager的员工emp_no
SELECT emp_no FROM employees
WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager);
+--------+
| emp_no |
+--------+
| 10009 |
| 10010 |
+--------+
2 rows in set (0.01 sec)
解释:查询employees里面的员工编号不再dept_manager里的 使用NOT IN 字段
本文发布于:2024-01-28 18:49:27,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064389699505.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |