SQL高级进阶

限定返回的行数TOP

SELECT TOP number | percent 列名

FROM 表名

SELECT TOP 2 * FROMPersons                                     

SELECT TOP 50 PERCENT * FROMPersons

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开头的人

IN 选取列名

SELECT 列名 FROM 表名

WHERE 列名 IN(‘Adams’,’Carter’)  选取颜色列为Apple Yellow的人

BETWEEN AND

第一个包括,第二个不包括。

SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'

别名语法: 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

Key主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。

SELECT Persons.LastName,Persons.FirstName, Orders.OrderNo

FROM Persons, Orders

WHERE Persons.ID_P =Orders.ID_P

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

LEFTJOIN: 即使右表中没有匹配,也从左表返回所有的行

RIGHTJOIN: 即使左表中没有匹配,也从右表返回所有的行

FULL JOIN: 只要其中一个表中存在匹配,就返回行 FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果"Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。

UNION用于合并两个或者多个SELECT语句的结果集,UNION 内部的SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

UNIONALL  允许重复值的存在;UNION默认不允许重复值的存在,列名总是等于第一个SELECT语句中的列名。

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

 

CREATDATABASE database_name

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)

容纳日期。

NOTNULL

约束强制列不接受空值,

NOT NULL字段始终包含值,如果不向字段添加值,就无法插入新记录或更新记录。

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

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

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

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

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

 

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)

)

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'

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

存储结果集,供稍后处理。

猜你喜欢

转载自blog.csdn.net/zhangmary/article/details/79948948