Skip to content

❤ 基础概念

mermaid
graph LR
	a[DBS 数据库系统]--有n个-->b[数据库]--有n个-->c[二维表]
	a--有-->d[DBMS 数据库管理系统(MySQL,PostgreSQL,Oracle)]

[!quote] SQL 语句 SQL 语句分为

  • DDL
  • DML
  • DQL
  • DCL

书写格式

  • SQL 语句可以单行/多行书写,以 分号; 结尾
  • SQL 语句不区分大小写,但是关键字建议大写
  • 注释
    • 单行注释:--#
    • 多行注释:/* */

❤ MySQL 体系结构

  • 连接层:接收客户端连接;处理连接;认证授权
  • 服务层
    • SQL 接口:DML;DDL;存储过程;视图;函数
    • 解析器
    • 查询优化器
    • 缓存
  • 引擎层默认为 InnoDB】:真正负责 MySQL 中数据的读取和存储
    • 索引意味着不同的存储引擎,索引的结构不同
  • 存储层:存储相关数据【日志,查询日志 ……

❤ 数据类型

[!hint] 会有相同的数据类型在不同的 DBMS 中有不同的名称,对此我们毫无办法,你只能记住这个差异

[!hint] 数值要设置为什么类型 ?

  • 如果数值用于计算,那应该存储为数值类型
  • 如果数值作为字符串使用,则应该存储为字符串【电话号码,邮政编码 ……】

💛 数值

💙 整数类型

数值类型大小有符号范围【默认】无符号范围
TINYINT1 字节-128 到 1270 到 255
SMALLINT2 字节-32,768 到 32,7670 到 65,535
MEDIUMINT3 字节-8,388,608 到 8,388,6070 到 16,777,215
INT4 字节-2,147,483,648 到 2,147,483,6470 到 4,294,967,295
BIGINT8 字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,8070 到 18,446,744,073,709,551,615

从上到下为:小整数 --->大整数

💙 浮点数类型

数值类型大小有符号范围无符号范围
FLOAT4 字节-3.402823466E+38 到 -1.175494351E-38,
0 和 1.175494351E-38 到 3.402823466E+38
-3.402823466E+38 到 -1.175494351E-38、0 和 1.175494351E-38 到 3.402823466E+38
DOUBLE8 字节-1.7976931348623157E+308 到 -2.2250738585072014E-308、0 和 2.2250738585072014E-308 到 1.7976931348623157E+308-1.7976931348623157E+308 到 -2.2250738585072014E-308、0 和 2.2250738585072014E-308 到 1.7976931348623157E+308
DECIMAL可变长度依赖于指定的精度和范围依赖于指定的精度和范围

从上到下为:单精度浮点数,双精度浮点数,精确定点数【避免精度损失】

💛 字符串

  • CHAR:定长字符串。范围为 0 到 255 字符。性能比 varchar 好

    • 比如 char(10),表示最多存 10 个字符,不足 10 个字符,也占用 10 个字符的空间
  • VARCHAR:变长字符串。范围为 0 到 65,535 字符

    • varchar(10),表示最多存 10 个字符,不足 10 个字符,会按照实际长度存储
  • TINYTEXT:可变长度字符串。范围为 0 到 255 字节

  • TEXT:可变长度字符串。范围为 0 到 65,535 字节

  • MEDIUMTEXT:可变长度字符串。范围为 0 到 16,777,215 字节

  • LONGTEXT:可变长度字符串。范围为 0 到 4,294,967,295 字节

  • BINARY:固定长度二进制字符串。范围为 0 到 255 字节

  • VARBINARY:可变长度二进制字符串。范围为 0 到 65,535 字节

  • TINYBLOB:可变长度二进制字符串,范围为 0 到 255 字节。可用于存储视频,音频

  • BLOB:可变长度二进制字符串。范围为 0 到 65,535 字节

  • MEDIUMBLOB:可变长度二进制字符串。范围为 0 到 16,777,215 字节

  • LONGBLOB:可变长度二进制字符串。范围为 0 到 4,294,967,295 字节

  • ENUM 枚举类型,存储从预定义值列表中选择的一个字符串。可根据枚举值的数量进行大小和范围的计算

  • SET 集合类型,存储从预定义值列表中选择的一个或多个字符串。可根据集合值的数量进行大小和范围的计算

  • JSON 存储 JSON 格式的数据,最大长度为 4,294,967,295 字符

💛 日期时间

  • DATE 表示日期
    • 格式为 'YYYY-MM-DD'
    • 范围从 '1000-01-01' 到 '9999-12-31'
  • TIME 表示时间
    • 格式为 'HH:MM:SS'
    • 范围从 '-838:59:59' 到 '838:59:59'
  • DATETIME 表示日期和时间,范围比较广,适合存储历史时间,可读性强
    • 格式为 'YYYY-MM-DD HH:MM:SS'
    • 范围从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'
  • TIMESTAMP 是一个时间戳,是一串数字,表示日期和时间
    • 格式为 'YYYY-MM-DD HH:MM:SS'
    • 范围从 '1970-01-01 00:00:01' 到 '2038-01-19 03:14:07'
  • YEAR 表示年份
    • 格式为 'YYYY'
    • 范围从 1901 到 2155

[!hint] 常用的 create_time 字段和 update_time 字段

  • 设置默认值为当前时间 create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
  • 设置默认值为当前时间,并且每次插入都会修改时间为当前时间 update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'

❤ 修改配置的作用范围

  • SET GLOBAL 修改后配置在当前会话和所有新的连接中都有效,但是在 MySQL 服务重启后会恢复默认值
  • SET SESSION: 修改后配置只在当前会话有效,其他会话和新的连接不会受到影响
  • 修改配置文件 通过编辑配置文件【my.cnf / my.ini】,修改后配置在所有会话和新的连接都有效,并且在 MySQL 服务重启后仍然保持设置

❤️ 范式

[!quote] 数据库的范式 数据库的范式 是为了减少数据冗余和避免数据更新异常而对数据库表进行设计的一种规范

第一范式 1NF :表中的每一列必须包含原子值,即每个字段值必须是不可再分的基本数据单位,我觉得真没必要

第二范式 2NF :必须满足第一范式,并且所有非主键字段必须完全依赖于主键(也就是说如果主键是复合主键,则必须依赖于整个复合主键

第三范式 3NF :必须满足第二范式,并且表中没有非主键字段依赖于其他非主键字段

第四范式 4NF :消除多值依赖带来的数据冗余问题

第五范式 5NF :必须满足第四范式,并且将表拆分的尽可能的细,消除任何冗余数据