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的代码,不是很有感觉,硬记语法吧