SQL 系列教程(六)

目录

SQL FOREIGN KEY 约束

SQL FOREIGN KEY 约束

创建表时的 FOREIGN KEY 约束

修改表时的 FOREIGN KEY 约束

撤销 FOREIGN KEY 约束

SQL CHECK 约束

SQL CHECK 约束

创建表时的 CHECK 约束

修改表的 CHECK 约束

撤销 CHECK 约束

SQL DEFAULT 约束

SQL DEFAULT 约束

创建表时的 DEFAULT 约束

修改表的 DEFAULT 约束

撤销 DEFAULT 约束

SQL CREATE INDEX 语句

SQL CREATE INDEX 语句

CREATE INDEX 实例

DROP INDEX 语句

SQL 自增字段

自增字段

用于 MySQL 的语法

用于 SQL Server 的语法

用于 Access 的语法

用于 Oracle 的语法

SQL 日期函数

SQL 日期

SQL Date 数据类型

日期处理

SQL 视图

SQL CREATE VIEW 语句

SQL CREATE VIEW 实例

SQL 更新视图

SQL 撤销视图

SQL 托管

SQL 托管

MS SQL Server

Oracle

MySQL

Access

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

SQL 通用数据类型

MySQL 数据类型 (Version 8.0)

SQL Server 数据类型

Microsoft Access 数据类型


SQL FOREIGN KEY 约束

SQL FOREIGN KEY 约束

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

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

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

请看下面两个表:

"Persons" 表:

PersonIDLastNameFirstNameAge
1HansenOla30
2SvendsonTove23
3PettersenKari20

"Orders" 表:

OrderIDOrderNumberPersonID
1778953
2446783
3224562
4245621

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

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

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

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

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

创建表时的 FOREIGN KEY 约束

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

【MySQL】

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】

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】

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】

ALTER TABLE Orders
ADD FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);

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

【MySQL / SQL Server / Oracle / MS Access】

ALTER TABLE Orders
ADD CONSTRAINT FK_PersonOrder
FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);

撤销 FOREIGN KEY 约束

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

【MySQL】

ALTER TABLE Orders
DROP FOREIGN KEY FK_PersonOrder;

【SQL Server / Oracle / MS Access】

ALTER TABLE Orders
DROP CONSTRAINT FK_PersonOrder;

SQL CHECK 约束

SQL CHECK 约束

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

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

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

创建表时的 CHECK 约束

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

【MySQL】

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】

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】

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】

ALTER TABLE Persons
ADD CHECK (Age>=18);

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

【MySQL / SQL Server / Oracle / MS Access】

ALTER TABLE Persons
ADD CONSTRAINT CHK_PersonAge CHECK (Age>=18 AND City='Sandnes');

撤销 CHECK 约束

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

【SQL Server / Oracle / MS Access】

ALTER TABLE Persons
DROP CONSTRAINT CHK_PersonAge;

【MySQL】

ALTER TABLE Persons
DROP CHECK CHK_PersonAge;

SQL DEFAULT 约束

SQL DEFAULT 约束

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

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

创建表时的 DEFAULT 约束

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

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

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

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

CREATE TABLE Orders (ID int NOT NULL,OrderNumber int NOT NULL,OrderDate date DEFAULT GETDATE()
);

修改表的 DEFAULT 约束

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

【MySQL】

ALTER TABLE Persons
ALTER City SET DEFAULT 'Sandnes';

【SQL Server】

ALTER TABLE Persons
ADD CONSTRAINT df_City
DEFAULT 'Sandnes' FOR City;

【MS Access】

ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'Sandnes';

【Oracle】

ALTER TABLE Persons
MODIFY City DEFAULT 'Sandnes';

撤销 DEFAULT 约束

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

【MySQL】

ALTER TABLE Persons
ALTER City DROP DEFAULT;

【SQL Server / Oracle / MS Access】

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT;

SQL CREATE INDEX 语句

SQL CREATE INDEX 语句

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

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

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

【CREATE INDEX 语法】

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

CREATE INDEX index_name
ON table_name (column1, column2, ...);

【CREATE UNIQUE INDEX 语法】

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

CREATE UNIQUE INDEX index_name
ON table_name (column1, column2, ...);

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

CREATE INDEX 实例

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

CREATE INDEX idx_lastname
ON Persons (LastName);

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

CREATE INDEX idx_pname
ON Persons (LastName, FirstName);

DROP INDEX 语句

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

【MS Access】

DROP INDEX index_name ON table_name;

【SQL Server】

DROP INDEX table_name.index_name;

【DB2/Oracle】

DROP INDEX index_name;

【MySQL】

ALTER TABLE table_name
DROP INDEX index_name;

SQL 自增字段

自增字段

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

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

用于 MySQL 的语法

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

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 语法:

ALTER TABLE Persons AUTO_INCREMENT=100;

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

INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen');

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

用于 SQL Server 的语法

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

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"列指定值(将自动添加唯一值):

INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen');

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

用于 Access 的语法

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

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"列指定值(将自动添加唯一值):

INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen');

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

用于 Oracle 的语法

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

请使用下面的 CREATE SEQUENCE 语法:

CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10;

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

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

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" 表:

OrderIdProductNameOrderDate
1Geitost2008-11-11
2Camembert Pierrot2008-11-09
3Mozzarella di Giovanni2008-11-11
4Mascarpone Fabioli2008-10-29

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

我们使用下面的 SELECT 语句:

SELECT * FROM Orders WHERE OrderDate='2008-11-11'

结果集如下所示:

OrderIdProductNameOrderDate
1Geitost2008-11-11
3Mozzarella di Giovanni2008-11-11

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

OrderIdProductNameOrderDate
1Geitost2008-11-11 13:23:44
2Camembert Pierrot2008-11-09 15:45:21
3Mozzarella di Giovanni2008-11-11 11:12:01
4Mascarpone Fabioli2008-10-29 14:56:59

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

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 语法】

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

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

SQL CREATE VIEW 实例

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

【实例】

CREATE VIEW [Brazil Customers] AS
SELECT CustomerName, ContactName
FROM Customers
WHERE Country = 'Brazil';

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

【实例】

SELECT * FROM [Brazil Customers];

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

【实例】

CREATE VIEW [Products Above Average Price] AS
SELECT ProductName, Price
FROM Products
WHERE Price > (SELECT AVG(Price) FROM Products);

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

【实例】

SELECT * FROM [Products Above Average Price];

SQL 更新视图

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

【SQL CREATE OR REPLACE VIEW 语法】

CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

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

【实例】

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

SQL 撤销视图

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

【SQL DROP VIEW 语法】

DROP VIEW view_name;

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

【实例】

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零被认为是假,非零值被认为是真。
BOOLEANEqual 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(sized)一个浮点数。 size 中指定了总位数。小数点后的位数在 d 参数中指定。此语法在 MySQL 8.0.17 中已弃用,并将在未来的 MySQL 版本中删除
FLOAT(p)一个浮点数。 MySQL 使用 p 值来确定是使用 FLOAT 还是 DOUBLE 作为结果数据类型。如果 p 是从 0 到 24,则数据类型变为 FLOAT()。如果 p 是从 25 到 53,则数据类型变为 DOUBLE()
DOUBLE(sized)一个正常大小的浮点数。 size 中指定了总位数。 d参数中指定小数点后的位数
DOUBLE PRECISION(sized)
DECIMAL(sized)一个精确的定点数。 size 中指定了总位数。小数点后的位数在 d 参数中指定。 size 的最大数为 65。d 的最大数为 30。size 的默认值为 10。< em>d 为 0。
DEC(sized)等于 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 sizeStorage
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.36474 字节
money货币数据从 -922,337,203,685,477.5808 到 922,337,203,685,477.58078 字节
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 字节
AutoNumberAutoNumber 字段自动为每条记录分配自己的编号,通常从 1 开始4 字节
Date/Time用于日期和时间8 字节
Yes/No逻辑字段可以显示为是/否、真/假或开/关。在代码中,使用常量 True 和 False(相当于 -1 和 0)。 (注:是/否字段中不允许有空值)1 位
Ole Object可以存储图片、音频、视频或其他 BLOB(Binary Large OBjects)高达 1GB
Hyperlink包含指向其他文件的链接,包括网页
Lookup Wizard让您输入一个选项列表,然后可以从下拉列表中进行选择4 字节

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[二叉树专题]二叉树最大高度|n叉树最大高度

一、二叉树最大高度 class Solution { public:int maxDepth(TreeNode* root) {if(rootnullptr)return 0;int left maxDepth(root->left)1;int rightmaxDepth(root->right)1;return left>right?left:right;} }; 二、n叉树最大高度 class Solution { public:int maxDe…

QSqlQuery 执行Update 判断执行成功与否

1.执行更新操作的SQL语句 update s_info set name"009" where contact_number "13511112222" 怎么样判断是否确实更新操作是执行成功的 &#xff0c;可以通过下列语句判断 query.numRowsAffected() > 0 2.主要的几步操作如下: QSqlQuery query;query.…

力扣hot100 实现Trie(前缀树) 字典树 一题双解

Problem: 208. 实现 Trie (前缀树) 文章目录 思路复杂度&#x1f49d; TrieNode版&#x1f49d; 二维数组版 思路 &#x1f469;‍&#x1f3eb; 宫水三叶 复杂度 &#x1f49d; TrieNode版 public class Trie {class TrieNode{boolean end;//标记是否有以当前节点为结尾的字…

【Origin绘图系列第4棒】桑基图

Origin绘制桑基图 桑基图&#xff08;Sankey diagram&#xff09;&#xff0c;即桑基能量分流图&#xff0c;也叫桑基能量平衡图。它是一种特定类型的流程图&#xff0c;右图中延伸的分支的宽度对应数据流量的大小&#xff0c;通常应用于能源、材料成分、金融等数据的可视化分…

Linux生成SSH公钥和密钥

目录 前言生成ssh keys使用公钥 前言 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于在不安全的网络上安全地进行远程访问和数据传输。它为用户提供了一种加密的通信方式&#xff0c;可以在客户端和服务器之间建立安全的连接。 SSH使用公钥加密技术…

阿里云幻兽帕鲁服务器创建和配置教程

如何自建幻兽帕鲁服务器&#xff1f;基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了&#xff0c;一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器&#xff0c;阿里云百科aliyunbaike.com分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程&…

计算机网络-奈氏准则和香农定理(码间串扰 二者区别)

文章目录 失真失真的一种现象-码间串扰奈氏准则&#xff08;奈溃斯特定理&#xff09;例题 香农定理例题 奈氏和香农 失真 就是指与原来的不一样了 两种情况 前三个是正相关&#xff0c;最后一个是负相关 码元传输速率越快&#xff0c;失真程度越严重的原因可能包括以下几点…

Spring进阶

文章目录 一、Spring复习二、Spring进阶a.Bean作用域b.SpringBean的生命周期c.Spring中的bean是线程安全的吗?Servlet是线程安全的吗?d.Bean循环依赖e.Servlet的过滤器与Spring拦截器区别f. SpringBoot自动装配原理一、Spring复习 对spring的认识和理解: spring是一个轻量级…

stm32中的SPI

SPI的简介 文章目录 SPI的简介物理层协议层基本通讯过程起始和终止信号数据有效性CPOL/CPHA及通讯模式 STM3的SPI特性及架构通讯引脚时钟控制逻辑数据控制逻辑整体控制逻辑通讯过程 代码配置实现指令集结构体的定义SPI时钟信号的定义SPI端口定义SPI命令 flash驱动代码初始化代码…

Sublime的安装及汉化

sublime安装 官网sublime 点击Windows 下载参考&#xff1a;傻瓜式下载 sublime汉化 1&#xff09;安装 Sublime Text 4 成功后&#xff0c;点击菜单 【Tools】 -> 【Install Package Control】&#xff1b; 注意&#xff1a;安装包控件需要等待一会&#xff0c;点击可…

探索Go 语言URL:解析与构建

探索Go 语言URL&#xff1a;解析与构建 在 Go 语言中&#xff0c;解析和处理 URL 是日常开发中常见的任务之一。URL&#xff08;统一资源定位符&#xff09;是指定 Web 资源位置的标准方式&#xff0c;它由多个部分组成&#xff0c;包括协议、主机、路径、查询参数等。本文将深…

python使用回溯算法搜索单词

对于在字母表中搜索单词的问题,这是一个二维空间问题,可以利用深度优先搜索算法和回溯算法来满足探索与退回的执行过程。 给定一个字母表table以及一个单词word,试求在字母表中是否存在此单词,在字母表中可以任意位置为起点,每一步只能水平移动或者垂直移动,也就是只能在…

开发嵌入式Linux应用程序框架-QT的初步了解

嵌入式QT&#xff08;Qt for Embedded Linux&#xff09;是一个用于开发嵌入式Linux应用程序的跨平台软件开发框架。它提供了一套完整的开发工具&#xff0c;包括一个强大的应用程序框架、一个全面的窗口系统、一个事件驱动的图形库以及一套用于开发嵌入式设备的工具。 嵌入式Q…

Go(四)gin框架

一、初识gin 1.1、下载和安装gin 下载包&#xff1a;go get github.com/gin-gonic/gin 使用go mod管理包&#xff1a; 1&#xff09;初始化 Go Modules&#xff1a;go mod init your_module_name&#xff0c;这将创建一个 go.mod 文件&#xff0c;记录你的项目的模块信息和当前…

Linux shell 命令多行结果赋值给变量

文章目录 Linux shell 命令多行结果赋值给变量 Linux shell 命令多行结果赋值给变量 需求&#xff1a; ​ 假设有两个脚本 a.sh b.sh &#xff0c;当前需要在 b.sh 中输出 a.sh 的结果&#xff0c;在 b.sh 脚本中需要使用参数接收 a.sh 的结果&#xff0c;但是输出格式要和 a.s…

js数组/对象的深拷贝与浅拷贝

文章目录 一、js中的深拷贝和浅拷贝二、浅拷贝1、Object.assign()2、利用es6扩展运算符&#xff08;...&#xff09; 二、深拷贝1、JSON 序列化和反序列化2、js原生代码实现3、使用第三方库lodash等 四、总结 一、js中的深拷贝和浅拷贝 在JS中&#xff0c;深拷贝和浅拷贝是针对…

鸿蒙开发会是前端程序员的下一个春天吗?

前言 最近前端的大环境不太行&#xff0c;之前身处在前端的自己薪资也越来越无望了&#xff0c;隐隐约约感觉前端做不下去了&#xff0c;2024前端找不到工作要转行吗&#xff1f; 看新闻的过程中&#xff0c;**发现越来越多的巨头公司融入鸿蒙生态建设&#xff0c;鸿蒙“朋友…

【C++】入门

结束数据结构初阶的学习后&#xff0c;很高兴继续学习C&#xff0c;欢迎大家一起交流~ 目录 C关键字 命名空间 命名空间定义 命名空间使用 C输入&输出 缺省参数 缺省参数概念 缺省参数分类 函数重载 函数重载概念 C支持函数重载的原理--名字修饰 引用 引用概念…

【大根堆】【C++算法】871 最低加油次数

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 大根堆 优先队列 LeetCode:871最低加油次数 汽车从起点出发驶向目的地&#xff0c;该目的地位于出发位置东面 target 英里处。 沿途有加油站&#xff0c;用数组 stations 表示。其中 statio…

用4KB内存寻找重复元素(算法村第十五关青铜挑战)

在海量数据中&#xff0c;普通的数组、链表、Hash、树等等结构无效&#xff0c;因为内存空间不足。而常规的递归、排序&#xff0c;回溯、贪心和动态规划等思想也无效&#xff0c;因为执行超时。这类问题该如何下手呢&#xff1f;这里介绍三种非常典型的思路&#xff1a; 1.使…