MySQL基础

文章目录

      • SQL语句的分类
      • 数据库的相关操作
      • DDL
        • 表的创建
        • 删除表格
      • DML
      • DQL
        • 数据处理函数(单行处理函数)
        • 分组查询
        • 分组函数(聚合函数、多行处理函数)
        • distinct关键字
        • 连接查询
        • 子查询
        • 表的合并
        • limit的使用
        • SQL 执行顺序
      • 约束
      • 事务 transaction
        • 事务的隔离性
        • 索引(Index)
      • 视图
      • 数据库设计的三范式
      • 相关知识
      • 最后

SQL语句的分类

为了方便记忆,SQL语言分为以下几类:

  • DDL:数据定义语言,操作的是表格的结构(凡是create、drop、alter的都是DDL);
  • DQL:数据库查询语言(凡是带有select关键字的都是查询语言);
  • DML:数据操作语言,操作的是表中的数据(凡是对表中的数据进行增(insert)删(delete)改(update)的都是DML);
  • TCL:事务控制语言(包括事务提交commit、事务回滚rollback);
  • DCL:数据控制语言(例如授权grant、撤销权限revoke);

注意:SQL语句的特点——不见“;”不执行,";"表示结束;如果有要结束一条正在编写的语句,可以键入“\c”。
MySQL的命名规范:所有的标识符全部小写,单词之间使用下划线进行衔接。

数据库的相关操作

(MySQL中的命令不区分大小写;所有SQL语句以分号结尾)

  • 创建数据库:create database 数据库名;
  • 选择数据库:use database 数据库名;
  • 删除数据库:drop database 数据库名;
  • 其他
    • 查看数据库的版本号: select version();
    • 查看当前使用的数据库:select database();

DDL

表(table)是一种结构化文件,可以用来存储特定类型的数据,如用户信息,商品信息。数据库中以表格的形式表示数据的。
任何一张表都有行和列:

  • 行(row)被称为记录/数据;
  • 列(column)被称为字段,每个字段都有字段名、数据类型、约束等属性。

查看表的结构(不看数据):desc 表名

表的创建

语法:create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型);
表名:建议以t_或tab_开始,可读性强,见名知意。

MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值型:
MySQL基础_第1张图片日期和时间类型:
MySQL基础_第2张图片
字符串类型
MySQL基础_第3张图片常用数据类型:

  • varchar:最长255,可变长度的字符串,比较只能,节省空间,会根据实际的数据长度动态分配空间。
  • char:最长255,定长字符串,不管实际的数据长度是多少,分配固定长度的空间去存储数据,使用不恰当的时候,可能会导致空间的浪费。
  • int:数字中的整数型,等同于java的int。
  • bigint:数字中的长整型,等同于java中的long。
  • float:单精度浮点型数据。
  • double:双精度浮点型数据。
  • date:短日期类型。
  • datetime:长日期类型。
  • clob:字符大对象,最多可以存储4G的字符串,超过255个字符的都要采用该类型存储
  • blob:二进制大对象,专门用来存储图片、声音、视频等流媒体数据。向blob类型的字段上插入数据的时候,需要使用I/O流。

创建表格举例:
MySQL基础_第4张图片
创建表格并设置默认值:
MySQL基础_第5张图片
快速复制表格:

  • create table 新建表格名称 as select * from 表1;表示把表1的所有数据复制到新建表格中
  • create table 新建表格名称 as select 列1, 列2 from 表1; 表示把表1中的列1和列2复制到新建表格中
删除表格

语法格式:

  • drop table 表名; //当这张表不存在的时候会报错。
  • drop table if exists 表名; //如果表存在时,进行删除操作,提高健壮性。

DML

insert语句
语法格式:
MySQL基础_第6张图片
注意:insert语句但凡是执行成功了,那么必然会多一条记录;如果没有给其他字段指定值的话,默认时null;insert中的字段名可以省略,表示默认写上了省略字段,因此需要将对应的值都写上。

插入多条记录:

  • insert 表名 (列1, 列2, ……) values (值1, 值2, ……), (值1, 值2, ……),(值1, 值2, ……);每条数据之间通过逗号分隔。

插入日期:

  • str_to_date:将字符串varchar类型转换成date类型,通常使用在数据插入操作,默认转换的日期格式为:‘%Y-%m-%d’;
  • date_format:将ate类型转换成具有一定格式的varchar类型,通常使用在日期查询操作,默认格式:‘%Y-%m-%d’。

MySQL基础_第7张图片查询日期的时候通过date_format指定展示日期的格式:
MySQL基础_第8张图片
当没有显示格式转换时,当显示日期格式的数据时,会自动将数据库中的date类型转换成varchar类型,并且采用默认格式:
MySQL基础_第9张图片
date:短日期,只包括年月日信息;
datetime:长日期,包括年月日时分秒信息,MySQL默认长日期是:%Y-%-m-%d %h:%i:%s。
在MySQL中,通过now()获取当前时间,并且获取的时间带有时分秒信息,属于datetime类型的。

update语句
语法格式:
MySQL基础_第10张图片注意:没有条件限制时,会导致所有数据全部更新。
举例:这里只修改id=2的数据的name和birth值。
MySQL基础_第11张图片

delete语句
语法格式:
MySQL基础_第12张图片
注意:没有条件时,整张表的数据会全被删除。
delete删除数据——逻辑删除,物理未删除,分配给数据的物理空间没有被回收,可以通过事务回滚进行恢复。
truncate删除数据——物理删除,删除效率高,但不支持回滚。
快速删除表中的数据:

  • truncate table 表名; 删除的是表中的所有数据(不能单独删除某一条数据),并不是删除表格,表的结构还在。(属于DDL操作)
    使用场景:当需要删除有上亿条记录的大表时,可以使用truncate进行删除,但无法进行数据恢复,要谨慎使用。

DQL

简单查询:
1、select 字段名 from 表名;
若要查询多个字段,字段之间以逗号分隔;若要查询所有字段,则用"*“表示字段名,但这也意味着在执行语句时,需要将”*"号转换为对应的字段名,因此效率低且可读性差,所以在实际开发中并不建议这样写。
2、给查询列起别名:select 字段名 as 别名 from 表名;
所以查询后的结果的字段名变为as后的别名,注意,这只是将显示的结果的列名显示为别名,并未改变表中的字段名。ps: 也可以将as去掉,用空格 代替,即与 select 字段名 别名 from 表名; 等效,若别名中包含空格,则将别名通过单引号\双引号进行包裹。
注意:在所有的数据中,字符串统一用单引号包括起来,单引号是标准,双引号在oracle数据库中用不了,但在mysql中可以使用。
3、列参与数学运算:select 字段名1, 字段名2 数学运算 from 表名;
以上的语句表示对字段2进行数学运算,举例:
MySQL基础_第13张图片
条件查询
条件查询是指查询符合条件的数据。
语法格式:select 字段 from 表名 where 条件;
条件是数字时:
MySQL基础_第14张图片

条件是文本时:
MySQL基础_第15张图片

  • 数字也可以用’<>'表示不等于。
  • 判断某个字段是否为空(数据库中的null表示什么也没有,不能用等号衡量): select 字段名 where 字段名 is null;
  • 多个条件并列,用以下关键字连接:or(或者)、and(并且),注意:and的优先级比or高,例如:select * from 表名 where 条件A and 条件B or 条件C; 该语句会先判断 “条件A and 条件B”,再将得到的结果和条件C判断,如:MySQL基础_第16张图片
    因此,要筛选出工资大于2500并且部门编号是10或20的员工信息的语句为:MySQL基础_第17张图片
  • like称为模糊查询,支持%或下划线匹配(%匹配任意个字符,一个下划线只匹配一个字符),举例:select * from 表名 where name like ‘%b%’; 表示查询名字中带有b的员工;select * from 表名 where name like ‘_b%’; 表示查询名字中第二个字母是b的员工;找出名字中带有下划线的员工:select * from 表名 where name like ‘%\_%’;通过转义符号’\'对下划线进行转义。

排序
MySQL基础_第18张图片

  • 如果采用order by子句,order by后面跟上排序字段,排序字段可以放多个,字段之间采用逗号间隔;
  • order by 默认采用升序(asc),在字段名后面加上desc关键字,实现降序
  • 如果存在where子句,那么order by必须放到where语句的后面;

举例:

  • select * from emp order by asl desc;根据员工工资降序排列的结果
  • select * from emp order by asl, name; 根据员工升序排列,如果工资一样时,按照名字升序排。等效写法——select * from emp order by asl asc, name asc; 前面的字段起主导作用,只有当前面的字段值相同的时候,才按照后面的字段排序。
  • 根据字段的位置实现排序:select ename, sal from emp order by 2; 其中2表示第2列。
  • select ename, sal from emp where sal between 1250 and 3000 order by sal desc; 与where结合使用,找出薪资在1250到3000之间的员工,并按照薪资进行降序排列,注意:排序在最后执行。
数据处理函数(单行处理函数)

单行处理函数的特点:一个输入对应一个输出。
常见的单行函数:

  • lower:转换小写,例如:seletc lower(ename) as ename from emp;
  • upper:转换大写
  • substr:取子串(使用方式:substr(被截取的字符串,起始下标,截取的长度)),注意起始下标从1开始,,没有0。
  • length:取长度
  • trim:去空格
  • str_to_date:将字符串转换为日期
  • date_format:格式化日期
  • format:设置千分位
  • round:四舍五入
  • rand:生成随机数
  • ifnull:可将null转换成一个具体值。(在所有数据库中,只要有null参与的数学运算,最终结果都是null。)用法:ifnull(字段,具体值),如果字段中的值为null的时候,将其替换成设定的具体值
  • concat:字符串拼接
  • case … when … then … when … then … else end:注意,这个操作不修改数据库,只是对应的显示值进行对应的操作。举例:
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/e35a4f33282449959e7cd1c53ccc4042.png
分组查询

在实际应用中,可能需要先分组,然后对每一组的数据进行操作,这是我们需要用到分组查询。
格式:select … from … group by …
注意:在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组的函数。其他一律不能跟。
举例1:找出每个工作岗位的工资和(思路:按照工作岗位分组,然后对工资求和)
MySQL基础_第19张图片
举例2:找出每个部门最高薪资(思路:按照部门分组,然后找出最高薪资)
MySQL基础_第20张图片
举例3:找出每个部门,不同岗位的最高薪资(思路:按照部门分组,然后按照岗位分组【两个字段联合分组】,找出最高薪资)
MySQL基础_第21张图片
举例4:找出每个部门最高薪资,要求显示最高薪资大于3000的数据。(使用having可以对分完组之后的数据进一步过滤,注意:having必须和group by联合使用,不能代替where)
MySQL基础_第22张图片
以上的方式是先根据部门编号进行分组,然后获取最高工资大于3000的数据,这样的效率较低。方式二:先筛选出工资大于3000的数据,然后对其按照部门编号进行分组:
MySQL基础_第23张图片
优化策略:where和having优先选择where,当where完成不了时,再选择having。
举例5:找出每个部门平均薪资,要求显示平均薪资高于2500的数据(这个案例就不能先使用where先筛选再分组,必须使用having):
在这里插入图片描述

分组函数(聚合函数、多行处理函数)

多行处理函数:多个输入一个输出。
常用多行处理函数:

  • count(具体字段):取得记录数,统计该字段下所有不为null的元素的总和(总行数)。
  • sum:求和,统计该字段下所有不为null的元素值的和。
  • avg:取平均值。
  • max:取最大的数。
  • min:取最小的数。

注意:分组函数在使用的时候必须进行分组,然后才能使用,如果没有对数据进行分组,整张表默认为一组;分组函数会自动会略控制,不需要手动的加where条件排除控制;分组函数不能直接使用在where子句中(根据SQL语句的执行顺序,见SQL 执行顺序,where执行时并未分组,但分组函数必须在分组后使用,因此这样写会报错);所有的分组函数可以组合起来一起使用,如:
MySQL基础_第24张图片

distinct关键字

distinct:去重关键字,只能出现在所有字段的最前方。
MySQL基础_第25张图片
去掉查询结果的重复记录,不会改变数据库原有数据。
举例:
MySQL基础_第26张图片
MySQL基础_第27张图片

连接查询

从一张表中单独查询,称为单表查询;多张表联合起来查询数据,被称为连接查询。
根据连接方式分类:

  • 内连接:特点——完成能够匹配上这个条件的数据查询出来,连接的表之间没有主次关系。
    • 等值连接
    • 非等值连接
    • 自连接
  • 外连接:在外连接中,两张表连接具有主次关系。
    • 左外连接(左连接)
    • 右外连接(右连接):表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。
  • 全连接:(很少用)

笛卡尔积现象:当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数是两张表条数的乘积。
避免笛卡尔积现象:连接时加条件,满足条件的记录被筛选出来,但匹配的次数并未减少。
举例:
MySQL基础_第28张图片
表的连接语法:
MySQL基础_第29张图片(内连接的inner可以省略)

举例1:等值连接
MySQL基础_第30张图片举例2:非等值连接
MySQL基础_第31张图片举例3:自连接
技巧:把一张表看成两张表。
MySQL基础_第32张图片
举例4:外连接
MySQL基础_第33张图片
举例5:外连接和内连接的区别
MySQL基础_第34张图片举例6:多张表进行连接
语法:
MySQL基础_第35张图片
MySQL基础_第36张图片
MySQL基础_第37张图片

子查询

子查询:select语句中嵌套select语句,被嵌套的select语句被称为子查询。
子查询的使用:select … (select) from … (select) where … (select)
where子句中的子查询:
MySQL基础_第38张图片from子句中的子查询(from后面的子查询可以将子查询的查询结果当成一张临时表):
MySQL基础_第39张图片
select子句中的子查询(了解):
MySQL基础_第40张图片MySQL基础_第41张图片

表的合并

MySQL基础_第42张图片举例:
MySQL基础_第43张图片
图片中展示了三种实现方式,其中union的查询效率更高,对于表连接来说,每连接一次新表,连接的次数满足笛卡尔积;但是union可以减少匹配的次数,在减少匹配次数的情况下,还可以完成两个结果集的拼接()。
MySQL基础_第44张图片
MySQL基础_第45张图片

limit的使用

limit:将查询结果集的一部分提取出来,通常使用在分页查询当中。
分页的作用:提高用户体验。
limit的用法:

  • 完整用法:limit startIndex, length
    • startIndex是起始下标,默认时从0开始,length是长度。
  • 缺省用法:limit length
    • 表示取前length中执行
      MySQL基础_第46张图片
      在这里插入图片描述
      分页:
      MySQL基础_第47张图片
SQL 执行顺序

以下的关键字顺序不能颠倒:
select 计算 from 表名 left join 表名2 on 条件 group by 列 having 条件 order by 列 union 第二个SQL
执行顺序为:

  1. from和joins
  2. where
  3. group by
  4. having
  5. select
  6. order by
  7. limit/offset
  8. union

约束

约束:在创建表的时候可以给表中的字段添加一些约束,这些约束可以保证表中的数据有效
分类:

  • 非空约束:not null——字段不能为null

  • 唯一性约束:unique——约束的字段值不能重复,但可以为null

  • 主键约束:primary key(简称PK)——主键值是每一行记录的唯一标识,类似于每个人的身份证号,用于标识不同的记录。任何一张表都应该有主键,没有主键的表无效;一张表主键约束只有一个;主键值建议使用int、bigint、char等类型,主键值一般都是定长的,所以不建议使用varchar类型的数据作左键。

    • 主键的特征: 值不为,也不能重复
    • 分类:自然主键——主键值是一个自然数,和业务没关系;业务主键——主键值和业务紧密关联。在实际开发中,自然主键使用比较多,主键只要做到不重复就行,不需要有意义,因为当业务发生变动的时候,可能会影响到主键值。
    • 在mysql中,可以通过自增机制,帮助我们自动维护主键值:
      MySQL基础_第48张图片
  • 外键约束:foreign key(简称FK)—— 外键约束是不同表的字段值的约束。若表A中的字段a被表B中对应的字段b约束,那么a中的值必须是b中的其中之一,此时表A中被约束的字段a称为外键字段,且表A和表B为父子关系,即表B为父表,表A为子表。在表A中,外键值可以为null。表B中,被作为A的外键约束字段b不一定是主键,但至少具有unique约束。需注意:

    • 创建表的顺序,先创建父,再创建子;
    • 删除表的顺序:先删子,再删父;
    • 删除数据的顺序:先删除父,再删除子。
  • 检查约束:check(mysql不支持,oracle支持)

not null举例:
MySQL基础_第49张图片
unique举例:
针对某一个字段要求具有唯一性:
MySQL基础_第50张图片
针对多个字段的联合起来具有唯一性:
MySQL基础_第51张图片
tips: 约束直接添加到每列字段名后面的称为列级约束;像上图添加约束的方式称为表级约束,当需要对多个字段进行联合约束时,就需要使用表级约束(not null 只支持列级约束)。
在mysql中如果一个字段同时被not null和ubique约束时,则该字段自动变成主键字段;在oracle中不一样!
primary key举例:
单一主键:
MySQL基础_第52张图片
复合主键:
MySQL基础_第53张图片
注意:在实际开发中,不建议使用复合主键,建议使用单一主键。
foreign key举例:
MySQL基础_第54张图片

事务 transaction

事务是指一个完整的业务逻辑,是最小的工作单元,不可再分。只有DML语句(insert/delete/update)和事务有关系,只有这三个语句对数据库中的数据进行操作,其他语句和事务无关。
事务的本质:事务就是多条DML语句同时成功,或者同时失败。
如何实现批量DML语句同时成功或是失败:

  • InnoDB存储引擎:提供一组用来记录事务性活动的日志文件。
  • 在事务的执行过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中。
  • 提交事务(commit;):清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。提交事务标志着,事务的结束,并且是一种全部成功的结束。
  • 回滚事务(rollback;):将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件。回滚事务标志着,事务的结束,并且是一种全部失败的结束。(每次回滚只能回滚到上次的提交点)

mysql中的默认事务行为:默认支持自动提交——每执行一次DML语句自动提交事务。这种自动提交的机制不符合开发习惯,因为一个业务通常需要多条DML语句共同执行才能完成,为了保证数据的安全,必须要求同时成功之后再提交。避免默认提交事务机制:

  • 在执行DML语句之前先执行 start transaction;(执行后,每执行一次DML语句,不会默认提交事务)

事务特性

  • 原子性(A):事务是最小的工作单元,不可再分。
  • 一致性©:在同一个事物中,所有的操作必须同时成功,或者同时失败,以保证数据的一致性。
  • 隔离性(I):事务A和事务B之间具有一定的隔离。
  • 持久性(D):事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上。
事务的隔离性

隔离级别:

  • 读未提交:read uncommitted(最低的隔离级别)【提交之前可读】——事务A可以读取到事务B未提交的数据。这种隔离级别存在的问题是:脏读现象(Dirty Read),读到脏数据。这种隔离级别一般都是理论上的,大多数隔离级别都是二挡起步。
  • 读已提交:read committed【提交之后可读】——事务A可以读取到事务B提交的数据,解决了脏读现象,存在不可重复读取数据的问题(事务开启之后,读取的数据是3条,当事务还没有结束,可能第二次读到的数据是4条,3不能与4,称为不可重复读取)。这种隔离下,每次读到的数据是绝对的真实。read committed是oracle数据库默认的隔离级别。
  • 可重复读:repeatable read【提交之后也不可读,永远读取的都是刚开启事务时数据-】——事务A开启之后,不管是多久,每一次在事务A中读到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变。 可重复读解决了不可重复读的问题,但可能会出现幻影读(每次读取的数据不一定真实)。repeatable read是mysql数据库默认的隔离级别。
  • 序列化/串行化:serializable(最高的隔离级别),效率最低,解决了所有问题。这种隔离级别表示事物排队,不能并发。

事务的相关操作:

  • 查看隔离类别:select @@tx_isolation;
  • 设置隔离类别:set global transaction isolation level read uncommitted;(设置全局隔离类别为无未提交)
索引(Index)

索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。一张表的一个字段可以添加一个索引,多个字段联合起来也可以添加索引。
作用:
MySQL基础_第55张图片在mysql数据库中,索引是需要排序的(这样才能缩小范围查找),并且这个排序和TreeSet数据结构相同。TreeSet(TreeMap)底层是一个自平衡的二叉树。在musql当中索引是一个B-Tree数据结构,遵循左小右大原则存放,采用中序遍历获取数据。
Tips:

  • 在任何数据库中主键上都会自动添加索引对象。另外,在mysql中,一个字段如果有unique约束的话,也会自动创建索引对象。
  • 在任何数据库中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。
  • 在mysql中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MYISAM存储引擎中,索引存储在一个.MYI文件中。在InnoDB存储引擎中,索引存储在一个逻辑名称叫做tablespace的当中。在MEMORY存储引擎当中,索引被存储在内存当中。不管索引存储在哪里,索引在mysql中都是一个树的形式存在(自平衡二叉树:B-Tree)。
    添加索引的条件:
  • 数据量庞大(根据硬件环境进行测试);
  • 该字段经常出现在where后面以条件的形式存在,也就是该字段总是被扫描;
  • 该字段很少DML(insert,delete,update)操作。(因为DML之后,索引需要重新排序);
  • 建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。建议通过主键查询或是通过unique约束的字段进行查询,效率是比较高的。

索引的创建和删除

  • 创建索引:create index 索引名in on 表名A(字段名a);——给表A的字段a上添加索引,起名为索引名in。
  • 删除索引:drop index 索引名in on 表名A;——删除表A中索引名in的索引。

在mysql中查看一个sql语句是否用了索引进行检索:explain sql语句;
例如:
MySQL基础_第56张图片
索引失效的情况:

  • select * from emp where ename like ‘%T’; 模糊匹配中以‘‘%’’开头,尽量避免模糊查询的时候以‘‘%’’开头。
  • 使用or的时候,如果使用or两边的条件字段都有索引时,才会使用索引;如果其中一个字段没有索引,则另一个字段的索引也会失效,因此建议少使用or。
  • 使用复合索引的时候,没有使用左侧的列查找,索引失效。(复合索引——两个或更多的字段联合起来添加一个索引)
    MySQL基础_第57张图片
  • 在where当中索引列参加了运算,索引失效:
    MySQL基础_第58张图片
  • 在where当中使用了函数,例如:select * from emp where lower(ename)='smith ;
  • 其他

索引的分类:单一索引,复合索引,主键索引,唯一性索引……

视图

视图view:站在不同的角度去看待同一份数据。
特点:可以面向视图对象进行增删改查,对视图对象的操作会导致原表被操作。
作用:简化sql语句

  • 创建视图对象:create view 视图名v as select * from 表名t; 把查询结果以视图的形式展示出来。
  • 删除视图对象:drop view 视图名v;
  • 注意:只有DQL语句才能以view的形式创建;等视图创建完成以后,可以对视图对象进行增、删、改、查(又叫CRUD)等操作。(Create/Retrive/Update/Delete)
    创建/删除视图举例:
    在这里插入图片描述
    对视图进行数据操作:
    MySQL基础_第59张图片
    作用:
    MySQL基础_第60张图片
    注意:视图对象在数据库中以文件的形式存在,存储在硬盘上;使用视图的时候也可以像使用table一样。

数据库设计的三范式

数据库设计范式:是数据库设计的依据。

  • 第一范式:任何一张表必须有主键,保证每一个字段的原子不可再分性。
  • 第二范式:建立在第一范式的基础上,要求所有非主键字段完全依赖主键,不要产生部分依赖;
  • 第三范式:建立在第二范式的基础上,要求所有非主键字段直接依赖主键,不要产生传递依赖。

设计数据库表的时候,按照以上的范式进行,可以避免表中的数据的冗余、空间的浪费。
第一范式
第一范式是最核心、最重要的范式,所有表的设计都需要满足。
MySQL基础_第61张图片
第二范式
MySQL基础_第62张图片
多对多关系设计表:多对多,三张表,关系表两个外键。

第三范式
MySQL基础_第63张图片
一对多关系设计表:一对多,两张表,多的表加外键。

补充:

一对一关系设计表:一对一,外键唯一。
MySQL基础_第64张图片
最后:数据库设计三范式是理论上的,时间和理论有时候有偏差。最终的目的是为了满足客户的需求,有时候会拿冗余换执行速度。因为在sql当中,表和表之间连接的次数越多,效率越低(笛卡尔积)。有些时候可能会存在冗余,但是为了减少表的连接次数,这样做也是合理的,并且对开发人员来说,sql语句的编写难度也会下降。

相关知识

  • xxx.sql格式的文件被称为sql脚本文件,该文件中编写的是sql语句。我们执行sql脚本文件的时候,该文件的所有sql语句都会执行;在批量执行sql语句时,可以使用sql脚本文件。
    • 执行方式:source 绝对路径\xxx.sql;
  • 对一张表来说,只要有主键或加有unique约束的字段,会自动创建索引。

最后

学习视频:B站-老杜带你学
练习网站:练习

你可能感兴趣的:(mysql,数据库)