SQL
前言:内连接只返回满足连接条件的数据行,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。外连接分为左外连接、右外链接、全外连接三种。
1、查询最晚入职员工的所有信息,为了减轻入门难度,目前所有的数据里,员工的入职日期都不是同一天
select * from employees where hire_date=(
select max(hire_date) from employees
);
2、查询入职员工时间排名第三的员工所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天。
select * from employees
order by hire_date desc
limit 2,1
注:limit接受两个整数参数a b,a表示从a+1行开始去,b表示需要取的行数
3、查找在当前时刻(to_date=‘9999-01-01’),各个部门的经理的薪水详情以及其对应部门编号dept_no。(题目隐含要求:最后输出的emp_no是按照从小到大的顺序排列的)
select a.* , b.dept_no
from salaries a
join dept_manager b on a.emp_no = b.emp_no
where b.to_date='9999-01-01' and a.to_date='9999-01-01'
order by a.emp_no asc
4、查找所有已经分配部门的员工的last_name,first_name以及dept_no
select a.last_name, a.first_name,b.dept_no
from employees a
join dept_emp b on a.emp_no = b.emp_no
5、查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括暂时没有分配具体部门的员工。
select a.last_name, a.first_name,b.dept_no
from employees a
left join dept_emp b on a.emp_no = b.emp_no
6、查找所有员工入职时候的薪水情况,给出emp_no以及salary,并按照emp_no进行逆序
select emp_no,salary
from salaries
group by emp_no having salary <= min(salary)
order by emp_no desc;
7、查找薪水变动次数超过15次的员工号以及变动的次数t
select emp_no,count(from_date) as t
from salaries
group by emp_no -- 聚合函数,得用having
having count(from_date) > 15
8、找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并且按照逆序显示。
select distinct salary
from salaries
where to_date='9999-01-01'
order by salary desc
9、获取所有非manager的员工的emp_no
select a.emp_no
from employees a left join dept_manager b on a.emp_no=b.emp_no
where b.emp_no is NULL
10、获取所有员工当前的(dept_manager.to_date='9999-01-01')emp_no,如果员工就是manager的话,不显示,输出当前员工的emp_no和manager的emp_no。
select a.emp_no,b.emp_no as manager_no
from dept_emp a join dept_manager b on a.dept_no=b.dept_no
where a.to_date='9999-01-01' and b.to_date='9999-01-01' and a.emp_no <> b.emp_no
12、获取所有部门中当前(dept_emp.to_date='9999-01-01')员工当前(salaries.to_date='9999-01-01')薪水最高的相关信息,给出dept_no,emp_no以及对应的salary,按部门升序。
select a.dept_no,a.emp_no,max(b.salary)
from dept_emp a inner join salaries b on a.emp_no=b.emp_no
where a.to_date = '9999-01-01' and b.to_date='9999-01-01' -- 不是聚合函数,可以用where
group by a.dept_no
13、从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
select title,count(title) as t
from titles
group by title
having t >= 2
14、从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。注意对于重复的emp_no进行忽略(即emp_no重复的title不计算,title对应的数目t不增加)。
select title,count(distinct emp_no) as t
from titles
group by title
15、查找employees表所有emp_no为奇数,且last_name不为Mary(注意大小写)的员工信息,并按照hire_date逆序排列(题目不能使用mod函数)
select *
from employees
where last_name <> 'Mary' and emp_no%2=1
order by hire_date desc;

浙公网安备 33010602011771号