数据库、数据库服务器、数据库语言
数据库是一个长期持久存储在计算机内的有组织的、有共享的、统一管理的数据集合,由数据库服务器通过数据库语言来管理。
MySQL
是一种数据库服务器(数据库管理系统)
SQL
是一种数据库语言,是由数据库服务器处理的语句
关系型数据库
MySQL 是关系型数据库。
关系型数据库将数据存储在单独的表中,而不是将所有数据放在一个大的库房中。数据库结构被组织成针对速度优化的物理文件。 逻辑模型具有数据库,表,视图,行和列等对象。
表
在关系数据库中,数据库表是一系列二维数组的集合,用来存储数据和操作数据的逻辑结构。
行
横向的行被称为记录,是组织数据的单位
列
纵向的列被称为字段,每一列标记记录的一个属性,包含数据类型、数据宽度等描述信息
主键
用于唯一地标识表中的每一条记录。可以定义一列或多列为主键。主键列不能有相同的值,也不能有空值
外键
外键用来在两个表之间建立链接,可以是一列或多列。外键只能引用外表中的列的值或使用空值。
外键的作用:保持数据一致性,完整性,主要目的是控制存储在外键表中的数据,使两张表形成关联。
数据类型
整数类型
类型 | 描述 | 存储需求 | 有符号取值范围 | 无符号取值范围 |
---|---|---|---|---|
TINYINT(M) | 很小的整数 | 1个字节 | -2^7到2^7-1 | 0到2^8 |
SMALLINT(M) | 较小的整数 | 2个字节 | -2^15到2^15-1 | 0到2^16 |
MEDIUMINT(M) | 中等大小的整数 | 3个字节 | -2^23到2^23-1 | 0到2^24 |
INT(M) | 普通的整数 | 4个字节 | -2^31^31-1 | 0到2^32 |
BININT(M) | 超大的整数 | 8个字节 | -2^63到2^63-1 | 0到2^64 |
整数类型的 M
表示显示宽度,而非可以储存的整数位数,可以不指定由系统自动分配
小数类型
小数类型包括浮点型和定点型两种,它们都可以用类型名称后加 (M,D)
来表示,M
表示该值的总共长度,D
表示小数点后面的长度,M
和 D
又称为精度和标度
类型 | 描述 | 存储需求 |
---|---|---|
FLOAT(M,D) | 单精度浮点型 | 4个字节 |
DOUBLE(M,D) | 双精度浮点型 | 8个字节 |
DECIMAL(M,D) | 定点型 | M+2个字节 |
浮点型和定点型的比较
场景 | 浮点型 | 定点型 |
---|---|---|
保存的值与精度不一致时 | 四舍五入 | 四舍五入,同时会给出警告 |
不指定精度时 | 按照实际的精度来显示 | 默认为 (10,0) |
存储方式 | 底数和指数部分分别用二进制数存储 | 字符串 |
精度问题(运算结果丢失精度) | 会 | 不会 |
当精度要求比较高时(比如货币、科学数据等),采用 DECIMAL
型比较好
日期/时间类型
类型 | 格式 | 范围 | 存储需求 |
---|---|---|---|
YEAR | YYYY | 1901~2155 | 1个字节 |
DATE | YYYY-MM-DD | 1000-01-01~9999-12-31 | 3字节 |
TIME | HH-MM-SS | -838:59:59~838:59:59 | 3字节 |
DATETIME | YYYY-MM-DD HH-MM-SS | 1000-01-01 00:00:00~9999-12-31 00:00:00 | 8字节 |
TIMESTAMP | YYYY-MM-DD HH-MM-SS | 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC | 4字节 |
写入日期格式时可以使用
YYYY-MM-DD
格式的字符串,也可以使用YYYYMMDD
格式的字符串或数字写入时间格式时可以使用
HH:MM:SS
格式的字符串,也可以使用HHMMSS
格式的字符串或数字写入日期时间格式时可以使用
YYYY-MM-DD HH:MM:SS
格式的字符串,也可以使用YYYYMMDDHHMMSS
格式的字符串TIMESTAMP
类型受时区影响TIMESTAMP
类型的列可以定义默认值DEFAULT CURRENT_TIMESTAMP
当插入时默认使用当前时间
文本字符串类型
类型 | 描述 | 存储需求 |
---|---|---|
CHAR(M) | 固定长度的文本字符串 | L 字节,总字节数 < 2^8 |
VARCHAR(M) | 不固定长度的文本字符串 | L+1 字节, 所有 VARCHAR 类型的列的总字节数 < 2^16 |
TINYTEXT | 非常小的文本字符串 | L+1 字节,总字节数 < 2^8 |
TEXT | 小的文本字符串 | L+2 字节,总字节数 < 2^16 |
MEDIUMTEXT | 中等大小的文本字符串 | L+3 字节,总字节数 < 2^24 |
LONGTEXT | 大的文本字符串 | L+4 字节,总字节数 < 2^32 |
ENUM | 枚举类型,只能有一个枚举字符串值 | 1或2字节,取决于枚举的数目,最大个数 2^16-1 |
SET | 一个设置,字符串对象可以有0个或多个SET成员 | 1,2,3,4或8个字节,取决于成员的数目,最多64个成员 |
上表中的
M
表示创建表时指定的列的长度(字符个数,不分单字节还是多字节字符,一个字符均记一次),L
表示列值的实际字节数。由于总字节数有限制,所有M
的上限与使用的字符集有关。下表是只有一个
VARCHAR
列时可以定义的的M
上限:
字符集 | 字符数上限 |
---|---|
utf8mb4 | 16382 = 2^16/4 - 2 |
utf8 | 21843 = 2^16/3 - 2 |
gb2312 | 32764 = 2^16/2 - 4 |
latin1 | 65529 = 2^16 - 7 |
字符串类型与整数类型不同,字符串类型的列长
M
会影响列的容量TEXT 类型为可变长度的文本字符
ENUM 和 SET 是以字符串的形式出现的,但在内部,MySQL 以数值的方式存储它们,数值和字符串之间存在对应关系。
CHAR 会自动删除插入数据尾部的空格,而 VARCHAR 不会
二进制字符串类型
二进制字符串类型包括 BIT
BINARY
VARBINARY
TINYBLOB
BLOB
MEDIUMBLOB
LONGBLOB
,主要用来存储图片、音频等文件,实际中一般把图片、音频等文件存储在磁盘,在数据库中存储文件位置。
数据类型的选择
整数类型:不需要小数时,选用整数类型,根据列的取值范围选择使用哪种整数类型,例如:状态类,只有0和1,可以选用
TINYINT
小数类型:没有运算和比较时,对精度要求不高的选用
FLOAT
,对精度要求较高的选用DOUBLE
;对精度要求特别高,或者对数据有运算和比较的(比如货币)选用DECIMAL
日期和时间:只需要记录年份的选用
YEAR
, 只需要记录日期的选用DATE
,只需要记录时间的选用TIME
。需要同时记录日期和时间的可以选用DATETIME
或TIMESTAMP
;存储范围较大的选用DATETIME
,如果需要设置默认值为当前时间的选用TIMESTAMP
MyISAM
引擎,选用CHAR
类型,可以使检索更快,用空间换时间对于多字节字符编码的
CHAR
类型,不再代表固定长度的字符串了,比如UTF8
字符集的CHAR(10)
, 最小占 10 字节(存储 10 个单字节字符),最大占 30 字节(存储 10 个三字节汉字),不足 10 个字符时仍然会以0x20
补全。 在InnoDB
中将这种数据类型视为变长的字符。因此在InnoDB
中优先选用VARCHAR
更能节省磁盘空间。(更详尽的解释参考《MySQL技术内幕InnoDB存储引擎》一书)
SQL语言的分类
数据定义语言 DDL(Data Definition Language)
定义存储数据的对象(库、表、视图、索引、同义词、聚簇等):
CREATE
ALTER
DROP
TRUNCATE
SHOW
DESCRIBE
等数据操纵语言 DML(Data Manipulation Language)
操纵数据:
INSERT
UPDATE
DELETE
REPLACE
等数据查询语言 DQL(Data Query Language)
查询数据:
SELECT
数据控制语言DCL
授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等:
GRANT
REVOKE
COMMIT
ROLLBACK
等其他
SET
USE
DELIMITER
等