数据库-实例

1、
查找当前薪水(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));
输入描述:

输出描述:
emp_no salary last_name first_name

10009

94409

Peac

Sumant

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

需要注意:重点:两个嵌套select和where 先把最大的剔除,再从剩下的数中选择最大的。

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));
输入描述:

输出描述:
emp_no salary

10009

94409

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

注意:limit的妙用,在order by 之后,进行选择输出
limit后如果只有一个数 比如:limit 3 代表选择排序后的前三个进行输出。
limit后面如果有两个数字,比如:limit 1,2 代表跳过一个数,输出跳过后的后面两个数。

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 employees.last_name,employees.first_name,departments.dept_name 
from employees left join dept_emp on employees.emp_no=dept_emp.emp_no 
left join departments on departments.dept_no=dept_emp.dept_no

注意:这里需要注意的是,在进行连接时 要注意 哪个可以为空 一般在进行连接时 为中心的表不能为空 不为中心的表可以为空,left join 以左表为主表连接,左表不能为空,右表可以为空。 右连接也是一样。

4、
查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
(注:可能有employees表和salaries表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了,离职的员工salaries表的最新的to_date!=‘9999-01-01’,这样的数据不显示在查找结果里面)
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));
输入描述:

输出描述:
emp_no growth

10011

0

省略

省略

10010

54496

10004

34003

select  t1.emp_no,(t1.salary-t2.salary) as growth
from (select salaries.emp_no,salaries.salary from salaries,employees 
      where employees.emp_no=salaries.emp_no 
      and employees.hire_date=salaries.from_date) as t2,
      (select emp_no,salary from salaries
      where to_date='9999-01-01') as t1 
where t1.emp_no=t2.emp_no order by growth ASC 

这里需要单独柑橘已有的表格创建两个表格,一个表格是:入职薪水表格,一个表格是 到9999-01-01的薪水表格,
再从两个表格中进行选择输出。
没有技巧 纯暴力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椒椒。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值