CS-Notes/notes/笔记/SQL 实战.md.txt

225 lines
5.9 KiB
Plaintext
Raw Normal View History

2018-02-22 14:47:22 +08:00
[TOC]
# 查找最晚入职员工的所有信息
```sql
select *
from employees
order by hire_date desc
limit 1;
```
# 查找入职员工时间排名倒数第三的员工所有信息
```sql
select *
from employees
order by hire_date desc
limit 2, 1;
```
# 查找各个部门当前领导当前薪水详情以及其对应部门编号dept_no
```sql
select s.emp_no, s.salary, s.from_date, s.to_date, d.dept_no
from salaries as s inner join dept_manager as d
on d.emp_no = s.emp_no
and d.to_date = '9999-01-01'
and s.to_date = '9999-01-01';
```
# 查找所有已经分配部门的员工的last_name和first_name
```sql
select e.last_name, e.first_name, d.dept_no
from employees as e inner join dept_emp as d
on e.emp_no = d.emp_no;
```
# 查找所有员工的last_name和first_name以及对应部门编号dept_no
也包括展示没有分配具体部门的员工
```sql
select e.last_name, e.first_name, d.dept_no
from employees as e left outer join dept_emp as d
on e.emp_no = d.emp_no;
```
# 查找所有员工入职时候的薪水情况
```sql
select e.emp_no, s.salary
from employees as e inner join salaries as s
on e.emp_no = s.emp_no and e.hire_date = s.from_date
order by e.emp_no desc;
```
# 查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
```sql
select emp_no, count(*) as t
from salaries
group by emp_no
having t > 15;
```
# 找出所有员工当前具体的薪水salary情况
```sql
select distinct salary
from salaries
where to_date = '9999-01-01'
order by salary desc;
```
# 获取所有部门当前manager的当前薪水情况
```sql
select d.dept_no, d.emp_no, s.salary
from salaries as s inner join dept_manager as d
on d.emp_no = s.emp_no
and d.to_date = '9999-01-01'
and s.to_date = '9999-01-01';
```
# 获取所有非manager的员工emp_no
```sql
select emp_no
from employees
where emp_no not in (
select emp_no
    from dept_manager
)
```
# 获取所有员工当前的manager
```sql
select d1.emp_no, d2.emp_no as manager_no
from dept_emp as d1 inner join dept_manager as d2
on d1.dept_no = d2.dept_no
and d1.to_date = '9999-01-01'
and d2.to_date = '9999-01-01'
and d1.emp_no <> d2.emp_no
```
# 获取所有部门中当前员工薪水最高的相关信息
```sql
select d.dept_no, d.emp_no, MAX(s.salary) as salary
from dept_emp 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'
group by d.dept_no
```
# 从titles表获取按照title进行分组
```sql
select title, COUNT(*) as t
from titles
group by title
having t >= 2
```
# 从titles表获取按照title进行分组注意对于重复的emp_no进行忽略。
```sql
select title, COUNT(distinct emp_no) as t
from titles
group by title
having t >= 2
```
# 查找employees表所有emp_no为奇数
```sql
select *
from employees
where emp_no % 2 = 1 and last_name != 'Mary'
order by hire_date desc
```
# 统计出当前各个title类型对应的员工当前薪水对应的平均工资
```sql
select t.title, AVG(s.salary) as avg
from titles as t inner join salaries as s
on t.emp_no = s.emp_no
and t.to_date = '9999-01-01'
and s.to_date = '9999-01-01'
group by t.title
```
# 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
```sql
select emp_no, salary
from salaries
order by salary desc
limit 1, 1
```
# 查找当前薪水排名第二多的员工编号emp_no
```sql
select e.emp_no, MAX(s.salary) as salary, e.last_name, e.first_name
from employees as e, salaries as s
where e.emp_no = s.emp_no
and s.to_date = '9999-01-01'
and s.salary not in (
    select MAX(salary)
    from salaries
    where s.to_date = '9999-01-01'
)
```
#  查找所有员工的last_name和first_name以及对应的dept_name
查找所有员工的last_name和first_name以及对应的dept_name也包括暂时没有分配部门的员工
本题思路为运用两次LEFT JOIN连接嵌套
1、第一次LEFT JOIN连接employees表与dept_emp表得到所有员工的last_name和first_name以及对应的dept_no也包括暂时没有分配部门的员工
2、第二次LEFT JOIN连接上表与departments表即连接dept_no与dept_name得到所有员工的last_name和first_name以及对应的dept_name也包括暂时没有分配部门的员工
```sql
SELECT em.last_name, em.first_name, dp.dept_name
FROM (employees AS em LEFT JOIN dept_emp AS de ON em.emp_no = de.emp_no)
LEFT JOIN departments AS dp ON de.dept_no = dp.dept_no
```
# 查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth
```sql
SELECT (MAX(salary)-MIN(salary)) AS growth
FROM salaries WHERE emp_no = '10001'
```
# 查找所有员工自入职以来的薪水涨幅情况
```sql
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
```
# 统计各个部门对应员工涨幅的次数总和
本题关键是要将 每个部门分组,并分别统计工资记录总数,思路如下:
1、用INNER JOIN连接dept_emp表和salaries表并以dept_emp.no分组统计每个部门所有员工工资的记录总数
2、再将上表用INNER JOIN连接departments表限制条件为两表的dept_no相等找到dept_no与dept_name的对应关系最后依次输出dept_no、dept_name、sum
```sql
SELECT de.dept_no, dp.dept_name, COUNT(s.salary) AS sum
FROM (dept_emp AS de INNER JOIN salaries AS s ON de.emp_no = s.emp_no)
INNER JOIN departments AS dp ON de.dept_no = dp.dept_no
GROUP BY de.dept_no
```