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_PLastNameFirstNameAddressCity
1AdamsJohnOxford StreetLondon
2BushGeorgeFifth AvenueNew York
3CarterThomasChangan StreetBeijing

Orders

Id_OOrderNoId_P
1778953
2446783
3224561
4245621
53476465

两个表可以通过Id_P 连接起来。

结果集为:

LastNameFirstNameOrderNo
AdamsJohn22456
AdamsJohn24562
CarterThomas77895
CarterThomas44678

实现方法:

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_PLastNameFirstNameAddressCity

Constrains

创建表的限制

  • NOT NULL: 不可以有NULL值(也就是非空)
  • UNIQUE: 唯一标识
  • PRIMARY KEY: 主键
  • FOREIGN KEY:外键
  • CHECK:限制值的范围
  • DEFAULT:设置插入时的默认值

NOT NULLUNIQUE

  • 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_PLastNameFirstNameAddressCity
1AdamsJohnOxford StreetLondon
2BushGeorgeFifth AvenueNew York
3CarterThomasChangan StreetBeijing

"Orders" 表:

Id_OOrderNoId_P
1778953
2446783
3224561
4245621

请注意,"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存储结果集,供稍后处理。
最后修改:2021 年 06 月 01 日 01 : 58 PM
如果觉得我的文章对你有用,请随意赞赏