1. 程式人生 > >牛客網上的sql練習(to be continue)

牛客網上的sql練習(to be continue)

  1. 查詢所有員工的last_name和first_name以及對應部門編號dept_no

查詢所有員工的last_name和first_name以及對應部門編號dept_no,也包括展示沒有分配具體部門的員工

select e.last_name,e.first_name,d.dept_no
from employees e
left join dept_emp d
on d.emp_no=e.emp_no
  1. 查詢所有員工入職時候的薪水情況

查詢所有員工入職時候的薪水情況,給出emp_no以及salary, 並按照emp_no進行逆序

select s.emp_no,s.salary
from salaries s
inner join employees e
on e.emp_no=s.emp_no and e.hire_date=s.from_date
order by s.emp_no desc
  1. 查詢薪水漲幅超過15次的員工號emp_no以及其對應的漲幅次數t
select emp_no,count(emp_no) as t
from salaries
group by emp_no
having t>15

這裡用了分組函式,所以emp_no要分下組group by

如果列裡面有一個分組函式,其它的都必須是分組函式,否則就出錯。這是語法規定的
當篩選語句中存在 min(),max(),sum(),count(),avg() 等分組函式時,是不能使用 where 來篩選的,為了解決這個問題,
只需要吧 where 替換為 having 即可

  1. 找出所有員工當前薪水salary情況

找出所有員工當前(to_date=‘9999-01-01’)具體的薪水salary情況,對於相同的薪水只顯示一次,並按照逆序顯示

select distinct salary from salaries
where to_date='9999-01-01'
order by salary desc
  1. 獲取所有部門當前manager的當前薪水情況,給出dept_no, emp_no以及salary,當前表示to_date=‘9999-01-01’
SELECT d.dept_no, d.emp_no,
s.salary FROM dept_manager AS d INNER JOIN salaries AS s ON d.emp_no = s.emp_no AND d.to_date = '9999-01-01' AND s.to_date = '9999-01-01' ORDER BY d.emp_no
  1. 獲取所有非manager的員工emp_no
select emp_no from employees
where emp_no not in 
(select distinct emp_no from dept_manager)
  1. 獲取所有部門中當前員工薪水最高的相關資訊,給出dept_no, emp_no以及其對應的salary
SELECT d.dept_no, s.emp_no, MAX(s.salary) AS salary
FROM salaries AS s INNER JOIN dept_emp As d
ON d.emp_no = s.emp_no 
WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
GROUP BY d.dept_no

同樣,max也是分組函式,需要對其他的做下排序

  1. 查詢employees表所有emp_no為奇數,且last_name不為Mary的員工資訊,並按照
select* from employees
where last_name!='Mary' and emp_no%2=1
order by hire_date desc
  1. 獲取當前(to_date=‘9999-01-01’)薪水第二多的員工的emp_no以及其對應的薪水salary
select emp_no,salary 
from salaries
where to_date = '9999-01-01' 
order by salary desc limit 1,1

用來從某個值開始,取出之後的N條資料的語法(下標最低為0)
oracle的sql語句中沒有limit,limit是mysql中特有的,在oracle中可用rownum來表示,用於查詢結果中的前N行資料。

  1. 查詢當前薪水(to_date=‘9999-01-01’)排名第二多的員工編號emp_no、薪水salary、last_name以及first_name,不準使用order by
select e.emp_no,max(s.salary),e.last_name,e.first_name
from employees e,salaries s
where e.emp_no=s.emp_no and s.to_date='9999-01-01' and s.salary<
(select max(salary) from salaries where to_date='9999-01-01')