题目:
部门表 dept
id | name |
1 | 研发部 |
2 | 财务部 |
3 | 市场部 |
员工表 epmloyee
id | name | gender | age | money | deptid |
1 | 王五 | 男 | 25 | 3000 | 1 |
2 | 李明 | 男 | 23 | 2500 | 1 |
3 | 王二小 | 男 | 23 | 2356 | 2 |
4 | 陈发 | 男 | 22 | 3600 | 2 |
5 | 小明 | 男 | 21 | 3100 | 3 |
6 | 苏奇 | 男 | 24 | 2800 | 3 |
7 | 王丽 | 女 | 19 | 1800 | 1 |
8 | 李芳 | 女 | 18 | 1900 | (null) |
完成以下要求:
-
查询所有员工信息,信息内容包括(id,员工姓名,性别,年龄,工资,部门名称)两张表关联
-
查询出工资最高的员工,并显示员工信息
-
查询出每个部门工资最高的员工信息
-
查询所有男性员工工资总和,平均工资,最高工资,最低工资
-
查询工资大于平均工资的员工信息
-
查询所有姓王员工的姓名和性别
-
查询年龄最大的前3个员工的姓名和年龄 排序 数量限制
-
统计每个部门的工资总和,显示信息:部门名称,工资总和
-
统计每个部门的总人数,显示信息:部门名称,部门人数
实现:
1.查询所有员工信息,信息内容包括(id,员工姓名,性别,年龄,工资,部门名称)两张表关联
思路:利用多表关联语句通过部门名称关联
SELECT
e.id,
e.name,
e.gender,
e.age,
e.money,
d.name
FROM epmloyee e
INNER JOIN dept d ON e.deptid=d.id
2.查询出工资最高的员工,并显示员工信息
思路:利用子表查询中标量子查询将最大的数据显示出来,然后再用where判断money是否是最大值
SELECT * FROM epmloyee WHERE money=(SELECT MAX(money) FROM epmloyee)
3.查询出每个部门工资最高的员工信息
思路:先用分组查询将每个部门中最高的工资显示出来将其作为子表然后再用inner join两张表关联起来(关联条件就是部门相同钱的值相同),如果要显示部门再关联一个部门dept表显示部门名称
SELECT * FROM epmloyee e INNER JOIN
(SELECT deptid,MAX(money) m FROM epmloyee GROUP BY deptid) t
ON e.deptid= t.deptid AND e.money =t.m
INNER JOIN dept d ON e.deptid = d.id
4.查询所有男性员工工资总和,平均工资,最高工资,最低工资
思路:利用语句就可以了
SELECT
SUM(money) '总和工资',
AVG(money) '平均工资',
MAX(money) '最高工资',
MIN(money) '最低工资'
FROM epmloyee e
INNER JOIN dept d ON e.deptid=d.id
WHERE gender='男'
5.查询工资大于平均工资的员工信息
思路:与第二问相似改变条件就可以了
SELECT * FROM epmloyee WHERE money>(SELECT AVG(money) FROM epmloyee)
6.查询所有姓王员工的姓名和性别
SELECT e.*,d.name
FROM epmloyee e
INNER JOIN dept d ON e.deptid=d.id
WHERE e.name LIKE '王%'
7.查询年龄最大的前3个员工的姓名和年龄 排序 数量限制
SELECT e.name,e.age
FROM epmloyee e
INNER JOIN dept d ON e.deptid=d.id
ORDER BY e.age DESC
LIMIT 0,3
8.统计每个部门的工资总和,显示信息:部门名称,工资总和
SELECT d.name,SUM(money)
FROM epmloyee e
INNER JOIN dept d ON e.deptid=d.id
GROUP BY e.deptid
9.统计每个部门的总人数,显示信息:部门名称,部门人数
SELECT d.name,COUNT(e.name)
FROM epmloyee e
INNER JOIN dept d ON e.deptid=d.id
GROUP BY e.deptid