很久没碰SQL了,基础知识有些许遗忘,本文根据W3CSchool整理而成,作为一篇基础知识备忘录,更深入的东西会写在其他文章中。

SQL种类

SQL语句分为两种:DML和DDL

  • DDL: 数据定义语言,用于处理数据库结构
  • DML: 数据操作语言,用于处理数据内容

基础语句

DDL语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- 创建数据库
CREATE DATABASE 数据库名
-- 删除数据库
DROP DATABASE 数据库名
-- 创建表
CREATE TABLE 表名
(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
...
)
-- 删除表
DROP TABLE 表名
-- 清空表数据
TRUNCATE TABLE 表名
-- 添加行
ALTER TABLE 表名 ADD 列名 数据类型
-- 修改行
ALTER TABLE 表名 ALTER COLUMN 列名 数据类型
-- 删除行
ALTER TABLE 表名 DROP COLUMN 列名
-- 添加索引
CREATE INDEX 索引名 ON 表名 (列名)
CREATE UNIQUE INDEX 索引名 ON 表名 (列名)
-- 删除索引
DROP INDEX 表名.索引名

DML语句

1
2
3
4
5
6
7
8
9
10
-- 增
INSERT INTO 表名 VALUES (值1, 值2, ...)
INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...)
-- 删
DELETE FROM 表名 WHERE 列名 = 值
-- 查
SELECT 列名(s) FROM 表名 WHERE 列名 = 值
SELECT * FROM 表名
-- 改
UPDATE 表名 SET 列名 = 新值, ... WHERE 列名 = 某值, ...

数据类型

Character字符串

数据类型 描述
char(n) 固定长度,<=8,000个字符
varchar(n) 可变长度,<=8,000个字符
varchar(max) 可变长度,<=1,073,741,824个字符
text 可变长度,<=2G字符数据

Unicode字符串

数据类型 描述
nchar(n) 固定长度,Unicode,<=4,000个字符
nvarchar(n) 可变长度,Unicode,<=4,000个字符
nvarchar(max) 可变长度,Unicode,<=536,870,912个字符
ntext 可变长度,Unicode,<=2G字符数据

Binary类型

数据类型 描述
bit 值 0 / 1 / NULL
binary(n) 固定长度,二进制,<=8,000B
varbinary(n) 可变长度,二进制,<=8,000B
varbinary(max) 可变长度,二进制,<=2GB
image 可变长度,二进制,<=2GB

Number类型

数据类型 描述
tinyint 0 ~ 255 的所有数字,=1B
smallint -32,768 ~ 32,767 的所有数字,=2B
int -2,147,483,648 ~ 2,147,483,647 的所有数字,=4B
bigint -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 的所有数字,=8B
decimal(p,s) 固定精度和比例的数字,-10^38 +1 ~ 10^38 -1 之间的数字
参数p:可存储最大位数(小数点左侧+右侧,范围1 ~ 38,默认18)
参数s:小数点后最大位数(范围0 ~ p,默认 0)
numeric(p,s) 固定精度和比例的数字,-10^38 +1 ~ 10^38 -1 之间的数字
参数p:可存储最大位数(小数点左侧+右侧,范围1 ~ 38,默认18)
参数s:小数点后最大位数(范围0 ~ p,默认 0)
smallmoney -214,748.3648 ~ 214,748.3647 之间的货币数据
money -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 之间的货币数据
float(n) -1.79E +308 ~ 1.79E +308 的浮动精度数字
参数n:float(24) => 4B | float(53) => 8B
默认float(53)
real -3.40E +38 ~ 3.40E +38 的浮动精度数字数据

Date类型

数据类型 描述
datetime 1753/1/1 ~ 9999/12/31,精度为3.33毫秒
datetime2 1753/1/1 ~ 9999/12/31,精度为100纳秒
smalldatetime 1900/1/1 ~ 2079/6/6,精度为1分钟
date 仅存储日期,0001/1/1 ~ 9999/12/31
time 仅存储时间,精度为100纳秒
datetimeoffset 同 datetime2,外加时区偏移
timestamp 存储唯一的数字,每当创建或修改某行时,该数字会更新
每个表只能有一个 timestamp

其他数据类型

数据类型 描述
sql_variant <=8,000B,非text, ntext, timestap数据
uniqueidentifier 全局标识符 GUID
xml XML数据,<=2GB
cursor 存储对用于数据库操作的指针的引用
table 存储结果集,供稍后处理

约束Constraints

约束的作用可以看做是对表中数据类型的一种补充增强,可以在创建表的时候规定约束,也可以在表创建之后在进行添加

NOT NULL

  • 强制字段不为空
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- 创建表
    CREATE TABLE Persons
    (
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
    )

UNIQUE

  • 字段的值唯一
  • 表中可存在多个UNIQUE字段
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    -- 创建表
    CREATE TABLE Persons
    (
    Id_P int NOT NULL UNIQUE,
    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 uc_PersonID UNIQUE (Id_P, LastName)
    )
    -- 修改表:添加
    ALTER TABLE Persons ADD UNIQUE (Id_P)
    ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P, LastName)
    -- 修改表:删除
    ALTER TABLE Persons DROP CONSTRAINT uc_PersonID

PRIMARY KEY

  • 主键
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    -- 创建表
    CREATE TABLE Persons
    (
    Id_P int NOT NULL PRIMARY KEY,
    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 pk_PersonID PRIMARY KEY (Id_P, LastName)
    )
    -- 修改表:添加
    ALTER TABLE Persons ADD PRIMARY KEY (Id_P)
    ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P, LastName)
    -- 修改表:删除
    ALTER TABLE Persons DROP CONSTRAINT pk_PersonID

FOREIGN KEY

  • 外键
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    -- 创建表
    CREATE TABLE Orders
    (
    Id_O int NOT NULL PRIMARY KEY,
    OrderNo int NOT NULL,
    Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
    )
    CREATE TABLE Orders
    (
    Id_O int NOT NULL,
    OrderNo int NOT NULL,
    Id_P int,
    PRIMARY KEY (Id_O),
    CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) 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)
    -- 修改表:删除
    ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders

CHECK

  • 限制列的值范围
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    -- 创建表
    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')
    -- 修改表:删除
    ALTER TABLE Persons DROP CONSTARINT chk_Person

DEFAULT

  • 设置列的默认值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    -- 创建表
    CREATE TABLE Persons
    (
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) DEFAULT 'Sandnes'
    )
    CREATE TABLE Orders
    (
    Id_O int NOT NULL,
    OrderNo int NOT NULL,
    Id_P int,
    OrderDate date DEFAULT GETDATE()
    )
    -- 修改表:添加
    ALTER TABLE Persons ALTER COLUMN City SET DEFAULT 'Sandnes'
    -- 修改表:删除
    ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT

IDENTITY

  • 字段数值自增长,添加数据时不需添加此字段值
  • IDENTITY 起始值 1,每次添加数据自动 +1
  • IDENTITY(20, 10) 起始值 20,每次添加数据自动 +10
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- 创建表
    CREATE TABLE Persons
    (
    P_Id int PRIMARY KEY IDENTITY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
    )

关键字

TOP

  • 取查询结果的前 n 条数据
    1
    2
    3
    4
    5
    -- 语法
    SELECT TOP 数据|百分比 列名(s) FROM 表名
    -- 示例
    SELECT TOP 2 * FROM Persons
    SELECT TOP 50 PERCENT * FROM Persons

DISTINCT

  • 对查询结果去重
    1
    2
    3
    4
    -- 语法
    SELECT DISTINCT 列名 FROM 表名
    -- 示例
    SELECT DISTINCT Company FROM Orders

AS

  • 别名(alias)
  • 可省略
    1
    2
    3
    4
    5
    6
    7
    -- 语法
    SELECT 列名(s) FROM 表名 AS 别名
    SELECT 列名 AS 别名 FROM 表名
    -- 示例
    SELECT po.OrderID, p.LastName, p.FirstName
    FROM Persons AS p, Product_Orders AS po
    WHERE p.LastName = 'Adams' AND p.FirstName = 'John'

LIKE / NOT LIKE

  • 用于模糊查找
    1
    2
    3
    4
    5
    6
    -- 语法
    SELECT 列名(s) FROM 列名 LIKE 匹配模式
    SELECT 列名(s) FROM 列名 NOT LIKE 匹配模式
    -- 示例
    SELECT * FROM Persons WHERE City LIKE '%lon%%'
    SELECT * FROM Persons WHERE City NOT LIKE '%lon%'
通配符
  • % 替代一个或多个字符

    1
    2
    3
    4
    5
    6
    -- 查找以 lond 开头的数据
    SELECT * FROM Persons WHERE City LIKE 'lond%'
    -- 查找包含 lond 的数据
    SELECT * FROM Persons WHERE City LIKE '%lond%'
    -- 查找以 lond 结尾的数据
    SELECT * FROM Persons WHERE City LIKE '%lond'
  • _ 仅替代一个字符

    1
    2
    -- 查找首字母为 C,第二位任意字符,第三位为 r,第四位任意字符,之后以 er 结尾的数据
    SELECT * FROM Persons WHERE LastName Like 'C_r_er'
  • [charlist] 字符列中的任何单一字符

    1
    2
    -- 查找全部以 A/L/N 开头的数据
    SELECT * FROM Persons WHERE City LIKE '[ALN]%'
  • [!charlist] 不在字符列中的任何单一字符

    1
    2
    -- 查找全部非 A/L/N 开头的数据
    SELECT * FROM Persons WHERE City LIKE '[!ALN]%'

IN

  • 条件范围 [ … ]
    1
    2
    3
    4
    -- 语法
    SELECT 列名(s) FROM 表名 WHERE 列名 IN (值1, 值2, ...)
    -- 示例
    SELECT * FROM Persons WHERE LastName IN ('Adams', 'Carter')

BETWEEN a AND b

  • 条件范围 [a, b)
    1
    2
    3
    4
    5
    -- 语法
    SELECT 列名(s) FROM 表名 WHERE 列名 BETWEEN1 AND2
    -- 示例
    SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
    SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'

UNION / UNION ALL

  • 合并结果集,不同结果集的列名必须相同
  • UNION 去重 | UNION ALL 不去重
    1
    2
    3
    4
    5
    6
    -- 语法
    SELECT 列名(s) FROM 表名1 UNION SELECT 列名(s) FROM 表名2
    SELECT 列名(s) FROM 表名1 UNION ALL SELECT 列名(s) FROM 表名2
    -- 示例
    SELECT E_Name FROM Employee_China UNION SELECT E_Name FROM Employee_USA
    SELECT E_Name FROM Employee_China UNION ALL SELECT E_Name FROM Employee_USA

JOIN

  • a INNER JOIN b => a & b
  • a LEFT JOIN b => a + a & b
  • a RIGHT JOIN b => b + a & b
    1
    2
    3
    4
    5
    6
    -- 语法
    SELECT 列名(s) FROM 表名1 INNER/LEFT/RIGHT JOIN 表名2 ON 表名1.列名 = 表名2.列名
    -- 示例
    SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons
    INNER/LEFT/RIGHT JOIN Orders ON Persons.Id_P = Orders.Id_P
    ORDER BY Persons.LastName

SELECT … INTO …

  • 无IN:从表1中查出数据插入同数据库表2中
  • 有IN:从表1中查出数据插入另一个数据库表2中
    1
    2
    3
    4
    5
    6
    -- 语法
    SELECT * INTO 新表名 [IN 其它数据库] FROM 旧表名
    SELECT 列名(s) INTO 新表名 [IN 其它数据库] FROM 旧表名
    -- 示例
    SELECT * INTO Persons IN 'Backup.mdb' FROM Persons
    SELECT LastName, FirstName INTO Persons_backup FROM Persons

ORDER BY

  • 排序
  • 正序 ASC(可省略) | 逆序 DESC
    1
    2
    3
    4
    -- 语法
    SELECT 列名(s) FROM 表名 ORDER BY 列名1 顺序1, 列名2 顺序2, ...
    -- 示例
    SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

GROUP BY

  • 结合合计函数,根据一个或多个列对结果集进行分组
    1
    2
    3
    4
    5
    -- 语法
    SELECT 列名 合计函数(列名) FROM 表名 WHERE 列名 操作 值 GROUP BY 列名
    -- 示例
    SELECT Customer, SUM(OrderPrice) FROM Orders GROUP BY Customer
    SELECT Customer, OrderDate, SUM(OrderPrice) GROUP BY Customer, OrderDate

HAVING

  • 因WHERE关键字无法与合计函数一起用,所以用HAVING替代
    1
    2
    3
    4
    5
    -- 语法
    SELECT 列名 合计函数(列名) FROM 表名 WHERE 列名 操作 值 GROUP BY 列名 HAVING 合计函数(列名) 操作 值
    -- 示例
    SELECT Customer, SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice) < 2000
    SELECT Customer, SUM(OrderPrice) FROM Orders WHERE Customer = 'Bush' GROUP BY Customer HAVING SUM(OrderPrice) > 1500

函数

Aggregate函数

操作列,返回一个单一的值

AVG
  • 返回某列的平均值
    1
    2
    -- 示例
    SELECT AVG(OrderPrice) FROM Orders
BINARY_CHECKSUM
  • 可用于检测数据是否发生改变
  • BINARY_CHECKSUM ( * | expression [ ,…n ] )
  • * 指定计算结果在标的所有列上
  • expression 任何类型表达式,忽略不可比较的数据类型的表达式。
    1
    2
    3
    4
    5
    6
    7
    8
    -- 插入一条数据
    INSERT INTO myTable VALUES (1, 'test');
    -- 查看校验值
    SELECT BINARY_CHECKSUM(*) from myTable;
    -- 更新数据
    UPDATE myTable set column2 = 'TEST';
    -- 再次查看校验值,此时值已改变
    SELECT BINARY_CHECKSUM(*) from myTable;
CHECKSUM
  • 返回按照表的某一行或一组表达式计算出来的校验和值。
  • 使用 CHECKSUM 生成哈希索引,通过将校验和列添加到索引的表中,然后对校验和列生成索引来生成哈希索引,尤其是当要索引的列为较长的字符列时可以提高索引速度。
    1
    2
    3
    CHECKSUM (* | expression [ ,...n ])
    > * 指定计算在表的所有列上
    > expression 无法应用于如下非可比数据类型: text、ntext、image 和 cursor。
1
2
3
4
5
6
7
-- 创建一个散列索引
ALTER TABLE Production.Product ADD cs_Pname AS CHECKSUM(Name);
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
-- 使用散列索引
SELECT * FROM Production.Product
WHERE CHECKSUM(N'Bearing Ball') = cs_Pname AND Name = N'Bearing Ball';
CHECKSUM_AGG
  • 用于检测表中的更改
    1
    2
    3
    4
    CHECKSUM_AGG ([ ALL | DISTINCT ] expression)
    > ALL 将聚合函数应用于所有值。ALL是默认值。
    > DISTINCT 指定CHECKSUM_AGG返回唯一值的校验和。
    > expression 是一个整数表达式。不允许使用聚合函数和子查询。
1
2
-- 更新前后所获得的值不同
SELECT CHECKSUM_AGG(CAST(Quantity AS int)) FROM Production.ProductInventory;
COUNT
  • COUNT(列名) 返回某列的行数,不包含NULL行
  • COUNT(*) 返回全部行数
  • COUNT(DISTINCT 列名) 返回相异结果的数目
    1
    2
    3
    4
    5
    6
    -- 查询Customer行数
    SELECT COUNT(Customer) FROM Orders
    -- 查询不重复的Customer行数
    SELECT COUNT(DISTINCT Customer) FROM Orders
    -- 查询全部行数
    SELECT COUNT(*) FROM Orders
FIRST
  • 返回在指定域中的第一个记录的值
    1
    SELECT FIRST(Customer) FROM Orders
LAST
  • 返回在指定域中的最后一个记录的值
    1
    SELECT LAST(Customer) FROM ORDER
MAX
  • 返回某列的最高值
  • 可用于文本列,以获得字母表排序的最高值
    1
    SELECT MAX(OrderPrice) FROM Orders
MIN
  • 返回某列的最低值
  • 可用于文本列,以获得字母表排序的最低值
    1
    SELECT MIN(OrderPrice) FROM Orders
SUM
  • 返回在某列的和
    1
    SELECT SUM(OrderPrice) FROM Orders
STDEV
  • 返回样本标准差
    1
    2
    3
    4
    5
    6
    STDEV ([ALL | DISTINCT] expression) OVER ([partition_by_clause] order_by_clause)
    > ALL 将该功能应用于所有值,ALL是默认值
    > DISTINCT 指定每个唯一值被考虑
    > expression 是一个数字表达式,不允许使用聚合函数和子查询
    > partition_by_clause 将由FROM子句生成的结果集划分为应用该函数的分区。无此则该函数将查询结果集的所有行视为单个组
    > order_by_clause 确定执行操作的逻辑顺序
1
SELECT STDEV(DISNICT OrderPrice) AS d_Price, STDEV(OrderPrice) AS Price FROM Orders
STDEVP
  • 返回总体标准差
    1
    2
    3
    4
    5
    6
    STDEVP ([ALL | DISTINCT] expression) OVER ([partition_by_clause] order_by_clause)
    > ALL 将该功能应用于所有值,ALL是默认值
    > DISTINCT 指定每个唯一值被考虑
    > expression 是一个数字表达式,不允许使用聚合函数和子查询
    > partition_by_clause 将由FROM子句生成的结果集划分为应用该函数的分区,无则该函数将查询结果集的所有行视为单个组
    > order_by_clause 确定执行操作的逻辑顺序
1
SELECT STDEVP(DISNICT OrderPrice) AS d_Price, STDEVP(OrderPrice) AS Price FROM Orders
VAR
  • 返回样本方差
    1
    2
    3
    4
    5
    6
    VAR ( [ ALL | DISTINCT ] expression )
    OVER ( [ partition_by_clause ] order_by_clause )
    > ALL 将该功能应用于所有值。ALL是默认值。
    > DISTINCT 指定每个唯一值被考虑
    > partition_by_clause 将由FROM子句生成的结果集划分为应用该函数的分区。无则该函数将查询结果集的所有行视为单个组
    > order_by_clause 确定执行操作的逻辑顺序
1
2
3
4
5
6
7
SELECT CalendarYear AS Year,
CalendarQuarter AS Quarter,
SalesAmountQuota AS SalesQuota,
VAR(SalesAmountQuota) OVER (ORDER BY CalendarYear, CalendarQuarter) AS Variance
FROM dbo.FactSalesQuota
WHERE EmployeeKey = 272 AND CalendarYear = 2002
ORDER BY CalendarQuarter;
VARP
  • 返回总体方差
    1
    2
    3
    4
    5
    6
    VARP ( [ ALL | DISTINCT ] expression )
    OVER ( [ partition_by_clause ] order_by_clause )
    > ALL 将该功能应用于所有值。ALL是默认值。
    > DISTINCT 指定每个唯一值被考虑。
    > partition_by_clause 将由FROM子句生成的结果集划分为应用该函数的分区。无则该函数将查询结果集的所有行视为单个组
    > order_by_clause 确定执行操作的逻辑顺序
1
2
3
4
5
6
7
SELECT CalendarYear AS Year,
CalendarQuarter AS Quarter,
SalesAmountQuota AS SalesQuota,
VARP(SalesAmountQuota) OVER (ORDER BY CalendarYear, CalendarQuarter) AS Variance
FROM dbo.FactSalesQuota
WHERE EmployeeKey = 272 AND CalendarYear = 2002
ORDER BY CalendarQuarter;

Scalar函数

对某个值进行处理,并返回处理后的值

ISNULL
  • 因NULL无法进行数值计算,所以可以指定NULL的默认值来计算
    1
    2
    -- 如果 UnitsOnOrder 为NULL,则用 0 替代进行计算
    SELECT ProcductName, UnitPrice * (UnitsInStock + ISNULL(UnitsOnOrder, 0)) FROM Products
UCASE
  • 转大写
    1
    SELECT UCASE(Customer) FROM Orders
LCASE
  • 转小写
    1
    SELECT LCASE(Customer) FROM Orders
MID
  • 截取子字符串
  • MID(列名, 开始位置, [, 截取长度])
    1
    SELECT MID(City, 1, 3) AS SmallCity FROM Persons
LEN
  • 返回文本长度
    1
    SELECT LEN(Address) FROM Persons
ROUND
  • 精确度,四舍五入
  • ROUND(列名, 精度)
    1
    2
    -- 精确到小数点后两位
    SELECT ProductName, ROUND(UnitPrice, 2) AS UnitPrice FROM Products
FORMAT
  • 格式化
  • SELECT FORMAT(列名, 格式) FROM 表名
    1
    SELECT ProductName, UnitPrice, FORMAT(Now(), 'YYYY-MM-DD') AS PerDate FROM Products
时间
GETDATE
  • 返回当前 日期 & 时间
    1
    SELECT GETDATE() AS CurrentDateTime
DATEPART
  • 返回 日期 | 时间
  • DATEPART(格式, 日期)
    1
    2
    3
    4
    5
    SELECT DATEPART(yyyy, OrderDate) AS OrderYear,
    DATEPART(mm, OrderDate) AS OrderMonth,
    DATEPART(dd, OrderDate) AS OrderDay
    FROM Orders
    WHERE OrderId = 1
DATEADD
  • 在日期中添加/减去指定的时间间隔
  • DATEADD(格式, 数字, 日期)
    1
    SELECT OrderId, DATEADD(day, 2, OrderDate) AS OrderPayDate FROM Orders
DATEDIFF
  • 返回两个日期的差
  • DATEDIFF(时间格式, 开始日期, 结束日期)
    1
    2
    3
    4
    -- 结果为 1
    SELECT DATEDIFF(day, '2008-12-29', '2008-12-30') AS DiffDate
    -- 结果为 -1
    SELECT DATEDIFF(day, '2008-12-30', '2008-12-29') AS DiffDate
CONVERT
  • 用不同格式显示日期/时间
  • CONVERT(日期类型(长度), 待转化日期, 时间样式)
    1
    2
    3
    4
    5
    6
    7
    8
    -- 结果:Dec 29 2008 11:45 PM
    CONVERT(varchar(19), GETDATE())
    -- 结果:12-29-2008
    CONVERT(varchar(10), GETDATE(), 110)
    -- 结果:29 Dec 08
    CONVERT(varchar(11), GETDATE(), 106)
    -- 结果:29 Dec 2008 16:25:46.635
    CONVERT(varchar(24), GETDATE(), 113)
时间格式
格式 缩写
yy, yyyy
季度 qq, q
mm, m
年中的日 dy, y
dd, d
wk, ww
星期 dw, w
小时 hh
分钟 mi, n
ss, s
毫秒 ms
微妙 mcs
纳秒 ns
时间样式
Style ID Style 格式
100 或者 0 mon dd yyyy hh:miAM (或者 PM)
101 mm/dd/yy
102 yy.mm.dd
103 dd/mm/yy
104 dd.mm.yy
105 dd-mm-yy
106 dd mon yy
107 Mon dd, yy
108 hh:mm:ss
109 或者 9 mon dd yyyy hh:mi:ss:mmmAM(或者 PM)
110 mm-dd-yy
111 yy/mm/dd
112 yymmdd
113 或者 13 dd mon yyyy hh:mm:ss:mmm(24h)
114 hh:mi:ss:mmm(24h)
120 或者 20 yyyy-mm-dd hh:mi:ss(24h)
121 或者 21 yyyy-mm-dd hh:mi:ss.mmm(24h)
126 yyyy-mm-ddThh:mm:ss.mmm(没有空格)
130 dd mon yyyy hh:mi:ss:mmmAM
131 dd/mm/yy hh:mi:ss:mmmAM

索引

视图VIEWS

存储过程

触发器

事物