SQL 系列教程(六)

目录

[SQL FOREIGN KEY 约束](#SQL FOREIGN KEY 约束)

[SQL FOREIGN KEY 约束](#SQL FOREIGN KEY 约束)

[创建表时的 FOREIGN KEY 约束](#创建表时的 FOREIGN KEY 约束)

[修改表时的 FOREIGN KEY 约束](#修改表时的 FOREIGN KEY 约束)

[撤销 FOREIGN KEY 约束](#撤销 FOREIGN KEY 约束)

[SQL CHECK 约束](#SQL CHECK 约束)

[SQL CHECK 约束](#SQL CHECK 约束)

[创建表时的 CHECK 约束](#创建表时的 CHECK 约束)

[修改表的 CHECK 约束](#修改表的 CHECK 约束)

[撤销 CHECK 约束](#撤销 CHECK 约束)

[SQL DEFAULT 约束](#SQL DEFAULT 约束)

[SQL DEFAULT 约束](#SQL DEFAULT 约束)

[创建表时的 DEFAULT 约束](#创建表时的 DEFAULT 约束)

[修改表的 DEFAULT 约束](#修改表的 DEFAULT 约束)

[撤销 DEFAULT 约束](#撤销 DEFAULT 约束)

[SQL CREATE INDEX 语句](#SQL CREATE INDEX 语句)

[SQL CREATE INDEX 语句](#SQL CREATE INDEX 语句)

[CREATE INDEX 实例](#CREATE INDEX 实例)

[DROP INDEX 语句](#DROP INDEX 语句)

[SQL 自增字段](#SQL 自增字段)

自增字段

[用于 MySQL 的语法](#用于 MySQL 的语法)

[用于 SQL Server 的语法](#用于 SQL Server 的语法)

[用于 Access 的语法](#用于 Access 的语法)

[用于 Oracle 的语法](#用于 Oracle 的语法)

[SQL 日期函数](#SQL 日期函数)

[SQL 日期](#SQL 日期)

[SQL Date 数据类型](#SQL Date 数据类型)

日期处理

[SQL 视图](#SQL 视图)

[SQL CREATE VIEW 语句](#SQL CREATE VIEW 语句)

[SQL CREATE VIEW 实例](#SQL CREATE VIEW 实例)

[SQL 更新视图](#SQL 更新视图)

[SQL 撤销视图](#SQL 撤销视图)

[SQL 托管](#SQL 托管)

[SQL 托管](#SQL 托管)

[MS SQL Server](#MS SQL Server)

Oracle

MySQL

Access

[MySQL, SQL Server 和 MS Access 的数据类型](#MySQL, SQL Server 和 MS Access 的数据类型)

[SQL 通用数据类型](#SQL 通用数据类型)

[MySQL 数据类型 (Version 8.0)](#MySQL 数据类型 (Version 8.0))

[SQL Server 数据类型](#SQL Server 数据类型)

[Microsoft Access 数据类型](#Microsoft Access 数据类型)


SQL FOREIGN KEY 约束

SQL FOREIGN KEY 约束

FOREIGN KEY 外键是用于将两个表链接在一起的键。

FOREIGN KEY 外键是一个表中引用另一个表中主键的字段(或字段集合)。

包含外键的表称为子表,包含候选键的表称为引用表或父表。

请看下面两个表:

"Persons" 表:

PersonID LastName FirstName Age
1 Hansen Ola 30
2 Svendson Tove 23
3 Pettersen Kari 20

"Orders" 表:

OrderID OrderNumber PersonID
1 77895 3
2 44678 3
3 22456 2
4 24562 1

请注意,"Orders" 表中的 "PersonID" 列指向 "Persons" 表中的 "PersonID" 列。

"Persons" 表中的 "PersonID" 列是 "Persons" 表中的主键。

"Orders" 表中的 "PersonID" 列是 "Orders" 表中的外键。

FOREIGN KEY 外键约束用于防止破坏表之间链接的操作。

FOREIGN KEY 外键约束还防止将无效数据插入外键列,因为它必须是它所指向的表中包含的值之一。

创建表时的 FOREIGN KEY 约束

下面的 SQL 在 "Orders" 表创建时在 "PersonID" 列创建 FOREIGN KEY 外键约束:

【MySQL】

sql 复制代码
CREATE TABLE Orders (
    OrderID int NOT NULL,
    OrderNumber int NOT NULL,
    PersonID int,
    PRIMARY KEY (OrderID),
    FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)
);

【SQL Server / Oracle / MS Access】

sql 复制代码
CREATE TABLE Orders (
    OrderID int NOT NULL PRIMARY KEY,
    OrderNumber int NOT NULL,
    PersonID int FOREIGN KEY REFERENCES Persons(PersonID)
);

如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:

【MySQL / SQL Server / Oracle / MS Access】

sql 复制代码
CREATE TABLE Orders (
    OrderID int NOT NULL,
    OrderNumber int NOT NULL,
    PersonID int,
    PRIMARY KEY (OrderID),
    CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID)
    REFERENCES Persons(PersonID)
);

修改表时的 FOREIGN KEY 约束

如果在表已存在的情况下为 "PersonID" 列创建 FOREIGN KEY 约束,请使用下面的 SQL:

【MySQL / SQL Server / Oracle / MS Access】

sql 复制代码
ALTER TABLE Orders
ADD FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);

如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:

【MySQL / SQL Server / Oracle / MS Access】

sql 复制代码
ALTER TABLE Orders
ADD CONSTRAINT FK_PersonOrder
FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);

撤销 FOREIGN KEY 约束

如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:

【MySQL】

sql 复制代码
ALTER TABLE Orders
DROP FOREIGN KEY FK_PersonOrder;

【SQL Server / Oracle / MS Access】

sql 复制代码
ALTER TABLE Orders
DROP CONSTRAINT FK_PersonOrder;

SQL CHECK 约束

SQL CHECK 约束

CHECK 约束用于限制列中的值的范围。

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

创建表时的 CHECK 约束

当创建"Persons"表时,下面的SQL在"Age"列上创建一个 CHECK 约束。"CHECK" 约束确保一个人的年龄必须为18岁或以上:

【MySQL】

sql 复制代码
CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    CHECK (Age>=18)
);

【SQL Server / Oracle / MS Access】

sql 复制代码
CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int CHECK (Age>=18)
);

如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:

【MySQL / SQL Server / Oracle / MS Access】

sql 复制代码
CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    City varchar(255),
    CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes')
);

修改表的 CHECK 约束

如果在表已存在的情况下为 "Age" 列创建 CHECK 约束,请使用下面的 SQL:

【MySQL / SQL Server / Oracle / MS Access】

sql 复制代码
ALTER TABLE Persons
ADD CHECK (Age>=18);

如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:

【MySQL / SQL Server / Oracle / MS Access】

sql 复制代码
ALTER TABLE Persons
ADD CONSTRAINT CHK_PersonAge CHECK (Age>=18 AND City='Sandnes');

撤销 CHECK 约束

如需撤销 CHECK 约束,请使用下面的 SQL:

【SQL Server / Oracle / MS Access】

sql 复制代码
ALTER TABLE Persons
DROP CONSTRAINT CHK_PersonAge;

【MySQL】

sql 复制代码
ALTER TABLE Persons
DROP CHECK CHK_PersonAge;

SQL DEFAULT 约束

SQL DEFAULT 约束

DEFAULT 约束用于向列提供默认值。

如果没有规定其他的值,那么会将默认值添加到所有的新记录。

创建表时的 DEFAULT 约束

下面的 SQL 在 "Persons" 表创建时为 "City" 列创建 DEFAULT 约束:

【My SQL / SQL Server / Oracle / MS Access】

sql 复制代码
CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    City varchar(255) DEFAULT 'Sandnes'
);

通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:

sql 复制代码
CREATE TABLE Orders (
    ID int NOT NULL,
    OrderNumber int NOT NULL,
    OrderDate date DEFAULT GETDATE()
);

修改表的 DEFAULT 约束

如果在表已存在的情况下为 "City" 列创建 DEFAULT 约束,请使用下面的 SQL:

【MySQL】

sql 复制代码
ALTER TABLE Persons
ALTER City SET DEFAULT 'Sandnes';

【SQL Server】

sql 复制代码
ALTER TABLE Persons
ADD CONSTRAINT df_City
DEFAULT 'Sandnes' FOR City;

【MS Access】

sql 复制代码
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'Sandnes';

【Oracle】

sql 复制代码
ALTER TABLE Persons
MODIFY City DEFAULT 'Sandnes';

撤销 DEFAULT 约束

如需撤销 DEFAULT 约束,请使用下面的 SQL:

【MySQL】

sql 复制代码
ALTER TABLE Persons
ALTER City DROP DEFAULT;

【SQL Server / Oracle / MS Access】

sql 复制代码
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT;

SQL CREATE INDEX 语句

SQL CREATE INDEX 语句

CREATE INDEX 语句用于在表中创建索引。

索引用于更快地从数据库检索数据。用户看不到索引,它们只是用来加速搜索/查询。

注: 更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

【CREATE INDEX 语法】

在表上创建一个简单的索引。允许使用重复的值:

sql 复制代码
CREATE INDEX index_name
ON table_name (column1, column2, ...);

【CREATE UNIQUE INDEX 语法】

在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。

sql 复制代码
CREATE UNIQUE INDEX index_name
ON table_name (column1, column2, ...);

注: 用于创建索引的语法在不同的数据库中不一样。因此,检查您的数据库中创建索引的语法。

CREATE INDEX 实例

下面的 SQL 语句在 "Persons" 表的 "lastname" 列上创建一个名为 "idx_lastname" 的索引:

sql 复制代码
CREATE INDEX idx_lastname
ON Persons (LastName);

如果要在列组合上创建索引,可以在括号内列出列名,用逗号分隔:

sql 复制代码
CREATE INDEX idx_pname
ON Persons (LastName, FirstName);

DROP INDEX 语句

DROP INDEX 语句用于删除表中的索引。

【MS Access】

sql 复制代码
DROP INDEX index_name ON table_name;

【SQL Server】

sql 复制代码
DROP INDEX table_name.index_name;

【DB2/Oracle】

sql 复制代码
DROP INDEX index_name;

【MySQL】

sql 复制代码
ALTER TABLE table_name
DROP INDEX index_name;

SQL 自增字段

自增字段

Auto-increment 会在新记录插入表中时生成一个唯一的数字。

我们通常希望在每次插入新记录时,自动地创建主键字段的值。

用于 MySQL 的语法

以下SQL语句将"Personid"列定义为"Persons"表中的自动递增主键字段:

sql 复制代码
CREATE TABLE Persons (
    Personid int NOT NULL AUTO_INCREMENT,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    PRIMARY KEY (Personid)
);

MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。

默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。

要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:

sql 复制代码
ALTER TABLE Persons AUTO_INCREMENT=100;

要在 "Persons" 表中插入新记录,我们不必为 "Personid" 列规定值(会自动添加一个唯一的值):

sql 复制代码
INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen');

上面的SQL语句将在"Persons"表中插入一条新记录。"Personid"列将被指定一个唯一的值。"FirstName"列将设置为"Lars",而"LastName"列将设置为"Monsen"。

用于 SQL Server 的语法

以下SQL语句将"Personid"列定义为"Persons"表中的自动递增主键字段:

sql 复制代码
CREATE TABLE Persons (
    Personid int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

MS SQL 使用 IDENTITY 关键字来执行 auto-increment 任务。

在上面的示例中,IDENTITY的起始值是1,对于每个新记录,它将增加1。

注: 要指定"Personid"列应从值10开始并递增5,请将其更改为IDENTITY(10,5)。

要在"Persons"表中插入新记录,我们不必为"Personid"列指定值(将自动添加唯一值):

sql 复制代码
INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen');

上面的SQL语句将在"Persons"表中插入一条新记录。"Personid"列将被指定一个唯一的值。"FirstName"列将设置为"Lars",而"LastName"列将设置为"Monsen"。

用于 Access 的语法

以下SQL语句将"Personid"列定义为"Persons"表中的自动递增主键字段:

sql 复制代码
CREATE TABLE Persons (
    Personid AUTOINCREMENT PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

MS Access 使用 AUTOINCREMENT 关键字来执行 auto-increment 任务。

默认情况下,AUTOINCREMENT 的起始值为1,对于每个新记录,它将递增1。

注: 要指定"Personid"列应从值10开始并递增5,请将autoincrement更改为autoincrement(10,5)。

要在"Persons"表中插入新记录,我们不必为"Personid"列指定值(将自动添加唯一值):

sql 复制代码
INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen');

上面的SQL语句将在"Persons"表中插入一条新记录。"Personid"列将被指定一个唯一的值。"FirstName"列将设置为"Lars",而"LastName"列将设置为"Monsen"。

用于 Oracle 的语法

在 Oracle 中,代码稍微复杂一点。您必须通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。

请使用下面的 CREATE SEQUENCE 语法:

sql 复制代码
CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10;

上面的代码创建了一个名为seq_person的序列对象,该对象以1开头,将递增1。它还将缓存多达10个性能值。"缓存"选项指定将在内存中存储多少个序列值,以便更快地访问。

要在"Persons"表中插入新记录,我们必须使用nextval函数(此函数从seq_person序列中检索下一个值):

sql 复制代码
INSERT INTO Persons (Personid,FirstName,LastName)
VALUES (seq_person.nextval,'Lars','Monsen');

上面的SQL语句将在"Persons"表中插入一条新记录。"Personid"列将从seq_person序列中分配下一个编号。"FirstName"列将设置为"Lars",而"LastName"列将设置为"Monsen"。

SQL 日期函数

SQL 日期

处理日期时最困难的部分是确保要插入的日期的格式与数据库中日期列的格式相匹配。

只要您的数据只包含日期部分,您的查询就会按预期工作。然而,如果涉及到时间部分,它会变得更加复杂。

SQL Date 数据类型

MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:

  • DATE - 格式: YYYY-MM-DD
  • DATETIME - 格式: YYYY-MM-DD HH:MI:SS
  • TIMESTAMP - 格式: YYYY-MM-DD HH:MI:SS
  • YEAR - 格式 YYYY 或 YY

SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:

  • DATE - 格式 YYYY-MM-DD
  • DATETIME - 格式: YYYY-MM-DD HH:MI:SS
  • SMALLDATETIME - 格式: YYYY-MM-DD HH:MI:SS
  • TIMESTAMP - 格式: 唯一的数字

注: 当您在数据库中创建一个新表时,需要为列选择数据类型!

日期处理

如果不涉及时间部分,那么我们可以轻松地比较两个日期!

假设我们有如下的 "Orders" 表:

OrderId ProductName OrderDate
1 Geitost 2008-11-11
2 Camembert Pierrot 2008-11-09
3 Mozzarella di Giovanni 2008-11-11
4 Mascarpone Fabioli 2008-10-29

现在,我们希望从上表中选取 OrderDate 为 "2008-11-11" 的记录。

我们使用下面的 SELECT 语句:

sql 复制代码
SELECT * FROM Orders WHERE OrderDate='2008-11-11'

结果集如下所示:

OrderId ProductName OrderDate
1 Geitost 2008-11-11
3 Mozzarella di Giovanni 2008-11-11

现在,假设 "Orders" 表如下所示(请注意 "OrderDate" 列中的时间部分):

OrderId ProductName OrderDate
1 Geitost 2008-11-11 13:23:44
2 Camembert Pierrot 2008-11-09 15:45:21
3 Mozzarella di Giovanni 2008-11-11 11:12:01
4 Mascarpone Fabioli 2008-10-29 14:56:59

如果我们使用和上面一样的 SELECT 语句:

sql 复制代码
SELECT * FROM Orders WHERE OrderDate='2008-11-11'

那么我们将得不到结果!因为表中没有"2008-11-11 00:00:00"日期。如果没有时间部分,默认时间为 00:00:00。

注: 如果您希望使查询简单且更易维护,那么请不要在日期中使用时间部分!

SQL 视图

SQL CREATE VIEW 语句

在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。

你可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。

【CREATE VIEW 语法】

sql 复制代码
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

注: 视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。

SQL CREATE VIEW 实例

以下SQL创建了一个视图,显示来自 Brazil 的所有客户:

【实例】

sql 复制代码
CREATE VIEW [Brazil Customers] AS
SELECT CustomerName, ContactName
FROM Customers
WHERE Country = 'Brazil';

我们可以查询上面这个视图:

【实例】

sql 复制代码
SELECT * FROM [Brazil Customers];

以下SQL创建了一个视图,用于选取 Products 表中所有单位价格高于平均单位价格的产品:

【实例】

sql 复制代码
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName, Price
FROM Products
WHERE Price > (SELECT AVG(Price) FROM Products);

我们可以像这样查询上面这个视图:

【实例】

sql 复制代码
SELECT * FROM [Products Above Average Price];

SQL 更新视图

您可以使用下面的语法来更新视图:

【SQL CREATE OR REPLACE VIEW 语法】

sql 复制代码
CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

以下SQL将 "City" 列添加到 "Brazil Customers" 视图中:

【实例】

sql 复制代码
CREATE OR REPLACE VIEW [Brazil Customers] AS
SELECT CustomerName, ContactName, City
FROM Customers
WHERE Country = 'Brazil';

SQL 撤销视图

您可以通过 DROP VIEW 命令来删除视图。

【SQL DROP VIEW 语法】

sql 复制代码
DROP VIEW view_name;

以下SQL将删除 "Brazil Customers" 视图:

【实例】

sql 复制代码
DROP VIEW [Brazil Customers];

SQL 托管

SQL 托管

如果您希望您的网站能够存储和检索数据库中的数据,那么您的 web 服务器应该能够访问使用 SQL 语言的数据库系统。

如果您的web服务器由Internet服务提供商(ISP)托管,则必须寻找SQL托管计划。

最常见的 SQL 主机数据库是 MySQL、MS SQL Server 和 MS Access。

MS SQL Server

Microsoft 的 SQL Server 是一种流行的数据库软件,用于高流量的数据库驱动网站。

SQL Server 是一个功能强大、健壮且功能齐全的 SQL 数据库系统。

Oracle

Oracle 也是一种流行的数据库软件,用于高流量的数据库驱动网站。

Oracle 是一个功能强大、健壮且功能齐全的 SQL 数据库系统。

MySQL

MySQL 也是一种流行的网站数据库软件。

MySQL 是一个功能强大、健壮且功能齐全的 SQL 数据库系统。

MySQL 是昂贵的 Microsoft 和 Oracle 解决方案的廉价替代方案。

Access

当一个网站只需要一个简单的数据库时,Microsoft Access 可以是一个解决方案。

Access 不太适合高流量,也没有MySQL、SQL Server 或 Oracle 强大。

MySQL, SQL Server 和 MS Access 的数据类型

列的数据类型定义该列可以容纳的值:整数、字符、货币、日期和时间、二进制等。

SQL 通用数据类型

数据库表中的每一列都必须有名称和数据类型。

SQL 开发人员必须在创建 SQL 表时决定表中的每个列将要存储的数据的类型。数据类型是一个标签,是便于 SQL 了解每个列期望存储什么类型的数据的指南,它也标识了 SQL 如何与存储的数据进行交互。

注: 数据类型在不同的数据库中可能有不同的名称。即使名称相同,大小和其他细节也可能不同!请始终检查数据库文档!

MySQL 数据类型 (Version 8.0)

在 MySQL 中,有三种主要的类型:String(文本字符串)、Number(数字)和 Date/Time(日期/时间)类型。

【String 类型】

数据类型 描述
CHAR(size) 固定长度的字符串(可以包含字母、数字和特殊字符)。size 参数以字符为单位指定列长度-可以是 0 到 255。默认值为 1
VARCHAR(size) 可变长度字符串(可以包含字母、数字和特殊字符)。size 参数以字符为单位指定最大列长度-可以是 0 到 65535
BINARY(size) 等于CHAR(),但存储二进制字节字符串。size 参数以字节为单位指定列长度。默认值为 1
VARBINARY(size) 等于VARCHAR(),但存储二进制字节字符串。size 参数以字节为单位指定最大列长度。
TINYBLOB 用于 BLOB (二进制大对象)。最大长度:255 字节
TINYTEXT 保存最大长度为 255 个字符的字符串
TEXT(size) 保存最大长度为 65535 字节的字符串
BLOB(size) 用于 BLOB (二进制大对象)。最多可容纳 65535 字节的数据
MEDIUMTEXT 保存最大长度为 16777215个字符的字符串
MEDIUMBLOB 对于 BLOB(二进制大对象)。 最多可容纳 16,777,215 字节的数据
LONGTEXT 保存最大长度为 4,294,967,295 个字符的字符串
LONGBLOB 对于 BLOB(二进制大对象)。 最多可容纳 4,294,967,295 字节的数据
ENUM(val1, val2, val3, ...) 只能有一个值的字符串对象,从可能值列表中选择。 您最多可以在一个 ENUM 列表中列出 65535 个值。 如果插入的值不在列表中,则将插入一个空白值。 这些值按您输入的顺序排序
SET(val1, val2, val3, ...) 可以有 0 个或多个值的字符串对象,从可能的值列表中选择。 一个 SET 列表中最多可以列出 64 个值

【Numeric 类型】

数据类型 描述
BIT(size) 位值类型。每个值的位数在 size 中指定。 size 参数可以保存从 1 到 64 的值。size 的默认值为 1。
TINYINT(size) 一个非常小的整数。有符号范围是-128 到 127。无符号范围是 0 到 255。size 参数指定最大显示宽度(即 255)
BOOL 零被认为是假,非零值被认为是真。
BOOLEAN Equal to BOOL
SMALLINT(size) 一个小整数。有符号范围是 -32768 到 32767。无符号范围是 0 到 65535。size 参数指定最大显示宽度(即 255)
MEDIUMINT(size) 一个中等整数。有符号范围是 -8388608 到 8388607。无符号范围是 0 到 16777215。size 参数指定最大显示宽度(即 255)
INT(size) 一个中等整数。有符号范围是 -2147483648 到 2147483647。无符号范围是 0 到 4294967295。size 参数指定最大显示宽度(即 255)
INTEGER(size) Equal to INT(size)
BIGINT(size) 一个大整数。有符号范围是-9223372036854775808到9223372036854775807。无符号范围是0到18446744073709551615。size参数指定最大显示宽度(即255)
FLOAT(size , d) 一个浮点数。 size 中指定了总位数。小数点后的位数在 d 参数中指定。此语法在 MySQL 8.0.17 中已弃用,并将在未来的 MySQL 版本中删除
FLOAT(p) 一个浮点数。 MySQL 使用 p 值来确定是使用 FLOAT 还是 DOUBLE 作为结果数据类型。如果 p 是从 0 到 24,则数据类型变为 FLOAT()。如果 p 是从 25 到 53,则数据类型变为 DOUBLE()
DOUBLE(size , d) 一个正常大小的浮点数。 size 中指定了总位数。 d参数中指定小数点后的位数
DOUBLE PRECISION(size , d)
DECIMAL(size , d) 一个精确的定点数。 size 中指定了总位数。小数点后的位数在 d 参数中指定。 size 的最大数为 65。d 的最大数为 30。size 的默认值为 10。< em>d 为 0。
DEC(size , d) 等于 DECIMAL(size,d)

注: 这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。

【Date 类型】

数据类型 描述
DATE 日期。格式:YYYY-MM-DD。支持的范围是从 '1000-01-01' 到 '9999-12-31'
DATETIME(fsp) 日期和时间组合。格式:YYYY-MM-DD hh:mm:ss。支持的范围是从"1000-01-01 00:00:00"到"9999-12-31 23:59:59"。 在列定义中添加 DEFAULT 和 ON UPDATE 以获得自动初始化并更新到当前日期和时间
TIMESTAMP(fsp) 时间戳。 TIMESTAMP 值存储为自 Unix 纪元 ('1970-01-01 00:00:00' UTC) 以来的秒数。格式:YYYY-MM-DD hh:mm:ss。支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC。 可以使用列定义中的 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 指定自动初始化和更新到当前日期和时间
TIME(fsp) A time。格式:hh:mm:ss。支持的范围是从 '-838:59:59' 到 '838:59:59'
YEAR 四位数格式的年份。允许采用四位数格式的值:1901 到 2155 和 0000。 MySQL 8.0 不支持两位数格式的年份。

SQL Server 数据类型

【String 类型】

数据类型 描述 Max size Storage
char(n) 定宽字符串 8,000 个字符 定义宽度
varchar(n) 可变宽度字符串 8,000 个字符 2 字节 + 字符数
varchar(max) 可变宽度字符串 1,073,741,824 个字符 2 字节 + 字符数
text 可变宽度字符串 2GB 文本数据 4 字节 + 字符数
nchar 固定宽度的 Unicode 字符串 4,000 个字符 定义宽度 x 2
nvarchar 可变宽度 Unicode 字符串 4,000 个字符
nvarchar(max) 可变宽度 Unicode 字符串 536,870,912 个字符
ntext 可变宽度 Unicode 字符串 2GB 文本数据
binary(n) 固定宽度二进制字符串 8,000 字节
varbinary 可变宽度二进制字符串 8,000 字节
varbinary(max) 可变宽度二进制字符串 2GB
image 可变宽度二进制字符串 2GB

【Numeric 类型】

数据类型 描述 Storage
bit 可以是 0、1 或 NULL 的整数
tinyint 允许从 0 到 255 的整数 1 字节
smallint 允许 -32,768 和 32,767 之间的整数 2 字节
int 允许介于 -2,147,483,648 和 2,147,483,647 之间的整数 4 字节
bigint 允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的整数 8 字节
decimal(p,s) 固定精度和小数位数。 允许从 -10^38 +1 到 10^38 --1 的数字。 p 参数表示可以存储的最大总位数(小数点的左边和右边)。 p 必须是 1 到 38 之间的值。默认值为 18。 s 参数表示小数点右侧存储的最大位数。 s 必须是从 0 到 p 的值。默认值为 0 5-17 字节
numeric(p,s) 固定精度和小数位数。 允许从 -10^38 +1 到 10^38 --1 的数字。 p 参数表示可以存储的最大总位数(小数点的左边和右边)。 p 必须是 1 到 38 之间的值。默认值为 18。 s 参数表示小数点右侧存储的最大位数。 s 必须是从 0 到 p 的值。默认值为 0 5-17 字节
smallmoney 货币数据从 -214,748.3648 到 214,748.3647 4 字节
money 货币数据从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 8 字节
float(n) 从 -1.79E + 308 到 1.79E + 308 的浮点精度数数据。 n 参数指示该字段应保存 4 字节还是 8 字节。 float(24) 保存一个 4 字节的字段,而 float(53) 保存一个 8 字节的字段。 n 的默认值为 53。 4 或 8 个字节
real 从 -3.40E + 38 到 3.40E + 38 的浮点精度数数据 4 字节

【Date 类型】

数据类型 描述 Storage
datetime 从 1753 年 1 月 1 日到 9999 年 12 月 31 日,精度为 3.33 毫秒 8 字节
datetime2 从 0001 年 1 月 1 日到 9999 年 12 月 31 日,精度为 100 纳秒 6-8 字节
smalldatetime 从 1900 年 1 月 1 日到 2079 年 6 月 6 日,精度为 1 分钟 4 字节
date 只存储一个日期。从 0001 年 1 月 1 日到 9999 年 12 月 31 日 3 个字节
time 仅以 100 纳秒的精度存储时间 3-5 字节
datetimeoffset 与 datetime2 相同,但增加了时区偏移量 8-10 字节
timestamp 存储每次创建或修改行时都会更新的唯一编号。时间戳值基于内部时钟,并不对应于实时。每个表可能只有一个时间戳变量

【其他数据类型】

数据类型 描述
sql_variant 最多可存储 8,000 字节的各种数据类型的数据,除了 text、ntext 和 timestamp
uniqueidentifier 存储全局唯一标识符 (GUID)
xml 存储 XML 格式的数据。 最大 2GB
cursor 存储对用于数据库操作的游标的引用
table 存储一个结果集以供以后处理

Microsoft Access 数据类型

数据类型 描述 Storage
Text 用于文本或文本和数字的组合。最多 255 个字符
Memo 备忘录用于大量文本。最多可存储 65,536 个字符。 (注: 您无法对备注字段进行排序。但是,它们是可搜索的)
Byte 允许从 0 到 255 的整数 1 字节
Integer 允许 -32,768 和 32,767 之间的整数 2 字节
Long 允许介于 -2,147,483,648 和 2,147,483,647 之间的整数 4 字节
Single 单精度浮点数。将处理大多数小数 4 字节
Double 双精度浮点。将处理大多数小数 8 字节
Currency 用于货币。最多可保存 15 位整数,外加 4 位小数。 (注:您可以选择使用哪个国家/地区的货币) 8 字节
AutoNumber AutoNumber 字段自动为每条记录分配自己的编号,通常从 1 开始 4 字节
Date/Time 用于日期和时间 8 字节
Yes/No 逻辑字段可以显示为是/否、真/假或开/关。在代码中,使用常量 True 和 False(相当于 -1 和 0)。 (注:是/否字段中不允许有空值) 1 位
Ole Object 可以存储图片、音频、视频或其他 BLOB(Binary Large OBjects) 高达 1GB
Hyperlink 包含指向其他文件的链接,包括网页
Lookup Wizard 让您输入一个选项列表,然后可以从下拉列表中进行选择 4 字节
相关推荐
威哥爱编程5 分钟前
SQL Server 数据太多如何优化
数据库·sql·sqlserver
cuisidong199728 分钟前
5G学习笔记三之物理层、数据链路层、RRC层协议
笔记·学习·5g
乌恩大侠29 分钟前
5G周边知识笔记
笔记·5g
Mephisto.java40 分钟前
【大数据学习 | kafka高级部分】kafka的kraft集群
大数据·sql·oracle·kafka·json·hbase
Mephisto.java41 分钟前
【大数据学习 | kafka高级部分】kafka的文件存储原理
大数据·sql·oracle·kafka·json
咔叽布吉2 小时前
【论文阅读笔记】CamoFormer: Masked Separable Attention for Camouflaged Object Detection
论文阅读·笔记·目标检测
johnny2332 小时前
《大模型应用开发极简入门》笔记
笔记·chatgpt
亦枫Leonlew2 小时前
微积分复习笔记 Calculus Volume 1 - 4.7 Applied Optimization Problems
笔记·数学·微积分·1024程序员节
小肥象不是小飞象2 小时前
(六千字心得笔记)零基础C语言入门第八课——函数(上)
c语言·开发语言·笔记·1024程序员节
星LZX2 小时前
WireShark入门学习笔记
笔记·学习·wireshark