有关部门信息表与员工信息表的常用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;
效果

在这里插入图片描述


  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQL Server中,分组汇总语句是一种用于根据特定字段对数据进行分组,并计算每个组内数据的汇总信息的查询语句常用的分组汇总函数包括COUNT、SUM、AVG、MIN和MAX等。 例如,我们有一个名为"Orders"的,包含订单号、客户编号和订单金额等字段。我们可以使用分组汇总语句来计算每个客户的订单总金额。 ```sql SELECT CustomerID, SUM(OrderAmount) AS TotalAmount FROM Orders GROUP BY CustomerID ``` 以上语句中,使用了SUM函数来计算每个客户的订单总金额,并使用GROUP BY子句将结果按照客户编号分组。最后,通过SELECT语句选择显示客户编号和总金额。 除了SUM函数,我们还可以使用其他分组汇总函数。例如,如果我们想知道每个客户的订单数量,可以使用COUNT函数。 ```sql SELECT CustomerID, COUNT(*) AS OrderCount FROM Orders GROUP BY CustomerID ``` 以上语句中,使用了COUNT函数来计算每个客户的订单数量,并通过GROUP BY子句按照客户编号进行分组。 分组汇总语句还可以使用HAVING子句来过滤汇总结果。例如,如果我们只想查找订单总金额大于1000的客户,可以使用HAVING子句来实现。 ```sql SELECT CustomerID, SUM(OrderAmount) AS TotalAmount FROM Orders GROUP BY CustomerID HAVING SUM(OrderAmount) > 1000 ``` 以上语句中,使用HAVING子句来过滤总金额大于1000的客户。 总而言之,SQL Server中的分组汇总语句是一种强大的工具,可以根据特定字段对数据进行分组,并计算每个组的汇总信息。通过使用合适的分组汇总函数和HAVING子句,我们可以根据需求来获取到所需的汇总结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Alkali!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值