- 请你查找employees里最晚入职员工的所有信息,以上例子输出如下:
select *
from employees
where hire_date = (select max(hire_date) from employees);
- 因为有可能有多个在最晚那天入职的,所以可以选出入职日期等于最晚的那天的,这一定是正确。
- 如果只需要取出一个,那么可以
select *
from employees
order by hire_date desc
limit 0,1;
limit 0,1;
代表从0号位置开始取1个。
- 查找employees里入职员工时间排名倒数第三的员工所有信息
只有一个时候
select * from employees
order by hire_date desc
limit 2,1;
有多个时候
select emp_no,birth_date,first_name,last_name,gender,hire_date
from employees e1
where 2= ( # 有两种日期大于她自己的
select count(*)
from employees e2
where e2.hire_date > e1.hire_date
);
- 查找各个部门领导薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列,以上例子输入如下:
select s.*,d.dept_no
from salaries s
join dept_manager d
on s.emp_no = d.emp_no
order by emp_no;
- 查找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示,以上例子如下:
只要employees表里的emp_no = dept_emp 表里的emp_no 就可以了。
select last_name,first_name,dept_no
from employees e
join dept_emp d
on e.emp_no = d.emp_no;
查找所有已经分配部门的员工的last_name和first_name以及dept_no,也包括暂时没有分配具体部门的员工
select last_name,first_name,dept_no
from employees e
left join dept_emp d
on e.emp_no = d.emp_no;
查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t,以上例子输出如下: ```sql select emp_no,count() t from salaries s group by emp_no having t > 15; # 不需要计算两次count() t
select emp_no,count() t from salaries s group by emp_no having count(t) > 15; # 需要计算两次count() t ,慢
7. 有一个薪水表,请你找出所有员工具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示,以上例子输出如下:
![](https://cdn.nlark.com/yuque/0/2021/png/8429887/1615354332161-04c64d42-44de-420a-ae89-9bcd0e30609d.png#height=320&id=erZIs&originHeight=320&originWidth=656&originalType=binary&ratio=1&size=0&status=done&style=none&width=656)<br />![](https://cdn.nlark.com/yuque/0/2021/png/8429887/1615354452456-dd002db3-252e-401e-a5e5-63c9f9d3af67.png#height=252&id=lFO0k&originHeight=252&originWidth=354&originalType=binary&ratio=1&size=0&status=done&style=none&width=354)
- 分组+ 降序 就行了
```sql
select salary
from salaries
group by salary
order by salary desc;
- 有一个员工表employees简况如下:
有一个部门领导表dept_manager简况如下:
请你找出所有非部门领导的员工emp_no,以上例子输出:
- 查找员工表的id,只要id不在领导表里面就行了
select emp_no
from employees e1
where e1.emp_no not in (
select emp_no
from dept_manager);
- 有一个员工表dept_emp简况如下:
第一行表示为员工编号为10001的部门是d001部门。
有一个部门经理表dept_manager简况如下:
第一行表示为d001部门的经理是编号为10002的员工。
获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示,以上例子如下:
连接操作:
- 员工表和管理表部门一致
员工表和管理表的员工id不一致
select e.emp_no,m.emp_no
from dept_emp e
join dept_manager m
on e.dept_no = m.dept_no and e.emp_no != m.emp_no;
有一个员工表dept_emp简况如下:
有一个薪水表salaries简况如下:
获取所有部门中员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列,以上例子输出如下:
- 很复杂,需要使用多次连接
- 写了很久
select d2.dept_no,d2.emp_no,maxSalary
from ( # 选出每组的最大的
select dept_no,max(salary) maxSalary
from dept_emp e1
join salaries s1
on e1.emp_no = s1.emp_no
group by dept_no
) d1,dept_emp d2,salaries d3
# 按员工编号,组号,工资进行连接判断
where d1.dept_no = d2.dept_no
and d1.maxSalary = d3.salary
and d2.emp_no = d3.emp_no
order by d2.dept_no;
- 有一个员工表employees简况如下:
建表语句如下:
1 2 3 4 5 6 7 8 |
CREATE TABLE employees( emp_no` int(11) NOT NULL,`<br /> birth_datedate NOT NULL, first_name` varchar(14) NOT NULL,`<br /> last_namevarchar(16) NOT NULL, gender` char(1) NOT NULL,`<br /> hire_datedate NOT NULL, PRIMARY KEY ( emp_no)); |
---|---|
请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列,以上例子查询结果如下:
select *
from employees
where emp_no & 1 = 1 # 取余使用mod的,使用位运算比较快
and last_name != 'Mary'
order by hire_date desc;
- 有一个员工职称表titles简况如下:
有一个薪水表salaries简况如下:
建表语句如下:
1 2 3 4 5 |
CREATE TABLE titles ( emp_no` int(11) NOT NULL,`<br /> titlevarchar(50) NOT NULL, from_date` date NOT NULL,`<br /> to_datedate DEFAULT NULL); |
---|---|
1 2 3 4 5 6 |
CREATE TABLE salaries( emp_no` int(11) NOT NULL,`<br /> salary``int``(11) NOT NULL, from_date` date NOT NULL,`<br /> to_datedate NOT NULL, PRIMARY KEY ( emp_no, from_date)); |
---|---|
请你统计出各个title类型对应的员工薪水对应的平均工资avg。结果给出title以及平均工资avg,并且以avg升序排序,以上例子输出如下:
- 使用连接以及分组
select title,avg(s.salary)
from titles t
join salaries s
on t.emp_no = s.emp_no
group by title;
- 有一个薪水表salaries简况如下:
请你获取薪水第二多的员工的emp_no以及其对应的薪水salary
如果薪水各个不相同
select emp_no,salary
from salaries s1
where 1 = (select count(*) from salaries s2 where s2.salary > s1.salary);
如果有多个薪水是一样的
- 按薪水进行分组,选出第二组
limit 1,1
select emp_no,salary
from salaries
where salary = (select salary
from salaries
group by salary
order by salary desc
limit 1,1);
- 按薪水进行分组,选出第二组