数据库SQL实战练习3

1、统计出当前各个title类型对应的员工当前(to_date=‘9999-01-01’)薪水对应的平均工资。结果给出title以及平均工资avg。

CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));
CREATE TABLE IF NOT EXISTS “titles” (
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

/*select c.title as title,avg(c.salary) as salary
from(
    select t.title as title, s.salary as salary
    from  salaries s , titles t
    where  s.emp_no = t.emp_no
    and t.to_date = '9999-01-01'
    and s.to_date = '9999-01-01') as c
group by c.title;
*/

select t.title as title,avg(s.salary) as salary
from  salaries s , titles t
where  s.emp_no = t.emp_no
and t.to_date = '9999-01-01'
and s.to_date = '9999-01-01'
group by t.title;

2、获取当前(to_date=‘9999-01-01’)薪水第二多的员工的emp_no以及其对应的薪水salary

CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

select emp_no,salary
from salaries
where to_date = '9999-01-01'
order by salary desc 
limit 1,1;

3、查找当前薪水(to_date=‘9999-01-01’)排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by

CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

-- 先找出表中薪资最高的 然后找出所有的薪资只要不在这个最高薪资之中的薪资最高者那么就是第二高的薪资了
-- 有点绕

/*
select e.emp_no , max(s.salary) , e.last_name , e.first_name
from  employees e , salaries s
where e.emp_no = s.emp_no
and s.to_date = '9999-01-01'
and s.salary not in (select max(salary)
                     from salaries sa ,employees em
                     where sa.to_date = '9999-01-01'
                     and sa.emp_no = em.emp_no)
*/
-- 比最大的还要小的里面选最大的 就是第二大的了

select e.emp_no , max(s.salary) , e.last_name , e.first_name
from  employees e , salaries s
where e.emp_no = s.emp_no
and s.to_date = '9999-01-01'
and s.salary  < (select Max(salary)from salaries where to_date = '9999-01-01')

3、查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工

CREATE TABLE departments (
dept_no char(4) NOT NULL,
dept_name varchar(40) NOT NULL,
PRIMARY KEY (dept_no));
CREATE TABLE dept_emp (
emp_no int(11) NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));

select c.last_name,c.first_name,dp.dept_name
from (select * from employees e left join dept_emp de on de.emp_no = e.emp_no)as c  left join  departments dp
on dp.dept_no = c.dept_no;

4、查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth

CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

select (
        (select salary from salaries where emp_no = 10001 order by to_date desc limit 1)-
        (select salary from salaries where emp_no = 10001 order by to_date asc limit 1)
)as growth;

5、查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序

CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

/*
先找到最近的工资情况 再去找到一开始进公司的薪资 ,只要一相减 就可以得到growth了
当然两个计算薪资的SQL里面 emp_no得是同一个人啊 所以最后加上where CuurentInfo.emp_no  =  StartInfo.emp_no  
其他就没有什么了 至于left join 大家可以看看题目要求输出的东西 可以输出省略的内容  必须用join了
*/
select CuurentInfo.emp_no , (CuurentInfo.salary - StartInfo.salary) as growth
from  (select e.emp_no , s.salary
        from employees e left join salaries s
        on e.emp_no = s.emp_no
        where s.to_date = '9999-01-01') as CuurentInfo , (select e.emp_no , s.salary
                                                            from employees e left join salaries s
                                                            on e.emp_no = s.emp_no
                                                            where s.from_date = e.hire_date) as StartInfo
where CuurentInfo.emp_no  =  StartInfo.emp_no
order by growth;

6、统计各个部门的工资记录数,给出部门编码dept_no、部门名称dept_name以及次数sum

CREATE TABLE departments (
dept_no char(4) NOT NULL,
dept_name varchar(40) NOT NULL,
PRIMARY KEY (dept_no));
CREATE TABLE dept_emp (
emp_no int(11) NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

select de.dept_no, de.dept_name , count(c.salary) as sum
from (select * from dept_emp d left join salaries s on d.emp_no = s.emp_no) as c left join  departments de
on de.dept_no = c.dept_no
group by de.dept_no;
-- 按部门进行员工的结算涨幅次数的 所以要group by 部门编号

7、对所有员工的当前(to_date=‘9999-01-01’)薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列

CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

-- 想用薪资的要并列 
select s1.emp_no,s1.salary,count(distinct s2.salary) rank
from salaries s1 , salaries s2 
where s1.to_date = '9999-01-01'
and s2.to_date =  '9999-01-01'
and s1.salary <= s2.salary
group by s1.emp_no
order by s1.salary desc ;
发布了45 篇原创文章 · 获赞 6 · 访问量 2071

猜你喜欢

转载自blog.csdn.net/qq_22583191/article/details/104152267