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" 表:
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】
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" 表:
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 语句:
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 语句:
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 | 零被认为是假,非零值被认为是真。 |
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 字节 |
相关文章:
SQL 系列教程(六)
目录 SQL FOREIGN KEY 约束 SQL FOREIGN KEY 约束 创建表时的 FOREIGN KEY 约束 修改表时的 FOREIGN KEY 约束 撤销 FOREIGN KEY 约束 SQL CHECK 约束 SQL CHECK 约束 创建表时的 CHECK 约束 修改表的 CHECK 约束 撤销 CHECK 约束 SQL DEFAULT 约束 SQL DEFAULT 约…...
CocoaPods的安装和使用
前言 本篇文章讲述CocoaPods的安装和使用 安装cocoaPods 如果电脑没有安装过cocoaPods,需要先安装,使用下面的命令: sudo gem install cocoapods输入密码后开始安装,需要等待。。。但是我这里报错了。 The last version of d…...
Linux下软件安装的命令【RPM,YUM】及常用服务安装【JDK,Tomcat,MySQL】
Linux下软件安装的命令 源码安装 以源代码安装软件,每次都需要配置操作系统、配置编译参数、实际编译,最后还要依据个人喜好的方式来安装软件。这个过程很麻烦很累人。 RPM软件包管理 RPM安装软件的默认路径: 注意: /etc 配置文件放置目录…...
【linux】-telnet服务安装
1. 说明 telnet 分为 :telnet 服务端 和 telnet 客户端 本文只演示安装 telnet服务端 2. 安装telnet服务端、以及守护服务xinetd 2.1 检测telnet-server的rpm包是否安装 rpm -qa telnet-server 2.2 若未安装,则安装telnet-server࿰…...
安卓开发——Activity及常用布局和控件的使用
Activity及常用布局和控件的使用 一、实验目的 掌握Android常用布局和控件的使用。 Activity组件使用和Intent机制,加强对Activity生命周期的理解 二、实验设备及器件 Android Studio,图标:http://10.37.59.210/download/icon/MobileShopI…...
.net访问oracle数据库性能问题
问题: 生产环境相同的inser语句在别的非.NET程序相应明显快于.NET程序,执行时间相差比较大,影响正常业务运行,测试环境反而正常。 问题详细诊断过程 问题初步判断诊断过程: 查询插入慢的sql_id 检查对应的执行计划…...
vue上传解析excel表格并修改字段名
目录 1.安装 xlsx 2.引入 3.使用 1.安装 xlsx npm install xlsx 2.引入 import * as XLSX from xlsx; 3.使用 <template><div class"UploadCptOutbox"><div class"Tooloutbox"><el-uploadclass"upload"ref"u…...
jupyter notebook删除kernel & conda 删除虚拟环境
jupyter kernelspec list #列出jupyter的所有kernel jupyter kernelspec remove kernel_name #删除特定的kerneljupyter kernelspec list 命令可以在任何激活的环境中运行,无论是 base 环境还是某个虚拟环境。该命令将列出所有已注册的 Jupyter 内核,包括…...
Redis在生产环境中可能遇到的问题与解决方案(三)
11. Redis高可用问题 问题描述 在Redis集群中,当主节点发生故障时,需要快速切换到备用主节点,确保系统高可用。 解决方案 Redis Sentinel: 使用Redis Sentinel进行主从节点的监控和自动故障转移。 备用主节点: 配置…...
【C++干货铺】 RAII实现智能指针
个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 为什么需要智能指针? 内存泄漏 什么是内存泄漏,内存泄露的危害 内存泄漏的分类 堆内存泄漏(Heap leak) 系统资…...
【竞技宝jjb.lol】LOL:xiaohu岩雀天命抢龙扭转乾坤 WBG2-0轻取RA
北京时间2024年1月26日,英雄联盟LPL2024春季赛在昨天迎来第一周第四个比赛日,本日首场比赛由WBG对阵RA。本场比赛RA虽然在首局前期给了WBG很大的压力,但WBG还是凭借后期出色的团战配合拿下胜利,最终WBG2-0轻取RA。以下是本场比赛的…...
GoZero微服务个人探究之路(九)api文件编写总结
参考来源go-zero官方文档https://go-zero.dev/docs/tutorials 前言 go-zero是目前star最多的go语言微服务框架,api 是 go-zero特殊的语言,类型文件,go-zero自带的goctl可以通过.api文件生成http服务代码 api文件内容编写 不可使用关键字 …...
泛型..
1.泛型 所谓泛型 在类定义处是一种类型参数(我们平常所见到的参数指的就是方法中的参数 他接收有外界传递来的值 然后在方法中进行使用) 在类内部的话 则充当一种占位符 并且还提高了代码的复用率 何以见得提高了代码的复用率 其实就是通过对比使用了泛型技术和没有使用泛型技…...
Android App开发基础(1)—— App的开发特点
本文介绍基于Android系统的App开发常识,包括以下几个方面:App开发与其他软件开发有什么不一样,App工程是怎样的组织结构又是怎样配置的,App开发的前后端分离设计是如何运作实现的,App的活动页面是如何创建又是如何跳转…...
docker-compose初探
我一直直接使用docker命令来创建容器,没有怎么用过docker-compose。也不知道docker-compose和docker有什么区别,docker-compose有什么好处。 现在我约略认为,docker-compose是一个简化docker命令的工具,或者说,它是能…...
【webrtc】跟webrtc学时间戳、序号类型转换
间隔ms src\modules\congestion_controller\remb_throttler.ccnamespace {constexpr TimeDelta kRembSendInterval = TimeDelta::Millis(200); } // namespace百分比的处理 src\modules\congestion_controller\remb_throttler.ccvoid RembT...
文件操作与IO(一些小项目)
在指定目录中寻找文件 扫描指定目录,并找到名称对应的所有文件(不包含目录). import java.io.File; import java.util.Scanner;public class Project1 {public static void main(String[] args) {//1.输入必要的信息Scanner sc new Scanner(System.in);System.out.println(&…...
C语言-算法-线性dp
[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中,从 7 → 3 → 8 →…...
Pandas应用-股票分析实战
股票时间序列 时间序列: 金融领域最重要的数据类型之一 股价、汇率为常见的时间序列数据 趋势分析: 主要分析时间序列在某一方向上持续运动 在量化交易领域,我们通过统计手段对投资品的收益率进行时间序列建模,以此来预测未来的收…...
Database history tablesupgraded
zabbix升级到6之后,配置安装完成会有一个红色输出,但是不影响zabbix使用,出于强迫症,找到了该问题的解决方法。 Database history tables upgraded: No. Support for the old numeric type is deprecated. Please upgrade to nume…...
Dify学习笔记-应用发布(四)
1、发布为公开 Web 站点 使用 Dify 创建 AI 应用的一个好处在于,你可以在几分钟内就发布一个可供用户使用的 Web 应用,该应用将根据你的 Prompt 编排工作。 如果你使用的是自部署的开源版,该应用将运行在你的服务器上 如果你使用的是云服务&…...
优化用户体验测试应用领域:提升产品质量与用户满意度
在当今数字化时代,用户体验测试应用已经成为确保产品质量、提升用户满意度的关键工具。随着技术的不断发展,用户的期望也在不断演变,因此,为了保持竞争力,企业必须将用户体验置于产品开发的核心位置。本文将探讨用户体…...
顶顶通呼叫中心中间件机器人压力测试配置(mod_cti基于FreeSWITCH)
介绍 顶顶通呼叫中心中间件机器人压力测试(mod_cit基于FreeSWITCH) 一、配置acl.conf 打开ccadmin-》点击配置文件-》点击acl.conf-》我这里是已经配置好了的,这里的192.168.31.145是我自己的内网IP,你们还需要自行修改 二、配置线路 打开ccadmin-&g…...
Debezium发布历史87
原文地址: https://debezium.io/blog/2020/03/19/integration-testing-for-change-data-capture-with-testcontainers/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 使用 Testcontainer 进行变更数…...
Leetcode131.分割回文串-Palindrome Patitioning-Python-回溯法
解题思路: 1.切割回文串,可以用解决找组合问题的思路解决,而解决组合问题,可以用回溯法,故本题选择回溯法。 2.理解两个事情:1.递归函数里的for循环是横向遍历给定字符串s的每一个字母。2.针对s的每一个字…...
Java面试——基础篇
目录 1、java语言有哪些优点和缺点? 2、JVM 、 JDK 和 JRE的关系 3、为什么说 Java 语言“编译与解释并存”? 4、Java和c的区别 5、基本数据类型 5.1、java的8种基本数据类型: 5.2、基本类型和包装类型的区别: 5.3、包装类型的缓存机…...
C++——结构体
1,结构体基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。像int(整型),浮点型,bool型,字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义…...
C++技术要点总结, 面试必备, 收藏起来慢慢看
目录 1. 语言对比 1.1 C 11 新特性 2.2 C 和 C 的区别 2.3 Python 和 C 的区别 2. 编译内存相关 2.1. C 程序编译过程 2.2. C 内存管理 2.3. 栈和堆的区别 2.4. 变量的区别 2.5. 全局变量定义在头文件中有什么问题? 2.6. 内存对齐 2.7. 什么是内存泄露 …...
VR数字展厅,平面静态跨越到3D立体化时代
近些年,VR的概念被越来越多的人提起,较为常见的形式就是VR数字展厅。VR数字展厅的出现,让各地以及各行业的展厅展馆的呈现和宣传都发生了很大的改变和革新,同时也意味着展览传播的方式不再局限于原来的图文、视频,而是…...
Linux中LVM实验
LVM实验: 1、分区 -L是大小的意思-n名称的意思 从vg0(卷组)分出来 2、格式化LV逻辑卷 LVM扩容 如果icdir空间不够了, 扩展空间lvextend -L 5G /dev/vg0/lv1 /dev/vg0/lv1(pp,vg,lv) 刷新文件系统xfs_growfs /lvdir VG扩容 …...
网站开发毕设的需求分析/软文推荐
人民网链接:http://www.people.com.cn来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/39335/viewspace-350728/,如需转载,请注明出处,否则将追究法律责任。 转载于:http://blog.itpub.net/39335/viewspace-350728…...
网站地图创建/网站关键词排名快速提升
一、结构体,Map,切片序列化 package mainimport ("encoding/json""fmt" )//定义一个结构体 type Monster struct {Name stringAge intBirthday stringSal float64Skill string } //将结构体序列化 //初始化结构体 func testStruct(…...
打广告型的营销网站/网站卖链接
1. 首先卸载已经安装的旧版的CMake apt-get autoremove cmake 2.跳转到/usr cd /usr 3.下载: wget http://www.cmake.org/files/v3.2/cmake-3.2.2.tar.gz 4. 解压: tar zxvf cmake-3.2.2.tar.gz 5.跳转到cmake-3.2.2下 cd cmake-3.2.2 6.sudo ./…...
兰州市七里河建设局网站/网站推广方案模板
点击“蓝字”关注我们如果你是一个嵌入式工程师,那么入门的第1个例子很可能就是 - 呼吸灯。那在本次视频中,赛灵思嵌入式工程师张超将和大家一起,用最简单的例子展示如何使用Xilinx Zynq Ultra Scale MPSoC器件,在搭载Linux操作系…...
建站点的步骤/网站建设与管理
在javascript中有时会看到有两个!!的用法 var foo; alert(!foo);//undifined情况下,一个感叹号返回的是true; alert(!goo);//null情况下,一个感叹号返回的也是true; var o{flag:true}; var test!!o.flag;//等效于var testo.flag||false; alert(test…...
匿名聊天网站怎么做/seo需要培训才能找到工作吗
1、当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外围对象的所有成员,而不需要任何条件。此外,内部类还拥有其外围类的所有元素的访问权。这是如何做到的呢?当某个外围类的对象…...