呕心沥血写了三天3两夜24k字的MySQL详细教程(五)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 呕心沥血写了三天3两夜24k字的MySQL详细教程(五)

第八章 三范式


8.1 什么是范式


范式是指:设计数据库表的规则(Normal Form) 好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储


8.2 范式的基本分类


目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。


8.3 第一范式

即数据库表的每一列都是不可分割的原子数据项,而不能是集合、数组、记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中每个列的值只能是表的一个属性或一个属性的一部分。简而言之,第一范式每一列不可再拆分,称为原子性。 第一范式:每一列不能再拆分  

微信图片_20220525132624.png

总结:如果不遵守第一范式,查询出数据还需要进一步处理(查询不方便)。遵守第一范式,需要什么字段的数据就查询什么数据(方便查询)。


8.4 第二范式


第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。例如在员工表中的身份证号码即可实现每个员工的区分,该身份证号码即为候选键,任何一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分。 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。


第二范式:1. 一张表只描述一件事情


2. 表中的每一个字段都依赖于主键

微信图片_20220525132632.png

总结:如果不准守第二范式,数据冗余,相同数据无法区分。遵守第二范式减少数据冗余,通过主键区分相同数据。


8.5 第三范式


在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖) 第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。微信图片_20220525132640.png

总结:如果不准守第三范式,可能会有相同数据无法区分,修改数据的时候多张表都需要修改(不方便修改)。遵守第三范式通过id可以区分相同数据,修改数据的时候只需要修改一张表(方便修改)。


第九章 多表查询


9.1 什么是多表查询


同时查询多张表获取到需要的数据 比如:我们想查询到开发部有多少人,需要将部门表和员工表同时进行查询微信图片_20220525132647.png

微信图片_20220525133001.png

准备数据


创建部门表
CREATE TABLE dept (
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
‐‐ 创建员工表
CREATE TABLE emp (
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(10),
        gender CHAR(1),
        ‐‐ 性别 salary DOUBLE,
        ‐‐ 工资 join_date DATE
        , ‐‐ 入职日期 dept_id INT
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013‐02‐24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010‐12‐02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008‐08‐08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015‐10‐07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011‐03‐14',1);

9.2 笛尔卡乘积现象


9.2.1 什么是笛尔卡乘积现象


多表查询时左表的每条数据和右表的每条数据组合,这种效果成为笛卡尔积需求:查询每个部门有哪些人具体操作:

SELECT * FROM dept, emp;

微信图片_20220525133009.png

以上数据其实是左表的每条数据和右表的每条数据组合。左表有3条,右表有5条,最终组合后3*5=15条数据。微信图片_20220525133014.png

9.2.2 如何清除笛尔卡乘积现象


我们发现不是所有的数据组合都是有用的,只有员工表.dept_id = 部门表.id 的数据才是有用的。所以需要通过条件过滤掉没用的数据。微信图片_20220525133020.png

SELECT * FROM dept, emp WHERE emp.`dept_id`=dept.`id`;

微信图片_20220525133025.png9.3 内连接


用左边表的记录去匹配右边表的记录,如果符合条件的则显示


9.3.1 隐式内连接


隐式内连接:看不到JOIN关键字,条件使用WHERE指定 SELECT 字段名 FROM 左表, 右表 WHERE 条件;


9.3.2 显示内连接


显示内连接:使用INNER JOIN ... ON语句, 可以省略INNER SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 条件;


具体操作:查询唐僧的信息,显示员工id,姓名,性别,工资和所在的部门名称,我们发现需要联合2张表同时才能查询出需要的数据,我们使用内连接

微信图片_20220525133032.png

1. 确定查询哪些表

SELECT * FROM dept INNER JOIN emp;

微信图片_20220525133040.png

1. 确定表连接条件,员工表.dept_id = 部门表.id 的数据才是有效的

SELECT * FROM dept INNER JOIN emp ON emp.`dept_id`=dept.`id`;

微信图片_20220525133049.png

1. 确定表连接条件,我们查询的是唐僧的信息,部门表.name='唐僧'

SELECT * FROM dept INNER JOIN emp ON emp.`dept_id`=dept.`id` AND emp.`NAME`='唐僧';

微信图片_20220525133054.png1. 确定查询字段,查询唐僧的信息,显示员工id,姓名,性别,工资和所在的部门名称


SELECT emp.`id`, emp.`NAME`, emp.`gender`, emp.`salary`, dept.`NAME` FROM dept INNER JOIN emp ON emp.`dept_id`=dept.`id` AND emp.`NAME`='唐僧';

微信图片_20220525133103.png

1. 我们发现写表名有点长,可以给表取别名,显示的字段名也使用别名


SELECT e.`id` 员工编号, e.`NAME` 员工姓名, e.`gender` 性别, e.`salary` 工资, d.`NAME` 部门名称 FROM dept d INNER JOIN emp e ON e.`dept_id`=d.`id` AND e.`NAME`='唐僧';

微信图片_20220525133109.png

总结内连接查询步骤:


1. 确定查询哪些表


2. 确定表连接条件


3. 确定查询字段


9.4 左外连接


左外连接:使用LEFT OUTER JOIN ... ON,OUTER可以省略 SELECT 字段名 FROM 左表 LEFT OUTER JOIN 右表 ON条件; 用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示NULL 可以理解为:在内连接的基础上保证左表的数据全部显示


具体操作:在部门表中增加一个销售部


INSERT INTO dept (NAME) VALUES ('销售部');

微信图片_20220525134227.png

使用内连接查询

SELECT * FROM dept INNER JOIN emp ON emp.`dept_id`=dept.`id`;

微信图片_20220525134233.png

使用左外连接查询

SELECT * FROM dept LEFT OUTER JOIN emp ON emp.`dept_id`=dept.`id`;

微信图片_20220525134247.png

9.5 右外连接


右外连接:使用RIGHT OUTER JOIN ... ON,OUTER可以省略 SELECT 字段名 FROM 左表 RIGHT OUTER JOIN 右表ON 条件; 用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示NULL 可以理解为:在内连接的基础上保证右表的数据全部显示


具体操作:


在员工表中增加一个员工 INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('沙僧','男',6666,'2013-02-24',NULL);  

微信图片_20220525134252.png

使用内连接查询 SELECT * FROM dept INNER JOIN emp ON emp.dept_id=dept.id; 微信图片_20220525134300.png使用右外连接查询 SELECT * FROM dept RIGHT OUTER JOIN emp ON emp.dept_id=dept.id;

微信图片_20220525134305.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
关系型数据库 MySQL Java
centos7安装mysql教程及Navicat平替软件
【8月更文挑战第17天】本教程详述CentOS 7上安装MySQL的过程。首先确保移除任何预装的MySQL组件,然后通过wget获取并安装MySQL的YUM源。可以选择安装特定版本如5.7或8.0。安装MySQL服务器后,启动服务并查找初始密码。登录MySQL后应立即更改密码,并可根据需要设置远程访问权限。此外,还推荐使用免费开源的DBeaver作为数据库管理工具,提供了安装步骤以方便管理和操作MySQL数据库。
147 3
|
21天前
|
存储 SQL 关系型数据库
【入门级教程】MySQL:从零开始的数据库之旅
本教程面向零基础用户,采用通俗易懂的语言和丰富的示例,帮助你快速掌握MySQL的基础知识和操作技巧。内容涵盖SQL语言基础(SELECT、INSERT、UPDATE、DELETE等常用语句)、使用索引提高查询效率、存储过程等。适合学生、开发者及数据库爱好者。
35 0
【入门级教程】MySQL:从零开始的数据库之旅
|
1月前
|
tengine 关系型数据库 MySQL
Tengine、Nginx安装MySQL数据库命令教程
本指南详细介绍了在Linux系统上安装与配置MySQL数据库的步骤。首先通过下载并安装MySQL社区版本,接着启动MySQL服务,使用`systemctl start mysqld.service`命令。若启动失败,可尝试使用`sudo /etc/init.d/mysqld start`。利用`systemctl status mysqld.service`检查MySQL的服务状态,确保其处于运行中。通过日志文件获取初始密码,使用该密码登录数据库,并按要求更改初始密码以增强安全性。随后创建一个名为`tengine`的数据库,最后验证数据库创建是否成功以及完成整个设置流程。
|
3月前
|
SQL 关系型数据库 MySQL
PHP与MySQL交互之基础教程
【8月更文挑战第31天】 在数字世界中,数据是推动一切的核心力量。本文将引导你探索PHP与MySQL的协同工作,通过实际代码示例,展示如何建立连接、执行查询以及处理结果集。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你提供宝贵的实践知识。
|
3月前
|
关系型数据库 MySQL 网络安全
MySQL主从复制详细教程
配置MySQL的主从复制是一个细致的过程,需要仔细遵循上述步骤进行。一旦配置完成并运行正常,主从复制将大大提高数据库的可用性和读写性能。在操作过程中,务必保持谨慎,确保数据的一致性和安全性。
349 0
|
4月前
|
关系型数据库 MySQL Linux
Docker安装mysql详细教程, mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘(报错已解决)
Docker安装mysql详细教程, mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory) 已解决
|
4月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
286 3
|
4月前
|
存储 关系型数据库 MySQL
MySQL小白教程(进阶篇):数据管理与高级查询
MySQL小白教程(进阶篇):数据管理与高级查询
|
4月前
|
SQL 关系型数据库 MySQL
MySQL小白教程(进阶篇):深入理解SQL与数据管理
MySQL小白教程(进阶篇):深入理解SQL与数据管理
|
4月前
|
存储 关系型数据库 MySQL
MySQL小白教程:从入门到查询高手
MySQL小白教程:从入门到查询高手