l 限定返回的行数TOP
SELECT TOP number | percent 列名
FROM 表名
SELECT TOP 2 * FROMPersons
SELECT TOP 50 PERCENT * FROMPersons
l LIKE在WHERE字句中搜索制定模式 通配符等(%可以定义通配符,模式中缺少的字母)
SELECT * FROM Persons
WHERE City LIKE ‘N%’ (选取以N开头的城市的人,’%g’选取以g结尾的人,‘%ion%’选取包含ion的人,NOT LIKE ‘%ion%‘选取不包含ion的人)
通配符 |
描述 |
% |
替代一个或多个字符 |
_ |
仅替代一个字符 |
[charlist] |
字符列中的任何单一字符 |
[^charlist]或者[!charlist] |
不在字符列中的任何单一字符 |
SELECT * FROM Persons
WHERE City LIKE ‘[ALN]%’ 选取以ALN开头的人
l IN 选取列名
SELECT 列名 FROM 表名
WHERE 列名 IN(‘Adams’,’Carter’) 选取颜色列为Apple Yellow的人
l BETWEEN AND
第一个包括,第二个不包括。
SELECT * FROM Persons
WHERE LastName
BETWEEN
'Adams'AND
'Carter'
l 别名语法: Alias 语法 指定别名
表别名
SELECT po.OrderID,p.LastName, p.FirstName
FROM Persons AS p
, Product_Orders ASpo
WHEREp.LastName='Adams' AND p.FirstName='John'
列别名
SELECT LastName AS Family, FirstName AS Name
FROM Persons
l Key主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。
SELECT Persons.LastName,Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.ID_P =Orders.ID_P
l Join从两个或更多的表中获取结果INNER JOIN JOIN: 如果表中有至少一个匹配,则返回行
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name =table_name2.column_name
SELECT Persons.LastName,Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.ID_P = Orders.ID_P
ORDER BY Persons.Lastname
l LEFTJOIN: 即使右表中没有匹配,也从左表返回所有的行
l RIGHTJOIN: 即使左表中没有匹配,也从右表返回所有的行
l FULL JOIN: 只要其中一个表中存在匹配,就返回行 FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果"Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。
l UNION用于合并两个或者多个SELECT语句的结果集,UNION 内部的SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
l UNIONALL 允许重复值的存在;UNION默认不允许重复值的存在,列名总是等于第一个SELECT语句中的列名。
l SELECT**INTO 从一个表中选取数据插入另一个表中
SELECT*
INTO new_table_name[IN externaldatabase]
FROM old_table_name
选取两列
SELECT Lastname,Firstname
INTO Persons_backup
FROM Persons
WHERE City=“Beijing”
选取全部,IN用于向另一个库中COPY
SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons
SELECT Persons.Lastname,Orders.OrderNo
INTO Persons_Order_Backup
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
l CREATDATABASE database_name
l CREATTABLE table_name
(表名称 数据类型,
表名称 数据类型,
表名称 数据类型,
……
)
数据类型 |
描述 |
· integer(size) · int(size) · smallint(size) · tinyint(size) |
仅容纳整数。在括号内规定数字的最大位数。 |
· decimal(size,d) · numeric(size,d) |
容纳带有小数的数字。 "size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。 |
char(size) |
容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。 在括号中规定字符串的长度。 255 |
varchar(size) |
容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。 在括号中规定字符串的最大长度。 |
date(yyyymmdd) |
容纳日期。 |
l NOTNULL
约束强制列不接受空值,
NOT NULL字段始终包含值,如果不向字段添加值,就无法插入新记录或更新记录。
l UNIQUE约束提供独一无二的证明
PRIMARY KEY拥有自动定义的UNIQUE约束
每个表可以拥有多个UNIQUE约束,但是只拥有一个PRIMARY KEY约束
1. 表未存在
创建表格时直接加在语句后面Id_P int NOT NULL UNIQUE
2. 表未存在,命名UNIQUE约束:
CONSTRAINT uc_PersonID UNIQUE (ID_P,Lastname)
3. 表已存在,在已经创建的表创建UNIQUE
ALTER TABLE Person
ADD UNIQUE(Id_P)
4. 表已存在,命名并定义多个列的约束
ALTER TABLE Person
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
5. 撤销UNIQUE约束
ALTER TABLE Person
DROP CONSTRACT uc_PersonID
l PRIMARYKEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
1. 表未存在,创建主键
CREATE TABLE Persons
(Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255))
2. 表未存在,如果需要命名 PRIMARY KEY 约束,以及为多个列定义 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))
3. 表已存在,创建约束
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)
4. 表已存在,如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
5. 撤销PRIMARY KEY
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonI
l FOREIGNKEY
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
1. 表未存在,创建外键
CREATE TABLE Orders
(Id_O int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id_P int FOREIGN KEY REFERENCES Persons(Id_P))
2. 表未存在,如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束
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))
3. 表已存在,创建外键约束
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
4. 表已存在,重命名约束,为多列添加约束
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
5. 撤销FOREIGN约束
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
l SQLCHECK
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制
1. 表未存在,创建CHECK约束
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)
)
2. 表未存在,需要命名CHECK约束,为多个列定义CHECK约束
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’)
)
3. 表已存在,创建CHECK约束
ALTER TABLE Persons
ADD CHECK (Id_P>0)
4. 表已存在,需要重新命名CHECK约束,为多个列定义CHECK约束
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 ANDCity=’Sandnes’)
5. 撤销CHECK约束
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
l SQLDEFAULT 约束
DEFAULT 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
1. 表未存在,创建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'
)
2. 表未存在,使用GETDATE()这样的函数,DEFAULT约束可以用于插入系统值
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
3. 表已存在,创建DEFAULT约束
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT ‘SANDNES’
4. 撤销DEFAULT约束
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
l CREATEINDEX 创建索引
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
创建索引,允许使用重复值
CREATE INDEX index_name
ON table_name (column_name)
创建唯一的索引,两行不能拥有相同的索引
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
创建索引PersonIndex,降序排列
CREATE INDEX PersonIndex
ON Person (LastName DESC)
索引两列或多列
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
DROP
删除索引
DROP INDEX 表名称.索引名称
删除表
DROP TABLE 表名称
删除数据库
DROP DATABASE 数据库名称
ALTER TABLE 表中删除、添加、修改列
添加列
ALTER TABLE table_name
ADD column_name database
删除列
ALTER TABLE table_name
DROP COLUMN column_name
修改列
ALTER TABLE table_name
ALTER COLUMN column_name datatype
AUTO-INCREMENT 每次更新记录时,会自动创建主键值递增
CREATE TABLE Persons
(
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
l SQLVIWE
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
SELECT * FROM [Current Product List]
现在,我们希望向 "Current Product List" 视图添加"Category" 列。我们将通过下列 SQL 更新视图:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
通过 DROP VIEW 命令来删除视图。
SQL DROP VIEW Syntax
DROP VIEW view_name
DATE
函数 描述
GETDATE() 返回当前日期和时间
DATEPART() 返回日期/时间的单独部分
DATEADD() 在日期中添加或减去指定的时间间隔
DATEDIFF() 返回两个日期之间的时间
CONVERT() 用不同的格式显示日期/时间
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
SMALLDATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: 唯一的数字
SELECT * FROM Orders WHEREOrderDate='2008-12-26'
l NULL
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。NULL 值的处理方式与其他值不同。NULL 用作未知的或不适用的值的占位符。
在某一列中选取带NULL的记录
SELECTLastName,FirstName,Address FROM Persons
WHERE Address IS NULL
SELECTLastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
ISNULL()
NVL()、IFNULL()和 COALESCE() 函数有相同效果
因为NULL不等于0,所以值是 NULL 则 ISNULL() 返回0
SELECTProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
数据类型
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 |
存储结果集,供稍后处理。 |