1. 程式人生 > >牛客網數據庫SQL實戰(21-25)

牛客網數據庫SQL實戰(21-25)

key reat 題意 sum div bubuko col 薪水 not in

21、查找所有員工自入職以來的薪水漲幅情況,給出員工編號emp_no以及其對應的薪水漲幅growth,並按照growth進行升序
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`));

技術分享圖片

select a.emp_no, (b.salary - c.salary) as growth
from
    employees as a
    inner join salaries as b
    on a.emp_no = b.emp_no and b.to_date = 9999-01-01
inner join salaries as c on a.emp_no = c.emp_no and a.hire_date = c.from_date order by growth asc;

討論:https://www.nowcoder.com/questionTerminal/fc7344ece7294b9e98401826b94c6ea5

22、統計各個部門對應員工漲幅的次數總和,給出部門編碼dept_no、部門名稱dept_name以及次數sum
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,

PRIMARY KEY (`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 `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`));

技術分享圖片

select departments.dept_no,departments.dept_name,count(*) sum
from departments,dept_emp,salaries
where departments.dept_no = dept_emp.dept_no
and dept_emp.emp_no = salaries.emp_no
group by departments.dept_no;

討論:https://www.nowcoder.com/questionTerminal/6a62b6c0a7324350a6d9959fa7c21db3

23、對所有員工的當前(to_date=‘9999-01-01‘)薪水按照salary進行按照1-N的排名,相同salary並列且按照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`));

技術分享圖片

select s1.emp_no,s1.salary,count(distinct s2.salary)
from salaries s1,salaries s2
where s1.to_date=9999-01-01 and s2.to_date=9999-01-01 and s1.salary<= s2.salary/*給定s1.salary求有多少個s2.salary大於它*/
group by s1.emp_no
order by s1.salary desc,s1.emp_no asc;

討論:https://www.nowcoder.com/questionTerminal/b9068bfe5df74276bd015b9729eec4bf

24、獲取所有非manager員工當前的薪水情況,給出dept_no、emp_no以及salary ,當前表示to_date=‘9999-01-01‘
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`));
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`));

技術分享圖片

SELECT de.dept_no, s.emp_no, s.salary 
FROM dept_emp AS de 
INNER JOIN salaries AS s 
ON s.emp_no = de.emp_no 
AND s.to_date = 9999-01-01
WHERE de.emp_no NOT IN 
(SELECT emp_no FROM dept_manager WHERE to_date = 9999-01-01);

1、先用INNER JOIN連接employees和salaries,找出當前所有員工的工資情況

2、再用INNER JOIN連接dept_emp表,找到所有員工所在的部門 3、最後用限制條件de.emp_no NOT IN (SELECT emp_no FROM dept_manager WHERE to_date = ‘9999-01-01‘)選出當前所有非manager員工,再依次輸出dept_no、emp_no、salary 討論:https://www.nowcoder.com/questionTerminal/8fe212a6c71b42de9c15c56ce354bebe 25、獲取員工其當前的薪水比其manager當前薪水還高的相關信息,當前表示to_date=‘9999-01-01‘,
結果第一列給出員工的emp_no,
第二列給出其manager的manager_no,
第三列給出該員工當前的薪水emp_salary,
第四列給該員工對應的manager當前的薪水manager_salary
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`));
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`)); 技術分享圖片
SELECT sem.emp_no AS emp_no, sdm.emp_no AS manager_no, sem.salary AS emp_salary, sdm.salary AS manager_salary
FROM 
(SELECT s.salary, s.emp_no, de.dept_no 
 FROM salaries s 
 INNER JOIN dept_emp de
 ON s.emp_no = de.emp_no 
 AND s.to_date = 9999-01-01 ) AS sem, 
(SELECT s.salary, s.emp_no, dm.dept_no 
 FROM salaries s 
 INNER JOIN dept_manager dm
 ON s.emp_no = dm.emp_no 
 AND s.to_date = 9999-01-01 ) AS sdm
WHERE sem.dept_no = sdm.dept_no 
AND sem.salary > sdm.salary;

1、先用INNER JOIN連接salaries和demp_emp,建立當前所有員工的工資記錄sem

2、再用INNER JOIN連接salaries和demp_manager,建立當前所有員工的工資記錄sdm 3、最後用限制條件sem.dept_no = sdm.dept_no AND sem.salary > sdm.salary找出同一部門中工資比經理高的員工,並根據題意依次輸出emp_no、manager_no、emp_salary、manager_salary 討論:https://www.nowcoder.com/questionTerminal/f858d74a030e48da8e0f69e21be63bef

牛客網數據庫SQL實戰(21-25)