MySQL—多表查询—练习(2)

一、引言

接着上篇博客《 MySQL多表查询——练习(1)》继续完成剩下的案例需求。


二、案例

(0)三张表(员工表、部门表、薪资等级表)

员工表:emp

部门表:dept

薪资等级表:salgrade


接着下面完成案例。从第6个需求开始。

(6)查询 “ 研发部 ” 所有员工的信息及工资等级。
1、分析

涉及三张表,两个连接条件,一个查询条件。

(连接条件:emp.salary between salgrade.losal and salgrade.hisal ,emp.dept_id = dept.id)

(查询条件:dept.name ="研发部")

2、实操
SELECT e.*, s.grade FROM emp e,dept d,salgrade s WHERE e.dept_id = d.id AND (e.salary BETWEEN s.losal AND s.hisal) AND d.name='研发部';

3、问题

随着SQL语句的复杂程度越来越高,所涉及的表也越来越多,这时SQL语句的长度越来越长,在可视化工具看起来的可视化不是很直观。

解决方法如下:

展示结果:

(7)查询 “ 研发部 ” 员工的平均工资。

分析:涉及两张表,使用聚合函数

SELECT AVG(e.salary) FROM emp e,dept d WHERE e.dept_id=d.id AND d.name='研发部';

(8)查询工资比员工 “ 灭绝 ” 高的员工信息。

分析:用子查询。先查员工 " 灭绝 " 的工资,再查其它满足需求的员工信息。

标量子查询

SELECT * FROM emp WHERE emp.salary > (SELECT e.salary FROM emp e WHERE name='灭绝');

(9)查询比平均薪资高的员工信息。

实操

SELECT * FROM emp WHERE salary > (SELECT AVG(e.salary) FROM emp e);

(10)查询低于本部门平均工资的员工信息

1、分析

先假如查询id=1 的部门的平均工资

SELECT AVG(e1.salary) FROM emp e1 WHERE e1.dept_id=1;

查到之后,按照题目的意思就是要查询当前部门的员工小于平均工资的员工信息

现在题目要求的是查询低于当前部门的平均工资的员工。即每个部门都要有这种查询结果

SELECT e2.*,(SELECT AVG(e1.salary) FROM emp e1 WHERE e1.dept_id=e2.dept_id) AS '所属部门的平均工资' FROM emp e2 WHERE e2.salary < (SELECT AVG(e1.salary) FROM emp e1 WHERE e1.dept_id=e2.dept_id);

(11)查询所有的部门信息,并统计部门的员工人数

1、分析

首先试试查询某个部门的员工数量

SELECT COUNT(*) FROM emp WHERE emp.dept_id=1;

再改一下(最终SQL语句)

SELECT d.id,d.name,(SELECT COUNT(*) FROM emp e1 WHERE e1.dept_id=d.id) AS '部门总人数' FROM dept d;

在 SELECT 语句也可以出现子查询语句。

(12)查询所有学生的选课情况,展示出学生名称,学号,课程名称

涉及到三张表:学生表 student 、课程表 course 、学生选课表 student_course

通过中间表来维护三张表的多对多的关系。

1、三张表的基本数据

课程表:course

学生表:student

学生选课表

2、实操开始

注意:三张表要消除笛卡尔积(避免无效数据),至少两个条件。

连接条件:(student.id = student_course.student_id,course.id = student_course.course_id)

SELECT s.name,s.id,c.name FROM student s ,student_course sc ,course c WHERE (s.id=sc.student_id) AND (sc.course_id=c.id);

这就是演示的三张表的多表联查。就是要搞清楚:注意两两表之间的联系

关于多表查询的12个SQ语句案例已经全部实操完成了,

在完成的时候,SQL语句的写法不是固定的,有很多种查询方法去完成这些SQL语句的编写。

简而言之:只要能满足需求即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

岁岁岁平安

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

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

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

打赏作者

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

抵扣说明:

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

余额充值