SQL语法简易教程

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 条件中使用 >、<、= 等比较运算符,或者使用 ANDORNOT等逻辑运算符来指定多个条件,或者使用IN、BETWEEN、LIKE 、NOT LIKENOT BETWEENNOT 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注入

🤣🌴🌴

京ICP备13031296号-4