数据库、数据库服务器、数据库语言
数据库是一个长期持久存储在计算机内的有组织的、有共享的、统一管理的数据集合,由数据库服务器通过数据库语言来管理。
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,如果需要设置默认值为当前时间的选用TIMESTAMPMyISAM引擎,选用CHAR类型,可以使检索更快,用空间换时间对于多字节字符编码的
CHAR类型,不再代表固定长度的字符串了,比如UTF8字符集的CHAR(10), 最小占 10 字节(存储 10 个单字节字符),最大占 30 字节(存储 10 个三字节汉字),不足 10 个字符时仍然会以0x20补全。 在InnoDB中将这种数据类型视为变长的字符。因此在InnoDB中优先选用VARCHAR更能节省磁盘空间。(更详尽的解释参考《MySQL技术内幕InnoDB存储引擎》一书)
SQL语言的分类
数据定义语言 DDL(Data Definition Language)
定义存储数据的对象(库、表、视图、索引、同义词、聚簇等):
CREATEALTERDROPTRUNCATESHOWDESCRIBE等数据操纵语言 DML(Data Manipulation Language)
操纵数据:
INSERTUPDATEDELETEREPLACE等数据查询语言 DQL(Data Query Language)
查询数据:
SELECT数据控制语言DCL
授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等:
GRANTREVOKECOMMITROLLBACK等其他
SETUSEDELIMITER等