Skip to content

多表查询案例

数据环境准备

sql
create table salgrade(
grade int,
losal int,
hisal int
) comment '薪资等级表';
insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);

在这个案例中, 我们主要运用上面所讲的多表查询的方法,完成以下 12 个需求即可

而这里主要涉及的表就三张 emp 员工表,dept 部门表,salgrade 薪资等级表

(1) 查询员工的姓名,年龄,职位,部门信息(隐式链接)

表 emp,dept

连接条件: emp.dept_id = dept.id

sql
SELECT e.name , e.age, e.job, d.name from emp e, dept d where e.dept_id = d.id;

(2) 查询年龄小于 30 岁的员工姓名,年龄,职位,部门信息(显式链接)

表 emp,dept

连接条件: emp.dept_id = dept.id

sql
SELECT e.name , e.age, e.job, d.name from emp e join dept d on e.dept_id = d.id where e.age < 30;

(3) 查询拥有员工的部门 ID,部门名称

表 emp,dept

连接条件 emp.dept_id = dept.id

sql
SELECT DISINCT d.id, d.name from emp e, dept d where e.dept_id = d.id;

(4) 查询所有年龄>40 岁的员工,及其归属的部门名称,如果员工没有分配部门,也需要查询出来(外链)

表 emp,dept

连接条件 emp.dept_id = dept.id

sql
SELECT e.name , e.age, d.name from emp e left join dept d on e.dept_id = d.id where e.age > 40;

(5) 查询所有员工的工资等级

表 emp , salgrade

连接条件 emp.salary >= salgrade.losal and emp.salary <= salgrade.hisal

sql
select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s where e.salary >=s.losal and e.salary <= s.hisal;

(6) 查询"研发部"的所有员工信息以及工资等级

表 emp, salgrade ,dept

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

查询条件: dept.name = '研发部'

sql
select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s , dept d where e.salary between s.losal and s.hisal and e.dept_id = d.id and d.name = '研发部';

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

表 emp ,dept

连接条件: emp.dept_id = dept.id

sql
select avg(e.salary) from emp e , dept d where e.dept_id = d.id and d.name = '研发部';

(8) 查询工资比"灭绝师太"高的员工信息

  • 查询灭绝的薪资
sql
select salary from emp where name = '灭绝师太';
  • 查询比她工资高的员工数据
sql
select * from emp where salary > (select salary from emp where name = '灭绝师太');

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

  • 查询员工的平均薪资
sql
select avg(salary) from emp;
  • 查询比平均薪资高的员工信息
sql
select * from emp where salary > (select avg(salary) from emp);

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

  • 查询各部门的平均薪资
sql

select avg(el.salary) from emp e1 where e1.dept_id = 1;
select avg(el.salary) from emp e1 where e1.dept_id = 2;
  • 查询低于本部门的平均工资的员工信息
sql
select * from emp e2 where e2.salary < (select avg(el.salary) from emp e1 where e1.dept_id = e2.dept_id);

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

sql
select d.id, d.name, (select count(*) from emp e where e.dept_id = d.id) '人数' from dept d;

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

表 student,course,student_course

连接条件: student.id = student_course.student_id and course.id = student_course.course_id

ts
select s.name, s.id, c.name from student s, course c, student_course sc where s.id = sc.student_id and c.id = sc.course_id;