SQL 是关系型数据库的标准语言,所有的关系型数据库都支持 SQL,比如 MySQL、Oracle、SQL Server、MS Access、DB2 等。不学习 SQL,就没法使用关系型数据库。MUD游戏中也可以使用数据库(常用的是MySQL和SQLite3),所以对不懂SQL的同学来说学学没坏处。
提示:如果你只是要在MUD开发中使用数据库,推荐这里->https://bbs.mud.ren/threads/156
SQL命令
DDL - Data Definition Language,数据定义语言
- CREATE 用于在数据库中创建一个新表、一个视图或者其它对象。
- ALTER 用于修改现有的数据库,比如表、记录。
- DROP 用于删除整个表、视图或者数据库中的其它对象
DML - Data Manipulation Language,数据处理语言
- SELECT 用于从一个或者多个表中检索某些记录。
- INSERT 插入一条记录。
- UPDATE 修改记录。
- DELETE 删除记录。
DCL - Data Control Language,数据控制语言
- GRANT 向用户分配权限。
- REVOKE 收回用户权限。
关系数据库管理系统
模型
- 表(Table)
- 表名推荐英文小写字母下划线格式的复数形态
- 字段(Field)|列(Column)
- 空值(NULL):表的字段默认允许存放 NULL 值,在插入记录或者更新记录时,可以不为该字段指定值,此时该字段将存储 NULL 值。
- 字段名可以用中文,但不推荐,推荐使用英文小写字母下划线格式的单数形态命名。
- 记录(Record)
SQL 约束
- 列级别
- 表级别
- 常用约束
- NOT NULL 非空约束,确保列中不能有 NULL 值。
- DEFAULT 默认约束,如果未指定值,那么列将提供默认值。
- UNIQUE 唯一约束,确保列中所有的值都不相同。
- PRIMARY KEY 主键,用来唯一标识数据表中的每一行/记录。
- FOREIGN KEY 外键,用于将两个表连接在一起,让两个表的数据保持同步。
- CHECK 检查性约束,用于限定列的取值范围。
- INDEX 索引,用于快速从数据库中检索或者获取数据。
数据的完整性
- 实体完整性
- 域完整性
- 引用完整性
- 自定义完整性
数据库范式
目的
- 消除冗余数据
- 确保数据之间的关联性是有意义的
六种范式
- 第一范式(1NF):所有的域都应该是原子性的(无重复的域)
- 第二范式(2NF):在满足1NF的基础上属性完全依赖于主键
- 第三范式(3NF):在满足2NF的基础上属性不依赖于其它非主属性
- 巴斯-科德范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF,又称完美范式)
SQL语法
说明
- 所有的 SQL 语法都必须以关键字(也称命令)开头,比如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP、CREATE、USE、SHOW 等。
- 所有的 SQL 语句必须以分号;结尾。SQL 语句可以跨行,您可以将 SQL 语句书写在一行或者多行。
- SQL 不区分大小写,这意味着 SELECT 和 select 在 SQL 语句中是一样的,但是关键字通常以大写形式出现。
- 注意:表名是区分大小写的,您必须使用数据库中已经存在的表名。
SQL 命令
CREATE DATABASE
-- 用来创建一个新的数据库
CREATE DATABASE database_name;
DROP DATABASE
-- 用来删除已经存在的数据库
DROP DATABASE database_name;
USE
-- 查看所有已存在的数据库
SHOW DATABASES;
-- 用来选择一个已经存在的数据库
USE database_name;
CREATE TABLE
-- 用于创建一个新的数据表
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns )
);
在创建数据表时,可以使用 CREATE TABLE 语句指定约束规则;创建数据表以后,也可以使用 ALTER TABLE 语句来增加约束规则。
SQL 常用的一些约束:
| 约束 | 说明 |
|---|---|
| NOT NULL | 非空约束,确保列中不能有 NULL 值。 |
| DEFAULT | 默认约束,如果未指定值,那么列将提供默认值。 |
| UNIQUE | 唯一约束,确保列中所有的值都不相同。 |
| PRIMARY Key | 主键,用来唯一标识数据库中的每一行/记录。 |
| FOREIGN Key | 外键,用来唯一标识任何其它数据库中表的行/记录。 |
| CHECK | 检查性约束,用于确保列中的所有值都必须满足某些条件。 |
| INDEX | 索引,用于快速从数据库中检索或者获取数据。 |
关键字 NULL 用来表示缺失的值,也即空值,或者没有值。NULL 值不等同于零值,也不等同于空字符串。
UNIQUE 可以约束表的一个字段,也可以约束多个字段。此外,设置了 UNIQUE 约束的字段可以出现 NULL 值。
主键必须包含唯一值,换句话说,所有记录的主键都不能出现相同的值。此外,主键必须是一个具体的值,不能是 NULL 值。
一个表可以有多个外键,但是只能有一个主键。从表的外键类型,必须与主表的主键类型一致。删除主表时,必须先删除从表,否则主表将无法删除。
SQL 索引(Index)用于提高数据表的查询速度。一个表可以创建多个索引,一个索引可以包含一个或者多个字段。原则:仅在被频繁检索的字段上创建索引,尽量不要在有大量重复值得字段上建立索引。
AUTO_INCREMENT 约束
MySQL 中使用序列的最简单方法是为某一列添加 AUTO_INCREMENT 约束。AUTO_INCREMENT 会在新记录插入表中时生成一个唯一的整数,这些整数是自动增长的,用户还可以指定增长的步长(默认为 1)。
注意事项:
- 一个表中只能有一个字段使用 AUTO_INCREMENT 约束,并且该字段的类型必须是整数,习惯上将主键设置为 AUTO_INCREMENT。
- 在插入数据或者更新数据时,一般将 AUTO_INCREMENT 字段留空,因为数据库引擎会自动管理它的值。
在插入或者更新记录时,如果为 AUTO_INCREMENT 字段明确地指定了一个值,则会出现两种情况:
- 如果指定的值和已有的编号重复,则出现错误信息,操作失败,因为 AUTO_INCREMENT 字段的值必须是唯一的。
- 如果指定的值大于已有的编号,则操作成功,该值插入/更新到表中,下一个编号将从这个新值开始递增;也就是说,AUTO_INCREMENT 并不要求编号是连续的,可以跳过一些编号。
MySQL 使用 LAST_INSERT_ID() 获取 AUTO_INCREMENT 最后的值,具体语法为:
SELECT LAST_INSERT_ID();
PHP 可以使用 mysql_insert_id() 函数获取 AUTO_INCREMENT 最后的值。
在某些情况下,您已经从表中删除了很多记录,并且想要对所有记录重新编号,此时可以使用一个简单的技巧:先删除 AUTO_INCREMENT 字段,然后重新添加该字段,并附带 AUTO_INCREMENT 约束。
下面的示例演示了如何使用该技巧对 INSECT 表中的 id 字段进行重新编号:
mysql> ALTER TABLE INSECT DROP id;
mysql> ALTER TABLE insect
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);
如果表已经存在了,您也可以使用 ALTER TABLE 设置初始序列值:
mysql> ALTER TABLE t AUTO_INCREMENT = 100;
复制表
-- 创建新表,没有原表的完整约束,会把原表的数据拷贝一份
CREATE TABLE 新表
AS
SELECT * FROM 旧表
-- 创建新表,约束和原表相同,只拷贝表结构,没有拷贝表的数据
CREATE TABLE 新表
LIKE 旧表
DROP TABLE
-- 用来删除数据表
DROP TABLE table_name;
ALTER TABLE
-- 用于修改数据表
-- 用来增加或修改数据表的字段
ALTER TABLE table_name {ADD|MODIFY} column_name data_ype;
-- 用来删除数据表的字段
ALTER TABLE table_name DROP column_name;
-- 用来修改数据表的字段名称
ALTER TABLE table_name CHANGE COLUMN column_name new_column_name data_ype;
-- 用来修改数据表的名称
ALTER TABLE table_name RENAME TO new_table_name;
-- 修改表名还可以用以下语法
RENAME TABLE table_name TO new_table_name;
SELECT
-- 从数据库中查询(选取)数据
SELECT column1, column2....columnN
FROM table_name
[ WHERE <condition> ];
-- 完整的查询语句
SELECT
DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
GROUP BY 子句通常和聚合函数(COUNT()、SUM()、AVG()、MIN()、MAX() 等)一起使用来对结果进行分组,而 WHERE 子句不能和聚合函数一起使用,所以 SQL 又提供了 HAVING 子句,以弥补了 WHERE 子句的不足。WHERE 子句在分组操作之前起作用,HAVING 子句在分组操作之后起作用。
运算符
在 condition 条件中使用 >、<、= 等比较运算符,或者使用 AND 、OR 、NOT等逻辑运算符来指定多个条件,或者使用IN、BETWEEN、LIKE 、NOT LIKE、NOT BETWEEN、NOT IN 等进行模糊匹配。
| 算数运算符 | 含义 |
|---|---|
+ |
加法运算 |
- |
减法运算 |
* |
乘法运算 |
/ |
除法运算 |
| 比较运算符 | 含义 |
|---|---|
= |
等于 |
<> |
不等于 |
> |
大于 |
>= |
大于等于 |
< |
小于 |
<= |
小于等于 |
注意:字符串也可以比较大小!
注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。
我们不能使用 =、<、> 等比较运算符来检测 NULL 值,而必须使用
IS NULL或者IS NOT NULL关键字来检测NULL值。
| 逻辑运算符 | 含义 |
|---|---|
| AND | 与 |
| NOT | 非 |
| OR | 或 |
| 条件运算符 | 含义 |
|---|---|
| BETWEEN | 在范围中查询 |
| IN | 在结果中查询 |
| LIKE | 通配符模糊查询 |
| LIKE 子句通配符 | 说明 |
|---|---|
| 百分号(%) | 代表零个、一个或者多个任意的字符。 |
下划线(_) |
代表单个字符或者数字。 |
SQL IN 语法
SELECT column_name(s)
FROM table_name
WHERE column_name
[NOT] IN (value1,value2,...)
SQL BETWEEN 语法
SELECT column_name(s)
FROM table_name
WHERE column_name
[NOT] BETWEEN value1 AND value2
ORDER BY
ORDER BY 语句默认按照升序ASC对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
JOIN
SQL 允许在 JOIN 左边加上一些修饰性的关键词,从而形成不同类型的连接,如下表所示:
| 连接类型 | 说明 |
|---|---|
| INNER JOIN | (默认连接方式)只有当两个表都存在满足条件的记录时才会返回行。 |
| LEFT JOIN | 返回左表中的所有行,即使右表中没有满足条件的行也是如此。 |
| RIGHT JOIN | 返回右表中的所有行,即使左表中没有满足条件的行也是如此。 |
| FULL JOIN | 只要其中有一个表存在满足条件的记录,就返回行。 |
| CROSS JOIN | 交叉连接,从两个或者多个连接表中返回记录集的笛卡尔积。 |
| 自连接 | 将一个表连接到自身,就像该表是两个表一样。为了区分两个表,在 SQL 语句中需要至少重命名一个表。 |
如果不加任何修饰词,只写 JOIN,那么默认为 INNER JOIIN,上面例子中就是如此。
在以上几种连接方式中,INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 是最常使用的连接方式,掌握它们是学好 SQL 的必备基础,下面我们借助示意图来加深读者对这几种连接方式的理解。
当两个表中有同名的字段时,为了帮助数据库引擎区分是哪个表的字段,在书写同名字段名时需要加上表名,表名和字段名以点号.分隔,如下所示:
table_name.column_name
当然,如果书写的字段名在两个表中是唯一的,也可以不使用以上格式,只写字段名即可。
可以多表连接:
SELECT
a.`学号`,
a.`姓名`,
a.`性别`,
a.`出生日期`,
c.`课程号`,
c.`课程名称`,
b.`成绩`,
d.`教师号`,
d.`教师名称`
FROM
`student` a
JOIN score b ON a.`学号` = b.`学号`
JOIN course c ON b.`课程号` = c.`课程号`
JOIN teacher d ON c.`教师号` = d.`教师号`
错位计算:
SELECT
a.`用户`,
b.`消费金额` - a.`消费金额` AS 消费差额
FROM
`订单表` AS a
JOIN `订单表` AS b ON a.`用户` = b.`用户`
AND a.`第几次消费` = b.`第几次消费` -1
TOP
SQL TOP 子句用于限定要返回的记录的数据,可以是一个具体的数字,也可以是一个百分数。
对于拥有成千上万条记录的大型数据表来说,TOP 子句非常有用,它能够压缩结果集的大小,提高程序查询效率。
语法
SELECT 语句中的 TOP 子句的基本语法如下:
SELECT TOP number|percent column_name(s)
FROM table_name
WHERE [condition]
注意,并不是所有的数据库都支持 TOP 子句,有些数据库使用其它的等价语句来替代,例如:
- MySQL 使用 LIMIT 子句获取指定数量的记录;
- Oracle 使用 ROWNUM 子句获取指定数量的记录。
AS
AS 关键字用于为表或字段起一个临时的别名。
-- 表别名的基本语法如下:
SELECT column1, column2....
FROM table_name AS alias_name
[WHERE <condition>];
-- 字段别名的基本语法如下:
SELECT column_name AS alias_name
FROM table_name
[WHERE <condition>];
AS 可以省略,但不建议省略。
CASE
CASE语句可以用于任何子句中,常用于SELECT子句。
-- 简单的 CASE 语句的语法
CASE value WHEN compare_value THEN result [WHEN compare_value THEN
result ...] [ELSE result] END
-- 可搜索CASE语句的语法
CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE
result] END
ELSE 子句是可选的。
行列互换示例
SELECT
`学号`,
MAX( CASE WHEN `课程号` = '0001' THEN `成绩` ELSE 0 END ) AS 语文成绩,
MAX( CASE WHEN `课程号` = '0002' THEN `成绩` ELSE 0 END ) AS 数学成绩,
MAX( CASE WHEN `课程号` = '0003' THEN `成绩` ELSE 0 END ) AS 英语成绩
FROM
`score`
WHERE
`学号` < '0003'
GROUP BY
`学号`
INSERT INTO
-- 向数据库中插入新的数据
INSERT INTO table_name( column1, column2....columnN)
VALUES ( value1, value2....valueN);
-- 复制表
INSERT INTO table_name1( column1, column2....columnN)
SELECT column1, column2....columnN FROM table_name2;
UPDATE
-- 更新数据库中的数据
UPDATE table_name
SET column1 = value1, column2 = value2....columnN=valueN
[ WHERE <condition> ];
DELETE
-- 从数据库中删除数据
DELETE FROM table_name
[ WHERE <condition> ];
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
DELETE FROM table_name
-- 或者
DELETE * FROM table_name
TRUNCATE TABLE
-- 清空表
TRUNCATE TABLE table_name;
-
TRUNCATE TABLE 和 DROP TABLE
-
TRUNCATE TABLE 和 DELETE FROM
-
当您不再需要该表时,使用 DROP TABLE;
-
当您仍要保留该表,只是想删除所有记录时,使用 TRUNCATE TABLE;
-
当你要删除部分记录时,使用带有 WHERE 子句的 DELETE FROM。
CREATE INDEX
-- 用于创建索引
CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);
DROP INDEX
-- 用来删除索引
ALTER TABLE table_name
DROP INDEX index_name;
CREATE VIEW
-- 用来创建视图
CREATE VIEW view_name AS
SELECT column1, column2.....
FROM table_name
[ WHERE <condition> ];
视图和表的主要区别在于:
- 表占用物理存储空间,也包含真正的数据;
- 视图不需要物理存储空间(除非您为视图添加索引),也不包含真正的数据,它只是从表中引用数据。
过多使用视图或者不使用视图都不是好的习惯
视图不能和已存在的表重名
DROP VIEW
-- 删除视图
DROP VIEW view_name;
注意,删除视图仅仅是删除创建视图的 SELECT 查询语句,并不会删除基础表中的数据。
CREATE TEMPORARY TABLE
-- 创建临时表
CREATE TEMPORARY TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns )
);
临时表仅存在于会话期间。如果您使用 PHP 脚本连接数据库,当 PHP 执行完成后,临时表将被销毁。如果您使用 MySQL 客户端连接数据库,当客户端关闭后,临时表将被销毁。但是,如果您希望在会话期间删除它们,则可以使用 DROP TABLE 命令。
临时表可以和普通表或视图重名(优先使用临时表)
SHOW CREATE TABLE
-- 获取创建表的 CREATE TABLE 语句
SHOW CREATE TABLE table_name;
子查询(嵌套查询)
子查询也称“内部查询”或者“嵌套查询”,是指将一个 SELECT 查询(子查询)的结果作为另一个 SQL 语句(主查询)的数据来源或者判断条件。
子查询可以嵌入 SELECT、INSERT、UPDATE 和 DELETE 语句中,也可以和 =、<、>、IN、BETWEEN、EXISTS 等运算符一起使用。
子查询常用在 WHERE 子句和 FROM 子句后边:
- 当用于 WHERE 子句时,根据不同的运算符,子查询可以返回单行单列、多行单列、单行多列数据。子查询就是要返回能够作为 WHERE 子句查询条件的值。
- 当用于 FROM 子句时,一般返回多行多列数据,相当于返回一张临时表,这样才符合 FROM 后面是表的规则。这种做法能够实现多表联合查询。
用于 WHERE 子句的子查询的基本语法如下:
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
子查询需要放在括号( )内。OPERATOR 表示用于 WHERE 子句的运算符。
- WHERE 子句中的子查询返回单行单列数据,也即子查询的结果只有一个值,一般是满足 WHERE 查询条件中的比较运算符,比如 >、<、>=、<=、=、!= 等。
- WHERE 子句中的子查询返回单列多行数据,一般和 IN、NOT INT、ANY、ALL 关键字使用,也就是对集合范围的操作。
用于 FROM 子句的子查询的基本语法如下:
SELECT column_name [, column_name ]
FROM (SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE]) AS temp_table_name
WHERE condition
用于 FROM 的子查询返回的结果相当于一张临时表,所以需要使用 AS 关键字为该临时表起一个名字。
UNION和UNION ALL子句
SQL UNION 子句/运算符用于合并两个或者多个 SELECT 语句的结果集。
默认地,UNION 运算符会过滤掉两个结果集中重复的记录,只保留其中一条,也就是对两个结果集进行并集操作;此外,UNION 还会按照默认规则对结果集进行排序。
如果您希望保留原始结果,请使用 UNION ALL。UNION ALL 只是对结果集进行简单粗暴的合并,不会过滤重复的记录,也不会进行排序。
UNION 子句的基本语法如下:
SELECT column1, column2 ...
FROM table1, table2
[WHERE condition1]
UNION / UNION ALL
SELECT column1, column2 ...
FROM table1, table2
[WHERE condition2]
UNION 运算符使用注意事项:
- 每个 SELECT 语句都必须拥有相同数量的字段;
- 不同 SELECT 语句的对应字段必须拥有相似的类型。
不同 SELECT 语句的字段名不需要相同,SQL 会将第一个 SELECT 语句的字段名作为结果集的字段名。
函数
数值型函数
字符串型函数
日期时间函数
聚合函数
窗口函数(Window Function)|分析函数(Analytics Function)
MySQL 8.0 才支持窗口函数
<窗口函数> OVER (PARTITION BY <用于分组的列名> ORDER BY <用于排序的列名>)
SELECT
*,
ROW_NUMBER() over ( PARTITION BY `学号` ORDER BY `成绩` DESC ) AS `排名`
FROM
`score`
- row_number()
- rank()
- dense_rank()
- percent_rank()
- cume_dist()
SQL事务
一般来说,事务具有四个标准属性,分别是原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability),简称 ACID。
与事务控制有关的 SQL 命令包括:
- BEGIN 或者 START TRANSACTION:开始事务;
- COMMIT:提交事务;
- ROLLBACK:回滚事务;
- SAVEPOINT:在事务内部设置回滚标记点;
- RELEASE SAVEPOINT:删除回滚标记点;
- ROLLBACK TO:将事务回滚到标记点(ROLLBACK 命令的一种变形写法)
SQL数据类型汇总
基本数据类型
- 字符串类型
- 数值类型(整数+小数)
- 日期时间类型
- 二进制类型
MySQL 数据类型
- 字符串类型
| 类型 | 说明 |
|---|---|
| CHAR(size) | 用于表示固定长度的字符串,该字符串可以包含数字、字母和特殊字符。size 的大小可以是从 0 到 255 个字符,默认值为 1。 |
| VARCHAR(size) | 用于表示可变长度的字符串,该字符串可以包含数字、字母和特殊字符。size 的大小可以是从 0 到 65535 个字符。 |
| TINYTEXT | 表示一个最大长度为 255(28-1)的字符串文本。 |
| TEXT(size) | 表示一个最大长度为 65,535(216-1)的字符串文本,也即 64KB。 |
| MEDIUMTEXT | 表示一个最大长度为 16,777,215(224-1)的字符串文本,也即 16MB。 |
| LONGTEXT | 表示一个最大长度为 4,294,967,295(232-1)的字符串文本,也即 4GB。 |
| ENUM(val1, val2, val3,...) | 字符串枚举类型,最多可以包含 65,535 个枚举值。插入的数据必须位于列表中,并且只能命中其中一个值;如果不在,将插入一个空值。 |
| SET( val1,val2,val3,....) | 字符串集合类型,最多可以列出 64 个值。插入的数据可以命中其中的一个或者多个值,如果没有命中,将插入一个空值。 |
说明:ENUM 类型相当于单选题,SET 类型相当于多选题。
- 整数类型
| 类型 | 大小(字节) | 有符号数取值范围 | 无符号数取值范围 | 说明 |
|---|---|---|---|---|
| TINYINT | 1 | (-128, 127) | (0, 255) | 超小整数 |
| SMALLINT | 2 | (-32 768, 32 767) | (0, 65 535) | 小整数 |
| MEDIUMINT | 3 | (-8 388 608, 8 388 607) | (0, 16 777 215) | 中等整数 |
| INT 或 INTEGER | 4 | (-2 147 483 648, 2 147 483 647) | (0, 4 294 967 295) | 整数 |
| BIGINT | 8 | (-263, 263-1) | (0, 264-1) | 大整数 |
| 类型 | 说明 |
|---|---|
| BOOL | 布尔类型,只有 true 和 false 两个有效值;零值被认为是 false,非零值被认为是 true。 |
注意,MySQL 并不真正支持 BOOL 类型,BOOL 是 TINYINT(1) 的别名。
- 小数类型
| 类型 | 分类 | 说明 |
|---|---|---|
| FLOAT(size, d) | 浮点数(近似值) | 单精度浮点数类型,4 个字节大小。size 参数用来指定数字的总个数,d 参数用来指定小数部分(小数点后边)的数字个数。 |
| FLOAT(p) | 浮点数(近似值) | 单精度浮点数类型,参数 p 用来决定使用 FLOAT 类型还是 DOUBLE 类型:如果 p 的取值介于 0 和 24 之间,那么数据类型将变成 FLOAT();如果 p 的取值介于 25 和 53 之间,那么数据类型将变成 DOUBLE()。 |
| DOUBLE(size, d) | 浮点数(近似值) | 双精度浮点数类型,size 参数用来指定数字的总个数,d 参数用来指定小数部分(小数点后边)的数字个数。 |
| DECIMAL(size, d) | 定点数(精确值) | 定点数类型,size 参数用来指定数字的总个数,d 参数用来指定小数部分(小数点后边)的数字个数。size 的最大值是 65,默认值是 10;d 的最大取值是 30,默认值是 0。 |
| DEC(size, d) | 定点数(精确值) | 等价于 DECIMAL(size, d)。 |
- 日期时间类型
| 类型 | 说明 |
|---|---|
| DATE | 日期类型,格式为 YYYY-MM-DD,取值范围从 '1000-01-01' 到 '9999-12-31'。 |
| DATETIME(fsp) | 日期和时间类型,格式为 YYYY-MM-DD hh🇲🇲ss,取值范围从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。 |
| TIMESTAMP(fsp) | 时间戳类型,它存储的值为从 Unix 纪元('1970-01-01 00:00:00' UTC)到现在的秒数。TIMESTAMP 的格式为 YYYY-MM-DD hh🇲🇲ss,取值范围从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC。 |
| TIME(fsp) | 时间类型,格式为 hh🇲🇲ss,取值范围从 '-838:59:59' 到 '838:59:59'。 |
| YEAR | 四位数字的年份格式,允许使用从 1901 到 2155 之间的四位数字的年份。此外,还有一个特殊的取值,就是 0000。 |
- 二进制类型
| 类型 | 说明 |
|---|---|
| BIT(size) | 二进制位(Bit)类型,位数由 size 参数指定;size 的大小从 1 到 64,默认值为 1。 |
| BINARY(Size) | 等价于 CHAR() 类型,但是存储的是二进制形式的字节串。size 参数以字节(Byte)为单位指定列的长度,默认值为1。 |
| VARBINARY(Size) | 等价于 VARCHAR() 类型,但是存储的是二进制形式的字节串。size 参数以字节(Byte)为单位指定列的最大长度。 |
| TINYBLOB | 存储较小的二进制数据,最多可容纳 255 (28-1)个字节。 |
| BLOB(size) | 用来储存二进制数据,最多可以容纳 65,535(216-1)个字节,也即 64KB。 |
| MEDIUMBLOB | 存储中等大小的二进制数据,最多可以容纳 16,777,215(224-1)字节,也即 16MB。 |
| LONGBLOB | 存储较大的二进制数据,最多可容纳 42,94,967,295(232-1)字节,也即 4GB。 |
说明:BLOB 是 Binary Large Objects 的缩写,译为“大型二进制对象”,也即二进制数据块。
SQLite 数据类型
说明
- SQLite 使用一个更普遍的动态类型系统(在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关)。
- SQLite 没有单独的 Boolean 存储类。相反,布尔值被存储为整数 0(false)和 1(true)。
- SQLite 没有一个单独的用于存储日期和/或时间的存储类,但 SQLite 能够把日期和时间存储为 TEXT、REAL 或 INTEGER 值。
SQLite 存储类
| 存储类 | 描述 |
|---|---|
| INTEGER | 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 |
| REAL | 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 |
| TEXT | 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 |
| BLOB | 值是一个 blob 数据,完全根据它的输入存储。 |
SQLite 的存储类稍微比数据类型更普遍。INTEGER 存储类,例如,包含 6 种不同的不同长度的整数数据类型。
SQLite 亲和(Affinity)类型
- TEXT
- NUMERIC
- INTEGER
- REAL
- NONE
小知识
反引号(`):一般在ESC键的下方,或者数字1左边
作用:是为了区分MySQL的保留字与普通字符而引入的符号。
注意:有MySQL保留字作为字段的,必须加上反引号来区分!
单引号( ' )和双引号( " ) 用于字符串和日期,作用相同。 反引号( ` )用于表名和列名。 数字作为数值时,不要用任何引号,保留符、关键字不要用任何引号。
SQL注入
🤣🌴🌴