SQL语句 总结
查询语句
基础查询语句
- show tables
- SELECT
- between
- like
- AND
- OR
- NOT
- IN
- MAX
- MIN
- SUM
- AVG
- count
- ucase
- lcase
- MID
- LEN
- ROUND
- NOW
- FORMAT
- ANY
- ALL
show tables -- 显示所有表名
select * from <table_name>
select * from <table_name> where Age between 18 AND 20 -- 18到20之间
select * from <table_name> where field1 like '%value' -- 模糊查找,其中,占位符'%'代表任意多,'?'代表一个
select * from <table_name> where field1 Age>18 And Name LIKE '张%' -- 年纪>18 并且 姓张的
select * from <table_name> where field1 Age>18 OR Name LIKE '张%' -- 年纪>18 或者 姓张的
select * from <table_name> where Age IN (18,19,20) -- 年纪为18,19,20其中之一
select * from <table_name> where Name NOT LIKE '张%' -- 不姓张的
select Name AS TheName from <table_name> -- 把column Name的名字显示为TheName
select MAX(Score) from Students -- 显示分数最高的
select MIN(Score) from Students -- 显示分数最低的
select SUM(Score) from SC where StudentID='1001' -- 学号为1001的人,所有成绩的和
select AVG(Score) from SC where StudentID='1001' -- 学号为1001的人,所有成绩平均值
select count(*) as total_count from <table_name> -- 显示查到的数据的数量
SELECT UCASE(column_name) FROM table_name -- 转换为大写
SELECT LCASE(column_name) FROM table_name -- 转换为小写
SELECT MID(column_name,start[,length]) FROM table_name
-- 提取字符,start:开始位置(起始位1),length:要返回的字符数,不填写返回所有剩余文本
SELECT LEN(column_name) FROM table_name -- 字符串长度
SELECT ROUND(column_name,decimals) FROM table_name -- 指定小数位数取舍 decimals:剩下的小数位数
SELECT NOW() FROM table_name -- 获取现在时间
SELECT FORMAT(column_name,format) FROM table_name -- 格式化如 FORMAT(Now(),'YYYY-MM-DD')
select * from S where age > all (select age from S where class = 1) -- 要查找一个学生,其年龄大于1班所有学生
select * from S where age > any (select age from S where class = 1) -- 要查找一个学生,其年龄大于1班任意一个学生即可(等同于:大于年龄最小的学生)
高级查询语句
Order By 顺序
select * from <table_name> Order By Age,Score [DESC] -- 其中,desc为降序
select * from <table_name> Order By Age DESC,Score -- 基于Age降序,然后基于Score升序
Distinct 去除重复值
select Distinct city from <table_name> -- 如果有重复的值,只显示一个
Group by 结合合计函数
select AVG(Score) from <table_name> group by StudentID
Having 基于Group by的条件函数
SELECT name
FROM t<table_name>
Group By StudentID
Having AVG(Score) >= 60
-- 平均分>=60的学生的名字
子查询
delete from Students where ID NOT in (SELECT MAX(ID) FROM Students) -- 删除ID最大的学生
TOP 记录数量/LIMIT(MySQL)
SELECT TOP 3 ID,Name FROM Students ORDER BY Age DESC -- 显示年纪最高的3个学生的ID和姓名
-- mysql:
SELECT * FROM Students ORDER BY Age DESC LIMIT 0,3 --从第0个开始,取3个年纪最高的学生和ID
Case 计算条件列表
-- 简单表达式
CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
-- 简单搜索式
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
例子:
SELECT ID, Name, CASE Sex WHEN '0' THEN '男' WHEN '1' THEN '女' ELSE '其他' END AS Sex
FROM Students
-- 将 性别 原本为0,1的值,转换为男女
EXCEPT 排除 (与not in 的区别为:EXCEPT会自动去除重复的)
SELECT * FROM TableA EXCEPT (SELECT * FROM TableB) -- 在TableA中,但不在TableB中
INTERSECT 排除 (与 in 的区别为:INTERSECT会自动去除重复的)
SELECT * FROM TableA INTERSECT (SELECT * FROM TableB) -- 在TableA中,且在TableB中
联合查找
假设两个表:
Persons表
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
Orders表
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
两个表可以通过Id_P 连接起来。
结果集为:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
实现方法:
1.普通联合查找:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
2. Join On查找
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
不同的 SQL Join
除了在上面的例子中使用的 INNER JOIN(内连接),我们还可以使用其他几种连接。
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
- JOIN: 如果表中有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
Union,将两个表查询的内容连接到一起
select field_name from <table_name>
union
select field_name from <table_name>
union是默认去除重复的,如果允许重复值, 需要使用 Union ALL
修改操作语句
SELECT INTO 把查询到的数据,插入另一个表中
SELECT *
INTO new_table_name [IN external_database] -- IN 后面是另一个数据库的名字
FROM old_tablename
CREATE DATABASE 创建数据库
CREATE DATABASE database_name
CREATE TABLE 创建表
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
例子:
CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
空的Persons表类似下图:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
Constrains
创建表的限制
- NOT NULL: 不可以有NULL值(也就是非空)
- UNIQUE: 唯一标识
- PRIMARY KEY: 主键
- FOREIGN KEY:外键
- CHECK:限制值的范围
- DEFAULT:设置插入时的默认值
NOT NULL 与 UNIQUE
- NOT NULL: 不可以有NULL值(也就是非空)
- UNIQUE: 唯一标识
- ADD UNIQUE:表已经创建后,修改UNIQUE
- 命名约束,多约束 :
- DROP CONSTRAINT: 撤销UNIQUE约束
-- 创建表时定义约束
-- MySQL:
CREATE TABLE Persons
(
Id_P int NOT NULL, -- 非空
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P) -- 要求Id_P是唯一标识
)
-- SQL_Server/Oracle/MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE, -- 要求Id_P是非空,唯一标识
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
-- 如果表已经创建
ALTER TABLE Persons
ADD UNIQUE (Id_P)
-- 如果要命名UNIQUE约束,且定义多个约束
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
-- 撤销UNIQUE约束
-- MySQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID
-- SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
PRIMARY KEY:主键
主键必须包含唯一的值。
主键列不能包含NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
-- 创建表时定义主键
-- MySQL:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)
-- SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
-- 如果命名及定义多个PRIMARY KEY
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
)
-- 表已存在,修改PRIMARY KEY约束
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)
-- 表已存在,命名及定义多个PRIMARY KEY约束
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
-- 撤销PRIMARY KEY约束
-- MySQL:
ALTER TABLE Persons
DROP PRIMARY KEY
-- SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
FOREIGN KEY:外键
假设两个表:
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
请注意,"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。
"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。
"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
-- 创建表时候设定外键
-- MySQL:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) -- 设置外键Id_P,基于Persons的主键(Id_P),
)
-- SQL Server / Oracle / MS Access:
CREATE TABLE Orders
(
Id_O int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
)
-- 修改外键
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
-- 命名并定义多个外键
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
-- 撤销 FOREIGN KEY 约束
-- MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
-- SQL Server / Oracle / MS Access:
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
CHECK:限制值的范围
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
-- 创建表时指定
-- MySQL:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)
-- SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
-- 如果需要命名及设定多个约束
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)
-- 已存在表,定义约束
ALTER TABLE Persons
ADD CHECK (Id_P>0)
-- 已存在表,命名并定义多个约束
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
-- 撤销 CHECK 约束
-- MySQL:
ALTER TABLE Persons
DROP CHECK chk_Person
-- SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
DEFAULT:设置插入时的默认值
-- 创建表时规定
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
-- 也可以通过GETDATA()之类的函数,设置系统值
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
-- 已有表的情况下修改DEFAULT
-- MySQL:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
-- SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
-- MySQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT
-- SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
INDEX 用于快速查找的索引
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
-- 创建索引,允许使用重复值
CREATE INDEX index_name
ON table_name (column_name)
-- 创建索引,唯一索引(如创建在PRIMARY KEY上)
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
-- 例子,创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列:
CREATE INDEX PersonIndex
ON Person (LastName)
-- 降序索引
CREATE INDEX PersonIndex
ON Person (LastName DESC)
-- 多个列索引
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
DROP 撤销索引/表/数据库
-- 删除索引
-- Microsoft SQLJet (以及 Microsoft Access)
DROP INDEX index_name ON table_name
-- MS SQL Server
DROP INDEX table_name.index_name
-- IBM DB2 和 Oracle
DROP INDEX index_name
-- MySQL
ALTER TABLE table_name DROP INDEX index_name
-- DROP TABLE 删除表
DROP TABLE 表名称
-- DROP DATABASE 删除数据库
DROP DATABASE 数据库名称
-- 只删除表的数据
TRUNCATE TABLE 表名称
ALTER TABLE 修改表
-- 增加列
ALTER TABLE table_name
ADD column_name datatype
-- 删除列
ALTER TABLE table_name
DROP COLUMN column_name
-- 修改列类型
ALTER TABLE table_name
ALTER COLUMN column_name datatype
Auto-increment :自增长,新记录插入时,生成唯一的数字。
-- MYSQL:
-- 定义P_Id 为自增长
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
Name varchar(255),
PRIMARY KEY (P_Id)
)
-- 创建起始值(比如从100开始)
ALTER TABLE Persons AUTO_INCREMENT=100
-- SQL Server
-- 定义P_Id 为自增长
CREATE TABLE Persons
(
P_Id int PRIMARY KEY IDENTITY, -- MS SQL使用INDENTITY关键字执行自增长任务
-- 如想从20开始,每次增长10个,可以改成: IDENTITY(20,10)
Name varchar(255)
)
-- Oracle
-- Oracle比较复杂,需要通过 sequence对 创建自增长字段
-- 1.首先定义sequence
CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1 -- 开始值
INCREMENT BY 1 -- 增长幅度
CACHE 10 -- 缓存10个,提高性能
-- 定义P_Id 为自增长
-- 要插入,需要使用nextval函数
INSERT INTO Persons (P_Id,FirstName,LastName)
VALUES (seq_person.nextval,'Lars','Monsen')
操纵语句
Insert 插入语句
insert into <table_name>(field1,field2) values(value1,value2)
Delete 删除语句
delete from table1 where <条件>
Update 更新语句
update table1 set field1=value1 where <条件>
VIEW(视图)
视图是为了安全,易于使用。
创建视图:
create view v as <query expression>
<query expression>可以是任意查询表达式(如select xxx from xxx)
v表示视图名
创建视图,并设置column的名字
create view v(nn,cc) as select name,countrycode from city
-- 视图中,把name,countrycode 命名为nn,cc
更新视图
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
撤销视图
DROP VIEW view_name
Date函数
MySQL:
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间按的单独部分 |
DATE_ADD() | 给日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
SQL Server:
函数 | 描述 |
---|---|
GETDATE() | 返回当前日期和时间 |
DATEPART() | 返回日期/时间的单独部分 |
DATEADD() | 在日期中添加或减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的时间 |
CONVERT() | 用不同的格式显示日期/时间 |
SQL Date 数据类型
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式 YYYY-MM-DD
- DATETIME - 格式: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
- YEAR - 格式 YYYY 或 YY
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式 YYYY-MM-DD
- DATETIME - 格式: YYYY-MM-DD HH:MM:SS
- SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式: 唯一的数字
如果Date类型中包含时间,仅根据日期查询,无法查询到时间
数据类型
MySQL 数据类型:文本、数字和日期/时间
Text 类型:
数据类型 | 描述 |
---|---|
CHAR(size) | 固定长度的字符串。在括号中指定字符串的长度。最多 255 个字符。 |
VARCHAR(size) | 可变长度的字符串。在括号中指定字符串的最大长度。最多 255 个字符。注释:如果值的长度大于 255,则被转换为 TEXT 类型。 |
TINYTEXT | 存放最大长度为 255 个字符的字符串。 |
TEXT | 存放最大长度为 65,535 个字符的字符串。 |
BLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。 |
MEDIUMTEXT | 存放最大长度为 16,777,215 个字符的字符串。 |
MEDIUMBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。 |
LONGTEXT | 存放最大长度为 4,294,967,295 个字符的字符串。 |
LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。 |
ENUM(x,y,z,etc.) | 允许你输入可能值的列表。可以列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。可以按照此格式输入可能的值:ENUM('X','Y','Z') |
SET | 与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。 |
Number 类型:
数据类型 | 描述 |
---|---|
TINYINT(size) | -128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。 |
SMALLINT(size) | -32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。 |
MEDIUMINT(size) | -8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。 |
INT(size) | -2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。 |
BIGINT(size) | -9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大位数。 |
FLOAT(size,d) | 带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DOUBLE(size,d) | 带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DECIMAL(size,d) | 作为字符串存储的 DOUBLE 类型,允许固定的小数点。 |
* 这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。
Date 类型:
数据类型 | 描述 |
---|---|
DATE() | 日期。格式:YYYY-MM-DD注释:支持的范围是从 '1000-01-01' 到 '9999-12-31' |
DATETIME() | *日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' |
TIMESTAMP() | *时间戳。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 |
TIME() | 时间。格式:HH:MM:SS 注释:支持的范围是从 '-838:59:59' 到 '838:59:59' |
YEAR() | 2 位或 4 位格式的年。注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。 |
* 即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。
SQL Server 数据类型
Character 字符串:
数据类型 | 描述 | 存储 |
---|---|---|
char(n) | 固定长度的字符串。最多 8,000 个字符。 | n |
varchar(n) | 可变长度的字符串。最多 8,000 个字符。 | |
varchar(max) | 可变长度的字符串。最多 1,073,741,824 个字符。 | |
text | 可变长度的字符串。最多 2GB 字符数据。 |
Unicode 字符串:
数据类型 | 描述 | 存储 |
---|---|---|
nchar(n) | 固定长度的 Unicode 数据。最多 4,000 个字符。 | |
nvarchar(n) | 可变长度的 Unicode 数据。最多 4,000 个字符。 | |
nvarchar(max) | 可变长度的 Unicode 数据。最多 536,870,912 个字符。 | |
ntext | 可变长度的 Unicode 数据。最多 2GB 字符数据。 |
Binary 类型:
数据类型 | 描述 | 存储 |
---|---|---|
bit | 允许 0、1 或 NULL | |
binary(n) | 固定长度的二进制数据。最多 8,000 字节。 | |
varbinary(n) | 可变长度的二进制数据。最多 8,000 字节。 | |
varbinary(max) | 可变长度的二进制数据。最多 2GB 字节。 | |
image | 可变长度的二进制数据。最多 2GB。 |
Number 类型:
数据类型 | 描述 | 存储 |
---|---|---|
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 类型:
数据类型 | 描述 | 存储 |
---|---|---|
datetime | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。 | 8 bytes |
datetime2 | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。 | 6-8 bytes |
smalldatetime | 从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。 | 4 bytes |
date | 仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 | 3 bytes |
time | 仅存储时间。精度为 100 纳秒。 | 3-5 bytes |
datetimeoffset | 与 datetime2 相同,外加时区偏移。 | 8-10 bytes |
timestamp | 存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。 |
其他数据类型:
数据类型 | 描述 |
---|---|
sql_variant | 存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。 |
uniqueidentifier | 存储全局标识符 (GUID)。 |
xml | 存储 XML 格式化数据。最多 2GB。 |
cursor | 存储对用于数据库操作的指针的引用。 |
table | 存储结果集,供稍后处理。 |