網(wǎng)絡(luò)空間租用價(jià)格seo整站優(yōu)化服務(wù)
1. ??蚐QL熱題206:獲取每個(gè)部門中當(dāng)前員工薪水最高的相關(guān)信息
1.1 題目:
描述
有一個(gè)員工表dept_emp簡況如下:
emp_no | dept_no | from_date | to_date |
10001 | d001 | 1986-06-26 | 9999-01-01 |
10002 | d001 | 1996-08-03 | 9999-01-01 |
10003 | d002 | 1996-08-03 | 9999-01-01 |
有一個(gè)薪水表salaries簡況如下:
emp_no | salary | from_date | to_date |
10001 | 88958 | 2002-06-22 | 9999-01-01 |
10002 | 72527 | 2001-08-02 | 9999-01-01 |
10003 | 92527 | 2001-08-02 | 9999-01-01 |
獲取每個(gè)部門中當(dāng)前員工薪水最高的相關(guān)信息,給出dept_no, emp_no以及其對應(yīng)的salary,按照部門編號dept_no升序排列,以上例子輸出如下:
dept_no | emp_no | maxSalary |
d001 | 10001 | 88958 |
d002 | 10003 | 92527 |
示例1
輸入:drop table if exists `dept_emp` ;
drop table if exists `salaries` ;
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 `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`));
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d002','1996-08-03','9999-01-01');INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,92527,'2001-08-02','9999-01-01');
復(fù)制輸出:d001|10001|88958
d002|10003|92527
1.2 思路:
一個(gè)相關(guān)子查詢即可搞定。
1.3 題解:
with tep1 as (-- 兩表連接select t1.emp_no, dept_no, salaryfrom dept_emp t1join salaries t2on t1.emp_no = t2.emp_no
)select dept_no, emp_no, salary maxSalary
from tep1 t1
where salary = (-- 相關(guān)子查詢,查找外部記錄所在部門的最高薪水select max(salary)from tep1 t2where t1.dept_no = t2.dept_no
)
order by dept_no
2. ??蚐QL熱題205:獲取所有員工當(dāng)前的manager
2.1 題目:
描述
有一個(gè)員工表dept_emp簡況如下:
emp_no | dept_no? | from_date? | to_date |
10001 | d001 | 1986-06-26 | 9999-01-01 |
10002 | d001 | 1996-08-03 | 9999-01-01 |
10003 | d002 | 1995-12-03 | 9999-01-01 |
第一行表示為員工編號為10001的部門是d001部門。
有一個(gè)部門經(jīng)理表dept_manager簡況如下:
dept_no | emp_no | from_date? | to_date |
d001 | 10002 | 1996-08-03 | 9999-01-01 |
d002 | 10003 | 1990-08-05 | 9999-01-01 |
第一行表示為d001部門的經(jīng)理是編號為10002的員工。
獲取所有的員工和員工對應(yīng)的經(jīng)理,如果員工本身是經(jīng)理的話則不顯示,以上例子如下:
emp_no | manager |
10001 | 10002 |
示例1
輸入:drop table if exists `dept_emp` ;
drop table if exists `dept_manager` ;
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 `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`));
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d002','1995-12-03','9999-01-01');
INSERT INTO dept_manager VALUES('d001',10002,'1996-08-03','9999-01-01');
INSERT INTO dept_manager VALUES('d002',10003,'1990-08-05','9999-01-01');
復(fù)制輸出:10001|10002
2.2 思路:
秒。
2.3 題解:
select t1.emp_no emp_no, t2.emp_no manager
from dept_emp t1
join dept_manager t2
on t1.dept_no = t2.dept_no
and t1.emp_no <> t2.emp_no
3. 牛客SQL熱題199:查找所有員工的last_name和first_name以及對應(yīng)部門編號的dept_no
3.1 題目:
描述
有一個(gè)員工表,employees簡況如下:
emp_no? | birth_date? | first_name? | last_name? | gender | hire_date? |
10001 | 1953-09-02 | Georgi? ? ? | Facello? ? | ?M | 1986-06-26 |
10002 | 1964-06-02 | Bezalel? ?? | Simmel? ?? | ?F | 1985-11-21 |
10003?? | 1959-12-03 | Parto? ? ?? | Bamford? ? | ?M | 1986-08-28 |
10004?? | 1954-05-01 | Christian?? | Koblick? ? | ?M | 1986-12-01 |
有一個(gè)部門表,dept_emp簡況如下:
emp_no | dept_no? | from_date? | to_date |
10001 | d001 | 1986-06-26 | 9999-01-01 |
10002 | d002 | 1989-08-03 | 9999-01-01 |
請你查找所有已經(jīng)分配部門的員工的last_name和first_name以及dept_no,也包括暫時(shí)沒有分配具體部門的員工,以上例子如下:
last_name? | first_name? | dept_no |
Facello? ? | Georgi? ? ? | d001 |
Simmel? ?? | Bezalel? ?? | d002 |
Bamford | Parto | NULL |
Koblick | Chirstian | NULL |
示例1
輸入:drop table if exists `dept_emp` ;
drop table if exists `employees` ;
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`));
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d002','1996-08-03','9999-01-01');
INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
INSERT INTO employees VALUES(10003,'1959-12-03','Parto','Bamford','M','1986-08-28');
INSERT INTO employees VALUES(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01');
復(fù)制輸出:Facello|Georgi|d001
Simmel|Bezalel|d002
Bamford|Parto|None
Koblick|Chirstian|None
3.2 思路:
秒。
3.3 題解:
select last_name , first_name , dept_no
from employees t1
left join dept_emp t2
on t1.emp_no = t2.emp_no
4. 牛客SQL熱題198:查找所有已經(jīng)分配部門的員工的last_name和first_name以及dept_no
4.1 題目:
描述
有一個(gè)員工表,employees簡況如下:
emp_no? | birth_date? | first_name? | last_name? | gender | hire_date? |
10001 | 1953-09-02 | Georgi? ? ? | Facello? ? | ?M | 1986-06-26 |
10002 | 1964-06-02 | Bezalel? ?? | Simmel? ?? | ?F | 1985-11-21 |
10003?? | 1959-12-03 | Parto? ? ?? | Bamford? ? | ?M | 1986-08-28 |
10004?? | 1954-05-01 | Christian?? | Koblick? ? | ?M | 1986-12-01 |
有一個(gè)部門表,dept_emp簡況如下:
emp_no | dept_no? | from_date? | to_date |
10001 | d001 | 1986-06-26 | 9999-01-01 |
10002 | d002 | 1989-08-03 | 9999-01-01 |
請你查找所有已經(jīng)分配部門的員工的last_name和first_name以及dept_no,未分配的部門的員工不顯示,以上例子如下:
last_name? | first_name? | dept_no |
Facello? ? | Georgi? ? ? | d001 |
Simmel? ?? | Bezalel? ?? | d002 |
示例1
輸入:drop table if exists `dept_emp` ;
drop table if exists `employees` ;
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`));
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d002','1996-08-03','9999-01-01');
INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
INSERT INTO employees VALUES(10003,'1959-12-03','Parto','Bamford','M','1986-08-28');
INSERT INTO employees VALUES(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01');
復(fù)制輸出:Facello|Georgi|d001
Simmel|Bezalel|d002
4.2 思路:
秒。
4.3 題解:
select last_name , first_name , dept_no
from employees t1
join dept_emp t2
on t1.emp_no = t2.emp_no
5. ??蚐QL熱題197:查找當(dāng)前薪水詳情以及部門編號dept_no
5.1 題目:
描述
有一個(gè)全部員工的薪水表salaries簡況如下:
emp_no | salary | from_date | to_date |
10001 | 88958 | 2002-06-22 | 9999-01-01 |
10002 | 72527 | 2001-08-02 | 9999-01-01 |
10003 | 43311 | 2001-12-01 | 9999-01-01 |
有一個(gè)各個(gè)部門的領(lǐng)導(dǎo)表dept_manager簡況如下:
dept_no | emp_no | to_date |
d001 | 10001 | 9999-01-01 |
d002 | 10003 | 9999-01-01 |
請你查找各個(gè)部門當(dāng)前領(lǐng)導(dǎo)的薪水詳情以及其對應(yīng)部門編號dept_no,輸出結(jié)果以salaries.emp_no升序排序,并且請注意輸出結(jié)果里面dept_no列是最后一列,以上例子輸出如下:
emp_no | salary | from_date | to_date | dept_no |
10001 | 88958 | 2002-06-22 | 9999-01-01 | d001 |
10003 | 43311 | 2001-12-01 | 9999-01-01 | d002 |
示例1
輸入:drop table if exists `salaries` ;
drop table if exists `dept_manager` ;
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`));
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`));
INSERT INTO dept_manager VALUES('d001',10002,'9999-01-01');
INSERT INTO dept_manager VALUES('d002',10006,'9999-01-01');
INSERT INTO dept_manager VALUES('d003',10005,'9999-01-01');
INSERT INTO dept_manager VALUES('d004',10004,'9999-01-01');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
INSERT INTO salaries VALUES(10004,74057,'2001-11-27','9999-01-01');
INSERT INTO salaries VALUES(10005,94692,'2001-09-09','9999-01-01');
INSERT INTO salaries VALUES(10006,43311,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10007,88070,'2002-02-07','9999-01-01');
復(fù)制輸出:10002|72527|2001-08-02|9999-01-01|d001
10004|74057|2001-11-27|9999-01-01|d004
10005|94692|2001-09-09|9999-01-01|d003
10006|43311|2001-08-02|9999-01-01|d002
5.2 思路:
秒。
5.3 題解:
select t1.emp_no, salary, from_date, t1.to_date, dept_no
from salaries t1
join dept_manager t2
on t1.emp_no = t2.emp_no
order by t1.emp_no
6. 力扣hard題615:平均薪資:部門與公司比較
6.1 題目:
表:Salary
+-------------+------+ | 列名 | 類型 | +-------------+------+ | id | int | | employee_id | int | | amount | int | | pay_date | date | +-------------+------+ 在 SQL 中,id 是該表的主鍵列。 該表的每一行表示一個(gè)員工一個(gè)月的薪資。 employee_id 是來自 Employee 表的外鍵(reference 列)。
表:?Employee
+---------------+------+ | 列名 | 類型 | +---------------+------+ | employee_id | int | | department_id | int | +---------------+------+ 在 SQL 中,employee_id 是該表的主鍵列。 該表的每一行表示一個(gè)員工所屬的部門。
找出各個(gè)部門員工的平均薪資與公司平均薪資之間的比較結(jié)果(更高 / 更低 / 相同)。
以?任意順序?返回結(jié)果表。
結(jié)果格式如下所示。
示例 1:
輸入: Salary 表: +----+-------------+--------+------------+ | id | employee_id | amount | pay_date | +----+-------------+--------+------------+ | 1 | 1 | 9000 | 2017/03/31 | | 2 | 2 | 6000 | 2017/03/31 | | 3 | 3 | 10000 | 2017/03/31 | | 4 | 1 | 7000 | 2017/02/28 | | 5 | 2 | 6000 | 2017/02/28 | | 6 | 3 | 8000 | 2017/02/28 | +----+-------------+--------+------------+ Employee 表: +-------------+---------------+ | employee_id | department_id | +-------------+---------------+ | 1 | 1 | | 2 | 2 | | 3 | 2 | +-------------+---------------+ 輸出: +-----------+---------------+------------+ | pay_month | department_id | comparison | +-----------+---------------+------------+ | 2017-02 | 1 | same | | 2017-03 | 1 | higher | | 2017-02 | 2 | same | | 2017-03 | 2 | lower | +-----------+---------------+------------+ 解釋: 在三月,公司的平均工資是 (9000+6000+10000)/3 = 8333.33... 部門 '1' 的平均薪資是 9000,因?yàn)樵摬块T只有一個(gè)員工,其員工號為 '1'。因?yàn)?9000 > 8333.33,所以比較結(jié)果為 'higher' 部門 '2' 的平均薪資是(6000 + 10000)/ 2 = 8000,該平均薪資是員工號 '2' 和 '3' 的薪資的平均值。因?yàn)?8000 < 8333.33,比較結(jié)果為 'lower'。根據(jù)同樣的公式,對于二月份的平均薪資比較,結(jié)果為 'same',因?yàn)椴块T '1' 和 '2' 都與公司的平均薪資相同,即為 7000。
6.2 思路:
兩步走:
-- 先求出每個(gè)月公司的平均薪資
-- 然后以部門和月份分組,比較分組內(nèi)的平均薪資與該月份公司的平均薪資的大小
6.3 題解:
-- 先求出每個(gè)月公司的平均薪資
with tep1 as (select substring(pay_date, 1, 7) pay_month , round(avg(amount), 4) avgsfrom Salarygroup by substring(pay_date, 1, 7)
), tep2 as (-- 多表連接select t2.employee_id , department_id, amount , substring(pay_date, 1, 7) pay_month from Salary t1 join Employee t2 on t1.employee_id = t2.employee_id
)-- 然后以部門和月份分組,比較分組內(nèi)的平均薪資與該月份公司的平均薪資的大小
-- 我沒有用round過不了最后一個(gè)案例,但使用round函數(shù)就可以過了。
-- 我也不知道為什么。
select pay_month, department_id,
case when round(avg(amount), 4) > (select avgs from tep1 t2 where t1.pay_month = t2.pay_month)
then 'higher'
when round(avg(amount), 4) < (select avgs from tep1 t2 where t1.pay_month = t2.pay_month)
then 'lower'
else 'same'
end comparison
from tep2 t1
group by pay_month, department_id