有关部门信息表与员工信息表的常用SQL应用语句实现汇总

背景条件

已知有员工信息表(emp)部门信息表(dept),具体表的信息如下:

员工信息表emp:

列名类型其他备注
empnoDECIMAL(4)主键员工编号
enameVARCHAR2(10)员工姓名
jobVARCHAR2(9)工种
mgrDECIMAL(4)管理者代码
hiredateDATE雇佣时间
salDECIMAL(7,2)月收入
commDECIMAL(7,2)提成
deptnoDECIMAL(2)外键所属部门编号

部门信息表dept:

列名类型其他备注
deptnoDECIMAL(2)主键部门编号
dnameVARCHAR2(14)部门名称
locVARCHAR2(13)地理位置

下面我们使用上述两个表,实现如下功能的SQL语句编写:

  1. 将自己的信息插入emp表,具体数据要求如示例
  2. 将所有人的薪水增加25%
  3. 列出受雇日期早于他上级的所有员工
  4. 列出超出部门平均员工数的那些部门名称及人数
  5. 列出所有的部门和部门员工的所有信息,没有员工的部门也要显示
  6. 列出每个部门中入职时间最早的那些员工的名字及工龄(与现在日期比)
  7. 列出薪金(收入+提成,下同)比CLARK高的雇员名字、工种、部门名称、薪金
  8. 列出薪金高于部门平均水平的所有雇员名字、薪金、部门名称
  9. 列出所有的员工的名字、上级的名字、部门名称

预备工作

实验环境:Navicat 16 for MySQL
在数据库中建立这两个表
如图:

  1. 员工信息表中引用了部门信息表的deptno,作为外键,所以应当先建立部门信息表dept
    在这里插入图片描述
  2. 建立员工信息表emp并设置外键
    在这里插入图片描述
    在这里插入图片描述
  3. 添加一些事例数据进去
    在这里插入图片描述
    在这里插入图片描述

将自己的信息插入emp表,具体数据要求如示例

示例:
在这里插入图片描述

SQL语句
INSERT INTO emp
VALUES (9999,'somebody','analyst',7566,'2023-06-01',8000,0,20);

将所有人的薪水增加25%

SQL语句
update emp set sal = sal*1.25;
效果

在这里插入图片描述


列出受雇日期早于他上级的所有员工

SQL语句
select a.*
from emp a join emp b
on a.mgr = b.empno join dept d
on a.deptno = d.deptno
where a.hiredate < b.hiredate;
效果

在这里插入图片描述


列出超出部门平均员工数的那些部门名称及人数

SQL语句
SELECT d.dname, COUNT(*) AS employee_count
FROM emp e
JOIN dept d ON e.deptno = d.deptno
GROUP BY e.deptno
HAVING COUNT(*) > (
  SELECT AVG(emp_count)
  FROM (
    SELECT COUNT(*) AS emp_count
    FROM emp,dept
    WHERE emp.deptno = dept.deptno
    GROUP BY emp.deptno
  ) AS dept_emp
);
效果

在这里插入图片描述


列出所有的部门和部门员工的所有信息,没有员工的部门也要显示

SQL语句
select d.dname,e.* 
from emp e right join dept d on e.deptno=d.deptno;
效果

在这里插入图片描述


列出每个部门中入职时间最早的那些员工的名字及工龄(与现在日期比)

SQL语句
SELECT d.dname, e.ename, DATEDIFF(CURDATE(), e.hiredate) as work_age
FROM emp e
JOIN dept d ON e.deptno = d.deptno
WHERE e.hiredate IN (
  SELECT MIN(hiredate)
  FROM emp
  GROUP BY deptno
);
效果

在这里插入图片描述


列出薪金(收入+提成,下同)比CLARK高的雇员名字、工种、部门名称、薪金

SQL语句
SELECT e.ename, e.job, d.dname, (e.sal + IFNULL(e.comm,0)) as total_salary
FROM emp e
JOIN dept d ON e.deptno = d.deptno
WHERE (e.sal + IFNULL(e.comm,0)) > (
  SELECT (sal + IFNULL(comm,0))
  FROM emp
  WHERE ename = 'CLARK'
);
效果

在这里插入图片描述


列出薪金高于部门平均水平的所有雇员名字、薪金、部门名称

SQL语句
SELECT e.ename, (e.sal + IFNULL(e.comm,0)) as total_salary, d.dname
FROM emp e
JOIN dept d ON e.deptno = d.deptno
WHERE (e.sal + IFNULL(e.comm,0)) > (
  SELECT AVG(e2.sal + IFNULL(e2.comm,0))
  FROM emp e2
  WHERE e2.deptno = e.deptno
);
效果

在这里插入图片描述


列出所有的员工的名字、上级的名字、部门名称

SQL语句
select e.ename,m.ename,d.dname 
from emp e,emp m,dept d
where e.mgr = m.empno and e.deptno = d.deptno;
效果

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Alkali!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值