数据库sql实战(1-14)

1.查找最晚入职员工信息

select * from employees where hire_date=(select max(hire_date) from employees);

2.查找入职员工时间排名倒数第三的员工所有信息
sql语句根据条件查询指定数量的数据,LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
SELECT * form 表名 WHERE 条件 limit 5,10; //检索6-15条数据
SELECT * form 表名 WHERE 条件 limit 5,-1; //检索6到最后一条数据
SELECT * form 表名 WHERE 条件 limit 5; //检索前5条数据

select * from employees order by hire_date desc limit 2,1;

3.查找所有已经分配部门的员工的last_name和first_name


SELECT
    e.last_name,
    e.first_name,
    d.dept_no

FROM
    dept_emp AS d
INNER JOIN
    employees AS e
ON
    e.emp_no = d.emp_no;
select e.last_name,e.first_name,d.dept_no from employees e,dept_emp d
where d.emp_no=e.emp_no

4.查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
这道题和上道的区别在于,如果一个员工没有dept_no,那么也要把它查出来,并且dept_no设置为NULL。根据以上要求,使用左连接就是最好的选择了。

select e.last_name,e.first_name,d.dept_no 
from employees as e   
left join
   dept_emp as d
on
    e.emp_no = d.emp_no;

5.查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序

select  e.emp_no,s.salary from employees as e,salaries as s where e.emp_no=s.emp_no and e.hire_date=s.from_date 
order by e.emp_no desc

6.查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

1、COUNT()函数和GROUP BY语句可以统计同一emp_no值的记录条数
2、根据题意,输出的涨幅次数为t,故用AS语句将COUNT(emp_no)的值转换为t
3、由于WHERE后不可跟COUNT()函数,故用HAVING语句来限定t>15的条件

select emp_no,count(emp_no)as t from salaries 
group by emp_no having t>15

7.找出所有员工当前(to_date=’9999-01-01’)具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示
去重:SELECT DISTINCT 列名称 FROM 表名称

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

8.获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date=’9999-01-01’

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'

当连接语句为 FROM dept_manager AS d INNER JOIN salaries AS s 时,在最后面加上ORDER BY d.emp_no即可通过。
原因分析可能如下:连接后按照前面的第一个 KEY 值排序,若 salaries 在前,则按照 s.emp_no 排序(因为限制条件为 d.emp_no = s.emp_no,所以对 s.emp_no 排序就是对d.emp_no 排序),输出跟参考答案一致,没问题;若 dept_manager 在前,则按照 d.dept_no排序,此时与参考答案不同,所以需要在末尾手动用 ORDER BY 对d.emp_no进行排序。
SELECT d.dept_no, d.emp_no, s.salary 
FROM dept_manager 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'
ORDER BY d.emp_no

9.获取所有非manager的员工emp_no

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

10.获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary

1.select d.dept_no,d.emp_no,s.salary 
from dept_emp as d inner join salaries as s
on  d.emp_no=s.emp_no 
where d.to_date="9999-01-01" and s.to_date="9999-01-01"
group by d.dept_no having max(s.salary)
2.
SELECT d.dept_no, s.emp_no, MAX(s.salary) AS salary
FROM salaries AS s INNER JOIN dept_emp As d
ON d.emp_no = s.emp_no 
WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
GROUP BY d.dept_no

11.从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。

select title,count(title) as t from titles group by title having t>=2

12.从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。注意对于重复的emp_no进行忽略。

select title,count(distinct(emp_no))as t from titles group by title having t>=2

13.查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列

select * from employees where emp_no%2==1 and last_name!='mary' order by hire_date desc

14.统计出当前各个title类型对应的员工当前薪水对应的平均工资。结果给出title以及平均工资avg。

SELECT title , AVG(salary) AS avg
FROM salaries s,titles t
WHERE s.emp_no = t.emp_no AND s.to_date = '9999-01-01' AND t.to_date = '9999-01-01'
GROUP BY t.title;

select t.title,avg(s.salary) from titles t join salaries 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;

猜你喜欢

转载自blog.csdn.net/wuhuimin521/article/details/80541739