1. 程式人生 > >牛客網資料庫SQL實戰(持續更新中)

牛客網資料庫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

date NOT NULL,
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;