IT评测·应用市场-qidao123.com

标题: MySQL1(初始数据库 概念 DDL建库建表 数据库的三大范式 表约束) [打印本页]

作者: 守听    时间: 2024-8-30 07:20
标题: MySQL1(初始数据库 概念 DDL建库建表 数据库的三大范式 表约束)
目录

一、初始数据库
二、概念 
三、DDL建库建表 
1. 数据库布局
2. SQL语句分类
3. DDL语句操作数据库 
注释:
查看数据库:
​编辑创建数据库:
删除数据库:
选择数据库:
4. 数据库表的字段类型
4.1 字符串类型
4.2 数值类型
4.3 日期和时间类型
4.4 NULL类型
5. DDL操作数据库表
6. 数据库表的字段注释
查询创建的数据库布局
7. 数据库存储引擎(⭐) 
7.1 数据库存储引擎-InnoDB
7.2 数据库存储引擎-MyISAM 
7.3 区别(⭐)
8. 修改和删除数据库
修改表名:
添加字段:
删除字段:
修改字段:
删除表:
四、数据库的三大范式 
1. 什么是范式
2. 约束作用
3. 三范式
4. 第一范式(1NF)
5. 第二范式(2NF)
6. 第三范式(3NF)
7. 总结 
五、表约束
1. 概念
2. 约束作用
3. 约束种类
4. 非空约束
5. 唯一约束
6. 主键约束(primary key)PK
复合主键(表级界说)
分类
7. 外键约束(foreign key)FK
分类
8. 约束的添加和删除
添加 
删除


一、初始数据库

   
   
  二、概念 

   数据库( Database ,简称 DB )长期存放在计算机内,有组织、可共享的大量数据的集合,是一个 数据“仓库”。(mysql单表2000w)
  作用:存放、管理数据
  分类:关系型数据库、NoSQL数据库。
  

  MySQL特点:
  
  三、DDL建库建表 

1. 数据库布局

   
  

  2. SQL语句分类

           SQL语句,即布局化查询语言(Structured Query Language),是一种特别目的的编程语言,是一种数据库查询和步伐设计语言,用于存取数据以及查询、更新和管理关系数据库体系,同时也是数据库脚本文件的扩展名。
  名称英文全称解释常用下令
DDL

(数据界说语言)

Data Definition Language 用于界说和管理数据象,如数据库、表等布局
CREATE, DROP, ALTER
DML

(数据操作语言)

Data Manipulation Language用于对数据库中数据的增编削操作INSERT, UPDATE, DELETE
DQL

(数据查询语言)

Data Query Language用于从数据库中检索数据SELECT
DCL

(数据控制语言)

Data Control Language用于管理数据库权限和数据的事务控制GRANT, COMMIT, ROLLBACK  
  3. DDL语句操作数据库 

   注释:

  1. #单行注释
  2. -- 单行注释
  3. /*
  4. 多行
  5. 注释
  6. */
复制代码

  查看数据库:

  1.   #库的操作
  2. #查看所有的库名
  3. -- 所有的关键词一般都会变颜色
  4. -- sql 语句不区分大小写(关键词一般大写)
  5. -- 每一条sql都应该加一个分号结束
  6. show databases;
复制代码
创建数据库:


  1. -- 创建一个库(库名不要用中文,使用下划线进行单词分割)
  2. -- create  databases 库名;
  3. create database myschool;
复制代码
删除数据库:

  1. -- 删除库 (危险操作)
  2. -- drop database 库名;
  3. drop database myschool;
复制代码
选择数据库:

  1. -- 使用库
  2. use myschool;
复制代码
4. 数据库表的字段类型

4.1 字符串类型

   类型说明取值范围存储需求char(M)固定长度字符串,检索快但大概浪费空间0 <= M <= 255固定长度,M字节varchar(M)可变长度字符串M字符最多65535字节(对于MySQL较旧版本,新版本VARCHAR的最大长度提高至65535)tinytext微型文本字符串约等于2^8(256)个字符L + 1字节,L为字符数,最大长度255个字符text文本字符串约等于2^16(65536)个字符L + 3字节,L为字符数,理论上最大长度65535个字符mediumtext中等长度文本字符串约等于2^24(16777216)个字符L + 4字节,L为字符数,最大长度约16777215个字符longtext长文本字符串约等于2^32(4294967296)个字符L + 4字节,L为字符数,最大理论长度约4GB  char和varchar比较  类型特点空间上时间上适用场景CHAR(M)固定长度浪费存储空间服从高存储不大,速率要求高VARCHAR(M)可变长度节省存储空间服从低非CHAR的情况  4.2 数值类型

   类型说明取值范围存储需求TINYINT非常小的数据有符号: -2^7 ~ 2^7-1,无符号值:0~28-11 字节SMALLINT较小的数据有符号: -2^15 ~ 2^15-1,无符号值:0~2^16-12 字节MEDIUMINT中等巨细的数据有符号: -2^23 ~ 2^23-1,无符号值:0~2^24-13 字节INT标准整数有符号: -2^31 ~ 2^31-1,无符号值:0~2^32-14 字节BIGINT较大的整数有符号: -2^63 ~2^63-1,无符号值:0~2^64-18 字节FLOAT单精度浮点数±1.17549435e-384 字节DOUBLE双精度浮点数±2.2250738585072014e-3088 字节DECIMAL(钱)字符串形式的浮点数decimal(m,d)m 个字节  常考点:Mysql 关于 int(1) 和 int(11)?  
                  int (1)  在mysql 里面 是指 显示 长度  !!! int() 加数字 为显示规则 宽度  4.3 日期和时间类型

   类型说明取值范围存储需求DATEYYYY-MM-DD,日期格式1000-01-01~9999-12-31DATETIMEHh:mm:ss,时间格式-838:59:59~838:59:59TIMEDATETIMEYY-MM-DD hh:mm:ss1000-01-01 00:00:00 至 9999-12-31 23:59:59DATETIMETIMESTAMP【stamp】YYYMMDDhhmmss格式表示的时间戳197010101000000~2037年的某个时间TIMESTAMPYEARYYYY格式的年份值1901~2155YEAR         设置当前 创建时间,或者是更新时间时给TIMESTAMP或者DATETIME字段 设置 DEFAULT CURRENT_TIMESTAMP 添加当前默认时间  4.4 NULL类型

   
  5. DDL操作数据库表

   查看表:
  1. #表的操作
  2. -- 查看当前库的所有表
  3. show tables;
复制代码
创建表: 
  语法格式:
  1. CREATE   TABLE [ IF NOT EXISTS ] `表名`   (
  2. `字段名1` 字段类型 [ 属性]  [ 索引] [注释] ,
  3. `字段名2` 字段类型 [属性]  [索引] [注释] ,
  4. … …   
  5. `字段名n` 字段类型 [属性]  [ 索引] [注释]
  6. )  [ 表类型 ] [ 表字符集 ] ;
  7. 其中:
  8. “[]” 包含的内容可以省略;
  9. “`” 当前符号为反引号,用于区别MySQL保留字与普通字符而引入的。
复制代码
  1. -- 创建表
  2. create table 表名 (
  3.         -- 字段名不区分大小写,不能使用sql中的关键词
  4.         -- 字段名通过下划线进行单词分割
  5.         -- 不要超过255个字符
  6.         字段名 字段类型 字段的属性,
  7.         -- 数据类型: 字符串 (char,varchar | tinytext text)
  8.         -- char固定,varchar可变 括号内是其最大长度 如果写多直接报错
  9.         -- char(5) 一定要满足5个
  10.         -- varchar(5) 可变
  11.     -- 数值、日期、null
  12.         字段名 字段类型 字段的属性 ,...字段名 字段类型 字段的属性
  13. );
  14. create table student(
  15.         stu_name varchar(10),
  16.         stu_age tinyint,
  17.         stu_birthday datetime,
  18.         stu_score decimal(4,1)
  19. );
  20. -- 字符串的表现形式 '' ""
  21. create table teacher(
  22.         tname varchar(10) comment '老师姓名',
  23.         tsex varchar(2) comment "老师的性别"
  24. );
复制代码
6. 数据库表的字段注释

   语法格式:
  1. CREATE   TABLE [ IF NOT EXISTS ]    `表名`   (
  2. `字段名1`    字段类型 [ 属性]  [ 索引] [注释] ,
  3. `字段名2`    字段类型 [ 属性]  [ 索引] [注释] ,
  4. … …   
  5.        `字段名n`    字段类型 [ 属性]  [ 索引] [注释]
  6. )  [ 表类型] [ 表字符集] ;
复制代码
  1. -- 字符串的表现形式 '' ""
  2. create table teacher(
  3.         tname varchar(10) comment '老师姓名',
  4.         tsex varchar(2) comment "老师的性别"
  5. );
复制代码
注释:可以给字段增加注释,即给字段增加形貌,方便后续修改和维护字段。
  查询创建的数据库布局

   方式一:
  1. descirbe 表名
  2. 或 desc 表名
复制代码
  1. -- 如何查看表结构
  2. -- 1.方式
  3. desc student;
  4. desc teacher;
复制代码
方式二:
  1. show create table 表名
复制代码
  1. -- 2.方式
  2. show create table student;
  3. -- ` 反引号 -- 取消关键性
  4. -- DEFAULT NULL 默认null
  5. -- DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 字符集,排序集
  6. -- ENGINE=InnoDB 存储引擎
  7. student        CREATE TABLE `student` (
  8.   `stu_name` varchar(10) DEFAULT NULL,
  9.   `stu_age` tinyint(4) DEFAULT NULL,
  10.   `stu_birthday` datetime DEFAULT NULL,
  11.   `stu_score` decimal(4,1) DEFAULT NULL
  12. )
复制代码
7. 数据库存储引擎(⭐) 

  
  1. 查看当前数据库支持的存储引擎:
  2. show engines;
复制代码

  

  7.1 数据库存储引擎-InnoDB

   
  7.2 数据库存储引擎-MyISAM 

   
  7.3 区别(⭐)

   对比项MyISAMInnoDB外键不支持支持事务不支持支持行表锁表锁,即使操作一条记录也会锁住整个表,不适合高并发操作行锁,操作时只锁某一行,不对别的行有影响,适合高并发操作缓存只缓存索引,不缓存真实数据不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存巨细对性能有决定性的影响默认安装YY默认利用NY关注点性能:节省资源、消耗少、简单业务事务:并发写,事务、更大资源   两种存储引擎各有特点,当然你也可以在MySQL中,针对差别的数据表,可以选择差别的存储引擎。
  8. 修改和删除数据库

   

  
  修改表名:

  1. -- 修改表结构
  2. -- 修改表名
  3. -- alter table 旧表名 rename as 新表名;
  4. alter table student rename as xuesheng;
  5. show tables;
复制代码

  
  添加字段:

  1. -- 添加一个字段 ***
  2. -- alter table 表名 add 字段名 类型 属性;
  3. alter  table teacher add taddr varchar(200) comment '老师的住址';
  4. show create table teacher;
  5. 运行结果
  6. CREATE TABLE `teacher` (
  7.   `tname` varchar(10) DEFAULT NULL COMMENT '老师姓名',
  8.   `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  9.   `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
复制代码

  删除字段:

  1. -- 删除字段 (危险操作)
  2. -- alter table 表名 drop 字段名
  3. alter table xuesheng drop stu_age;
  4. show create table xuesheng;
  5. 原始结果
  6. CREATE TABLE `xuesheng` (
  7.   `stu_name` varchar(10) DEFAULT NULL,
  8.   `stu_age` tinyint(4) DEFAULT NULL,
  9.   `stu_birthday` datetime DEFAULT NULL,
  10.   `stu_score` decimal(4,1) DEFAULT NULL
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
  12. 删除后结果
  13. CREATE TABLE `xuesheng` (
  14.   `stu_name` varchar(10) DEFAULT NULL,
  15.   `stu_birthday` datetime DEFAULT NULL,
  16.   `stu_score` decimal(4,1) DEFAULT NULL
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
复制代码

  修改字段:

  方式一:
  1. -- 修改字段
  2. -- 覆盖式 默认值填进去
  3. -- 方式一
  4. -- alter table 表名 modify 字段名 要修改的类型 要修改的属性
  5. alter table teacher modify tname varchar(10) comment '姓名';
  6. -- 原始结果
  7. CREATE TABLE `teacher` (
  8.   `tname` varchar(10) DEFAULT NULL COMMENT '老师姓名',
  9.   `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  10.   `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
  12. --运行结果
  13. CREATE TABLE `teacher` (
  14.   `tname` varchar(10) DEFAULT NULL COMMENT '姓名',
  15.   `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  16.   `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
复制代码
  1. alter table teacher modify tname varchar(100);
  2. CREATE TABLE `teacher` (
  3.   `tname` varchar(100) DEFAULT NULL,
  4.   `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  5.   `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
复制代码
  1. alter table teacher modify tname float;
  2. CREATE TABLE `teacher` (
  3.   `tname` float DEFAULT NULL,
  4.   `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  5.   `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
复制代码
方式二:
  1. -- 方式二 可以改字段名
  2. -- alter table 表名 change 旧字段名 新字段名 要修改的类型 要修改的属性
  3. alter table teacher change tname xingming varchar(10) comment '老师的姓名';
  4. CREATE TABLE `teacher` (
  5.   `xingming` varchar(10) DEFAULT NULL COMMENT '老师的姓名',
  6.   `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  7.   `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
复制代码

  删除表:

  1. -- 删除表(删除表危险操作)
  2. drop table teacher;
  3. show tables;
复制代码

  四、数据库的三大范式 

1. 什么是范式

           为了建立冗余较小、布局公道的数据库,设计数据库时必须遵循一定的规则。 在关系型数据库中这种规则就叫做范式。        
  2. 约束作用

           数据库的设计范式是数据库设计所必要满意的规范,满意这些规范的数据库是简便的、结 构明了的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作非常。
  3. 三范式

   
  4. 第一范式(1NF)

   第一范式(1NF)确保每列保持原子性
  
  

  地址可再分 故继续拆表
  

  5. 第二范式(2NF)

   第二范式(2NF)属性完全依靠于主键
  
  
          每一行的数据只能与此中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
  

          一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。

  6. 第三范式(3NF)

   第三范式(3NF)属性不依靠于别的非主属性属性直接依靠于主键
          数据不能存在通报关系,即每个属性都跟主键有直接关系而不是间接关系。
  像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。
  比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话) 这样一个表布局,就存在上述关系。 学号--> 所在院校--> (院校地址,院校电话) 这样的表布局,我们应该拆开来,
  如下。 (学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)
  7. 总结 

           三大范式只是一般设计数据库的基本理念,可以建立冗余较小、布局公道的数据库。 假如有特别情况,当然要特别对待,数据库设计最紧张的是看需求跟性能,需求>性能>表结 构。所以不能一味的去寻求范式建立数据库
  五、表约束

1. 概念

   约束现实上就是表中数据的限制条件
  2. 约束作用

   表在设计的时间加入约束的目的就是为了包管表中的记录完备和有效 
  3. 约束种类

   
  4. 非空约束

   用not null约束的字段不能为null值,必须给定具体的数据
  
  1. # 约束
  2. -- 非空约束
  3. # 约束
  4. -- 非空约束
  5. create table tb1(
  6.         tname varchar(10),
  7.         tage int
  8. );
  9. create table tb2(
  10.         tname varchar(10) not null default '无名',
  11.         tage int
  12. );
  13. show create table tb2;
  14. tb2        CREATE TABLE `tb2` (
  15.   `tname` varchar(10) NOT NULL DEFAULT '无名',
  16.   `tage` int(11) DEFAULT NULL
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
复制代码
正常不写会添加失败 因为默以为null
  

  设置name字段默认值为无名
  

  5. 唯一约束

   unique约束的字段,具有唯一性,不可重复,但可以为null
  
  1. -- 唯一约束
  2. create table tb3(
  3.         tname  varchar(10) unique,
  4.         tage int
  5. );
复制代码
假如插入雷同的两个tname就会报错

  
 
  1. create table tb4(
  2.         tname  varchar(10) unique, -- 行级约束
  3.         tage int unique
  4. );
复制代码
假如tname tage 全部雷同 则添加失败
  

  null 不是值 是类型 故可以重复添加
  

  
  在建表的时间,单独的用unique(字段) 来设置字段的约束
  1. create table tb5(
  2.         tname  varchar(10),
  3.         tage int,
  4.         unique(tname,tage) -- 联合唯一约束 表级约束
  5. );
复制代码
联合约束,表示两个或以上的字段同时与另一条记录相等,则报错

  
  表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)
  1. create table tb6(
  2.         tname  varchar(10),
  3.         tage int,
  4.         constraint name_age_unique unique(tname,tage) -- 联合唯一约束 表级约束
  5. );
  6. constraint是约束关键字,name_age_unique自己取的名字
复制代码

  未修改的名字:
  

  
  6. 主键约束(primary key)PK

           主键(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录
          表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值
  主键约束与“not null unique”区别
  
  
  一张表应该有主键字段,假如没有,表示该表无效
  主键值:是当前行数据的唯一标识、是当前行数据的身份证号
  即使表中两行记录相关数据雷同,但由于主键值差别,所以也以为是两行差别的记录
  

  1. create table tb7(
  2.         tid int primary key,
  3.         tname  varchar(10),
  4.         tage int
  5. );
  6. create table tb8(
  7.         tid int primary key, -- 标识
  8.         tname  varchar(10) not null unique, -- 不能没有值,不能重复
  9.         tage int
  10. );
  11. -- B+tree 必须要有一个主键,树结构就是用主键构建的
  12. -- 主键用来构建InnoDB引擎结构,只能有且只有一个
复制代码

  

  复合主键(表级界说)

  在界说列名的时间设置主键
  1. create table tb9(
  2.         tid int,
  3.         tname  varchar(10),
  4.         tage int,
  5.         primary key(tid,tname,tage)
  6. );
复制代码

  在MySQL数据库提供了一个自增的数字,专门用来自动天生主键值,主键值不用用户维护,自动 天生,自增数从1开始,以1递增(auto_increment)
  1. -- 自增数值类型的主键,简单性,可用性(int bigint)
  2. create table tb10(
  3.         tid int primary key auto_increment,
  4.         tname  varchar(10),
  5.         tage int
  6. );
复制代码
  分类

   按主键约束的字段数量分类
          无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好 几个字段
  
  
  
  
7. 外键约束(foreign key)FK

           外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的划一性。 如有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键
  
  A为基本表或父标,主表,B为信息表,子表,副表
  1.   只能是表级定义 foreign key(表的字段名) references 父表表名(父表的字段名)
复制代码
某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值
  1. -- 外键
  2. create table A(
  3.         aid int primary key auto_increment,
  4.         aname varchar(10)
  5. );
  6. drop table B;
  7. create table B(
  8.         bid int primary key auto_increment,
  9.         bname varchar(10),
  10.         aid int,
  11.         foreign key(aid) references a(aid)
  12. );
复制代码
阿里巴巴规范
  【强制】不得利用外键与级联,一切外键概念必须在应用层办理。
  说明:以门生和成绩的关系为例,门生表中的student_id是主键,那么成绩表中的student_id 则为外键。假如更新门生表中的student_id,同时触发成绩表中的student_id更新,即为 级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻 塞,存在数据库更新风暴的风险;外键影响数据库的插入速率。
  分类

   按外键约束的字段数量分类
  
  注意:
  一张表可以有多个外键字段(与主键差别)
  外键值可以为null
  外键字段去引用一张表的某个字段的时间,被引用的字段必须具有unique约束
  有了外键引用之后,表分为父表和子表
                          班级表:父表
                          门生表:子表
  创建先创建父表
  删除先删除子表数据
  插入先插入父表数据
  8. 约束的添加和删除

添加 

  
  1. 添加非空约束
  2. alter table  表名  modify test_student char(10) not  null;
  3. 添加唯一约束
  4. alter table 表名 add unique(表字段名,字段,字段,字段);
  5. 添加主键约束
  6. alter table 表名 add primary key(表的字段名,字段,字段);
  7. 添加外键约束
  8. alter table 表名 add constraint N1 foreign key (表字段名) references 父表(父表字段名);
复制代码
删除

  
  1. 删除not null约束
  2. alter table 表名 modify 列名 类型;
  3. 删除unique约束
  4. alter table 表名 drop index 唯一约束名;
  5. 删除primary key约束
  6. alter table 表名 drop primary key;
  7. 删除foreign key约束
  8. alter table 表名 drop foreign key 外键名;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4