牛客網資料庫SQL實戰(持續更新中)
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
));
SQL語句:
select * from employees order by hire_date desc limit 1;
2.查詢入職員工時間排名倒數第三的員工所有資訊
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
));
SQL語句:
select * from (select * from employees order by hire_date desc limit 3) order by hire_date asc limit 1;
3.查詢當前薪水詳情以及部門編號
查詢各個部門當前(to_date=’9999-01-01’)領導當前薪水詳情以及其對應部門編號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
to_date
date NOT NULL, PRIMARY KEY (
emp_no
,from_date
));
SQL語句:
select s.emp_no,s.salary,s.from_date,s.to_date,d.dept_no from salaries s join dept_manager d on s.emp_no=d.emp_no and s.to_date=’9999-01-01’ and d.to_date=’9999-01-01’;
4.查詢所有已經分配部門的員工的last_name和first_name
查詢所有已經分配部門的員工的last_name和first_name
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
));
select e.last_name,e.first_name,d.dept_no from employees e,dept_emp d where e.emp_no = d.emp_no;
5.查詢所有員工的last_name和first_name以及對應部門編號
查詢所有員工的last_name和first_name以及對應部門編號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 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
));
SQL語句:
select e.last_name,e.first_name,d.dept_no from employees e left join dept_emp d on e.emp_no = d.emp_no;
6.查詢所有員工入職時候的薪水情況
查詢所有員工入職時候的薪水情況,給出emp_no以及salary, 並按照emp_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
));
SQL語句:
select e.emp_no,s.salary from employees e,salaries s where e.emp_no = s.emp_no and e.hire_date = s.from_date order by e.emp_no desc;
7.查詢薪水漲幅超過15次的員工號emp_no以及其對應的漲幅次數t
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
));
SQL語句:
select * from (select emp_no,count(emp_no) as t from salaries group by emp_no) where t > 15;
8.找出所有員工當前薪水salary情況
找出所有員工當前(to_date=’9999-01-01’)具體的薪水salary情況,對於相同的薪水只顯示一次,並按照逆序顯示
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
));
SQL語句:
select distinct salary from salaries where to_date=’9999-01-01’ order by salary desc;
9.獲取所有部門當前manager的當前薪水情況
獲取所有部門當前manager的當前薪水情況,給出dept_no, emp_no以及salary,當前表示to_date=’9999-01-01’
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
));
SQL語句:
select d.dept_no,d.emp_no,s.salary from dept_manager d,salaries s where d.to_date=’9999-01-01’ and s.to_date=’9999-01-01’ and d.emp_no = s.emp_no;
10.獲取所有非manager的員工emp_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
));
SQL語句:
select e.emp_no from employees e LEFT JOIN dept_manager d on e.emp_no == d.emp_no where d.emp_no is NULL;
11.獲取所有員工當前的manager
獲取所有員工當前的manager,如果當前的manager是自己的話結果不顯示,當前表示to_date=’9999-01-01’。
結果第一列給出當前員工的emp_no,第二列給出其manager對應的manager_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 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
));
SQL語句:
select e.emp_no,m.emp_no from dept_emp e left join dept_manager m on e.dept_no=m.dept_no where e.emp_no!=m.emp_no and m.to_date=’9999-01-01’;
12.獲取所有部門中當前員工薪水最高的相關資訊
獲取所有部門中當前員工薪水最高的相關資訊,給出dept_no, emp_no以及其對應的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 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
));
SQL語句:
select e.dept_no,e.emp_no,max(s.salary) from dept_emp e,salaries s where e.emp_no=s.emp_no and e.to_date=’9999-01-01’ group by e.dept_no;
13.從titles表獲取按照title進行分組
從titles表獲取按照title進行分組,每組個數大於等於2,給出title以及對應的數目t。
CREATE TABLE IF NOT EXISTS “titles” (
emp_no
int(11) NOT NULL,
title
varchar(50) NOT NULL,
from_date
date NOT NULL,
to_date
date DEFAULT NULL);
SQL語句:
select * from (select title,count(title) as t from titles group by title) where t>=2;
14.從titles表獲取按照title進行分組,注意對於重複的emp_no進行忽略
從titles表獲取按照title進行分組,每組個數大於等於2,給出title以及對應的數目t。
注意對於重複的emp_no進行忽略。
CREATE TABLE IF NOT EXISTS “titles” (
emp_no
int(11) NOT NULL,
title
varchar(50) NOT NULL,
from_date
date NOT NULL,
to_date
date DEFAULT NULL);
SQL語句:
select title,count(distinct emp_no) as t from titles group by title having t>=2;
15.查詢employees表
查詢employees表所有emp_no為奇數,且last_name不為Mary的員工資訊,並按照hire_date逆序排列
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
));
SQL語句:
select emp_no,birth_date,first_name,last_name,gender,hire_date from employees where last_name!=’Mary’ and emp_no%2=1 order by hire_date desc;
16.統計出當前各個title型別對應的員工當前薪水對應的平均工資
統計出當前各個title型別對應的員工當前薪水對應的平均工資。結果給出title以及平均工資avg。
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 IF NOT EXISTS “titles” (
emp_no
int(11) NOT NULL,
title
varchar(50) NOT NULL,
from_date
date NOT NULL,
to_date
date DEFAULT NULL);
SQL語句:
select t.title,avg(s.salary) from salaries s, titles t where s.emp_no=t.emp_no and s.to_date=’9999-01-01’ and t.to_date=’9999-01-01’ group by t.title;
17.獲取當前薪水第二多的員工的emp_no以及其對應的薪水salary
獲取當前(to_date=’9999-01-01’)薪水第二多的員工的emp_no以及其對應的薪水salary
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
));
SQL語句:
select * from (select emp_no,salary from salaries where to_date=’9999-01-01’ order by salary desc limit 2) order by salary asc limit 1;
18.查詢當前薪水排名第二多的員工,不準使用order by
查詢當前薪水(to_date=’9999-01-01’)排名第二多的員工編號emp_no、薪水salary、last_name以及first_name,不準使用order by
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
));
SQL語句:
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.salary not in (select max(s.salary) from employees e,salaries s where e.emp_no=s.emp_no);
19.查詢所有員工的last_name和first_name以及對應的dept_name
查詢所有員工的last_name和first_name以及對應的dept_name,也包括暫時沒有分配部門的員工
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 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
));
SQL語句:
select l.last_name,l.first_name,d.dept_name from (select e.last_name,e.first_name,de.dept_no from employees e left join dept_emp de on e.emp_no=de.emp_no) as l left join departments d on l.dept_no=d.dept_no;