sql刷题day1

1 查找入职员工时间排名倒数第三的员工所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天

select * from `employees`
order by hire_date DESC
limit 2,1

排序默认是升序(asc)降序 (desc)

limit

  • 接受一个参数n,选择前n项
  • 接收两个参数n,s,从n+1项开始,取n+1,n+2取s个

2 查找所有已经分配部门的员工的last_name和first_name以及dept_no(请注意输出描述里各个列的前后顺序)

select e.last_name,e.first_name,d.dept_no  FROM employees as e,dept_emp as d
where e.emp_no=d.emp_no

全自然连接 where子句

3 查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括暂时没有分配具体部门的员工

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)

使用了左外连接,展示所有左表的信息(右外连接展示所有右表)
使用外连接时不能使用where子句,使用on来限定查询条件

4 查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t

select emp_no,count(*) as t from salaries
GROUP BY emp_no
HAVING t>15

在使用了group by分组之后在进行条件筛选需要使用having子句,而不是where

5 找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示

select salary
from salaries
where to_date='9999-01-01'
group by salary
order by salary desc

时间date需要加‘’
去重可以使用distinct,但是group by效率更高
可以在使用group by子句之前使用where先进行一次笛卡尔积筛选,再进行分组

6 获取所有非manager的员工emp_no

思路1

使用集合运算

SELECT employees.emp_no
from employees
EXCEPT
select dept_manager.emp_no
from dept_manager

使用集合运算(mysql8.0好像不支持,所以一直错)except union(并) intersect(交)

思路二

使用左外连接,去除部门号为空的员工

SELECT e.emp_no
from employees as e LEFT JOIN dept_manager as d
on e.emp_no=d.emp_no
WHERE dept_no is null

判断是否为空 不可以用=null 要用is null

思路三

使用 not in

select emp_no
from employees
where emp_no NOT in(
    select emp_no
    from dept_manager
)

copy的代码,不是很有感觉,硬记语法吧

原文地址:https://www.cnblogs.com/wjune-0405/p/14095108.html