2021-07-18 刷题 17、18、19题

SQL17 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary



SQL 17 题目


SQL 17 题目

解答:

法一:row_number开窗函数(当薪水第二的人有多个时只会输出一个)

SELECT emp_no,salary FROM (

SELECT emp_no, salary,

row_number() over(ORDER BY salary DESC)  as rk_s 

from salaries

WHERE to_date = "9999-01-01") as a

WHERE a.rk_s = 2

法二:rank开窗函数(当薪水第二的人有多个时会全部输出)

SELECT

emp_no,

salary

FROM

( SELECT emp_no, salary, rank ( ) over ( ORDER BY salary DESC ) AS rk_s FROM salaries WHERE to_date = "9999-01-01" ) AS a

WHERE

a.rk_s = 2


法三:max()+子查询

select emp_no,max(salary)

from salaries

where salary <>(select max(salary)

from salaries

where to_date='9999-01-01')

方法三存在疑惑,没有完全理解




SQL18 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary



SQL 18 题目


SQL 18 题目


SQL 18 题目

解答:

法一:

selects.emp_no, s.salary, e.last_name, e.first_name

fromsalaries s joinemployees e

ons.emp_no = e.emp_no

wheres.salary = -- 第三步: 将第二高工资作为查询条件

    (

    selectmax(salary) -- 第二步: 查出除了原表最高工资以外的最高工资(第二高工资)

    fromsalaries

    wheresalary <   

        (

        selectmax(salary) -- 第一步: 查出原表最高工资

        fromsalaries

        whereto_date = '9999-01-01'

        )

    andto_date = '9999-01-01'

    )

ands.to_date = '9999-01-01'

法二:

SELECT

a.emp_no,

a.salary,

a.last_name,

a.first_name

FROM

(

SELECT

s.emp_no,

s.salary,

e.last_name,

e.first_name,

rank ( ) over ( ORDER BY s.salary DESC ) AS rk_s

FROM

salaries AS s

INNER JOIN employees AS e ON s.emp_no = e.emp_no

WHERE

to_date = "9999-01-01"

) AS a

WHERE

a.rk_s =2

注意审题:不许用ORDER BY完成,所以第二种方法是错误的



SQL19 查找所有员工的last_name和first_name以及对应的dept_name



SQL 19 题目


SQL 19 题目


SQL 19 题目


SQL 19 题目

解答:

思路:

列出employees表里所有员工last_name, first_name,

根据employees中emp_no对应dept_emp中的dept_no,没有分配的员工找不到对应-->采用LEFT JOIN

再根据dept_no对应departments表中的dept_name,没有分配的员工找不到对应-->采用LEFT JOIN

SELECTlast_name, first_name, dept_name

FROMemployees AS e 

LEFTJOIN(SELECTemp_no, dept_name

                               FROMdept_emp ASde LEFTJOINdepartments ASd

                               ONde.dept_no = d.dept_no)k

ONe.emp_no = k.emp_no;

你可能感兴趣的:(2021-07-18 刷题 17、18、19题)