MySQL数据库——多表查询(4)-实例练习、多表查询总结

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL数据库——多表查询(4)-实例练习、多表查询总结

进行案例练习之前,需要先增加一个表格

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);

练习之前,我们把三张表都拿出来:

练习1

  1. 查询员工的姓名、年龄、职位、部门信息 (隐式内连接)
  2. 查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)
  3. 查询拥有员工的部门ID、部门名称
  4. 查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出来
  5. 查询所有员工的工资等级

1-1

-- 查询员工的姓名、年龄、职位、部门信息 (隐式内连接

select e.name '姓名',e.age '年龄',e.job '职位',d.name  '部门信息'
    from emp e,dept d where e.dept_id = d.id;

查询结果:

1-2

-- 查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)

select e.name '姓名',e.age '年龄',e.job '职位',d.name  '部门信息'
    from emp e inner join dept d on e.dept_id = d.id where e.age < 30;

查询结果:

1-3

-- 查询拥有员工的部门ID、部门名称

-- 要点:自连接,去重关键字

select distinct d.id,d.name from emp e,dept d where e.dept_id = d.id;

查询结果:

1-4

-- 查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出来

-- 要点:左外连接

select e.name '姓名',d.name '部门名称' 
    from emp e left join dept d on e.dept_id = d.id where age > 40;

查询结果:

1-5

-- 查询所有员工的工资等级

-- 要点:表结构为emp和salgrade,搞清楚两张表的连接条件

select e.name '姓名',s.grade '工资等级' 
    from emp e left join salgrade s on e.salary >= s.losal and e.salary <= s.hisal;
 
-- 另一种写法
select e.name '姓名',s.grade '工资等级'
    from emp e left join salgrade s on e.salary between s.losal and s.hisal;

查询结果:

练习2

  1. 查询 "研发部" 所有员工的信息及 工资等级
  2. 查询 "研发部" 员工的平均工资
  3. 查询工资比 "灭绝" 高的员工信息。
  4. 查询比平均薪资高的员工信息
  5. 查询低于本部门平均工资的员工信息
  6. 查询所有的部门信息, 并统计部门的员工人数
  7. 查询所有学生的选课情况, 展示出学生名称, 学号, 课程名称

2-1

-- 查询 "研发部" 所有员工的信息及 工资等级


-- 要点:搞清楚连接条件和查询条件


-- 连接条件:

(e.dept_id = d.id)

(e.salary between losal and hisal)

-- 查询条件

(d.name = '研发部')

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

查询结果:

2-2

-- 查询 "研发部" 员工的平均工资

-- 要点:函数avg()

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

查询结果:

2-3

-- 查询工资比 "灭绝" 高的员工信息。

select *
from emp
where salary > (select salary from emp where name = '灭绝');

查询结果:

2-4

-- 查询比平均薪资高的员工信息

select *
from emp
where salary > (select avg(salary) from emp);

查询结果:

2-5

-- 查询低于本部门平均工资的员工信息

-- 要点:查询出每个部门的平均工资

select *, (select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id) '所在部门平均工资'
from emp e2
where e2.salary < (select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id);

查询结果:

2-6

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

先查询所有部门的部门信息:

select * from dept;

再统计单个部门的员工人数:

select count(*) from emp where dept_id = 1;

整合起来:

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

查询结果:

2-7

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

涉及另外的三个表,是多对多的关系

理清楚三个表的连接关系就可以查询出来

select s.name '学生名称', s.no '学号', c.name '课程名称'
from student s,
     course c,
     student_course sc
where (s.id = sc.studentid)
  and (c.id = sc.courseid);

查询结果:

总结

1.多表关系

一对多:在多的一方设置外键,关联一的一方的主键

多对多:建立中间表,中间表包含两个外键,关联两张表的主键

一对一:用于表结构拆分,在其中任何一方设置外键(UNIQUE),关联另一方的主键

2.多表查询

自连接

       隐式:SELECT...FROM 表A,表B WHERE 条件...

 显式:SELECT...FROM 表A INNER JOIN 表B ON 条件...


外连接:


       左外:SELECT...FROM 表A LEFT JOIN 表B ON 条件...


       右外:SELECT...FROM 表A RIGHT JOIN 表B ON 条件...


自连接:SELECT ... FROM 表A 别名1,表A 别名2 WHERE 条件...


子查询:标量子查询、列子查询、行子查询、表子查询


end


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
29天前
|
存储 关系型数据库 MySQL
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
88 1
|
29天前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
45 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
16天前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
102 61
|
16天前
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
86 57
|
16天前
|
缓存 负载均衡 监控
数据库多实例的负载均衡技术深入
【10月更文挑战第23天】数据库多实例负载均衡技术是确保数据库系统高效运行的重要手段。通过合理选择负载均衡策略、实时监控实例状态、不断优化调整,能够实现资源的最优分配和系统性能的提升。在实际应用中,需要根据具体情况灵活运用各种负载均衡技术,并结合其他相关技术,以满足不断变化的业务需求。
|
5天前
|
关系型数据库 MySQL 数据库
【赵渝强老师】启动与关闭MySQL数据库实例
MySQL数据库安装完成后,可以通过命令脚本启动、查看状态、配置开机自启、查看自启列表及关闭数据库。本文提供了详细的操作步骤和示例代码,并附有视频讲解。
|
1月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
61 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
28天前
|
存储 关系型数据库 MySQL
mysql 8.0 的 建表 和八种 建表引擎实例
mysql 8.0 的 建表 和八种 建表引擎实例
20 0
|
29天前
|
存储 关系型数据库 MySQL
Key_Value 形式 存储_5级省市城乡划分代码 (mysql 8.0 实例)
本文介绍了如何使用MySQL8.0数据库中的Key_Value形式存储全国统计用区划代码和城乡划分代码(5级),包括导入数据、通过数学函数提取省市区信息,以及查询5级行政区划的详细数据。
29 0