1、SQL TOP子句
由于规定要返回的记录的数目
SELECT TOP number | percent column_name(s) (列的名字)FROM table_name
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
TOP举例:返回头两条记录
SELECT TOP 2 * FROM Persons
TOP PERCENT举例:选取50%
SELECT
TOP 50 PERCENT
* FROM Persons
2、SQL LIKE 操作符
用于在where字句中搜索列中的指定模式
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
举例:
SELECT * FROM Persons
WHERE City LIKE ‘N%‘ 以”N”开头的城市
SELECT * FROM Persons
WHERE City LIKE ‘%g‘ 以”g”结尾的城市
SELECT * FROM Persons
WHERE CityNOT LIKE
‘
%lon%
‘ 包含”lon”的城市,使用NOT关键字来处理
3、SQL通配符
在搜索数据库的数据时使用。可以代替一个或多个字符,必须要和LIKE关键字一起使用。
主要有:
% 替代一个或者多个字符
– 仅替代一个字符
[charlist] 字符列中任何单一字符
[^charlist] 不在字符列中的任何单一字符
举例:
选取的这条记录的姓氏以 “C” 开头,然后是一个任意字符,然后是 “r”,然后是任意字符,然后是 “er”:
SELECT * FROM Persons
WHERE LastName LIKE‘C_r_er’
选取居住的城市以 “A” 或 “L” 或 “N” 开头的人:
SELECT * FROM Persons
WHERE City LIKE‘[ALN]%’
SELECT * FROM Persons
WHERE City LIKE‘[!ALN]%’ (不以A或L或N开头)
4、SQL IN 操作符
允许我们再WHERE字句中
规定多个值,就可以得到多条结果。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,…)
选取姓氏为 Adams 和 Carter 的人:
SELECT * FROM Persons
WHERE LastNameIN (‘Adams’,’Carter’)
5、SQL BETWEEN 操作符
选取介于两个值之间的数据范围(有的包含边界,有的不包含)
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2(搭配NOT关键字使用)
6、SQL Alias(别名)
可以为列名称和表名称指定别名(Alias)
指定表的别名:
SELECT column_name(s)
FROM table_name
AS alias_name
指定列的别名:
SELECTcolumn_name AS alias_name
FROM table_name
使用别名,让查询程序更容易写
7、SQL JOIN
根据两个或多个表中的列之间的关系,从表中查询数据
join和key:
有时候为了得到完整的结果,需要从两个或更多的表中获取结果,就需要执行join
数据库中的表可通过键将彼此联系起来,主键是一个列,该列中每一行的值都是唯一的。
(1)引用两个表
我们可以通过引用两个表的方式,从两个表中获取数据:
谁订购了产品,并且他们订购了什么产品?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P #(通过Id_P来将两个表连接在一起)
(2)使用Join
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: 如果表中有至少一个匹配,则返
- INNER JOIN:内连接,只返回两表中连接字段相等的行
- LEFT JOIN: 返回左表中所有记录及其右表中连接字段相等的记录。(即使右表中没有匹配,也从左表返回所有的行)
- RIGHT JOIN: 返回右表中所有记录及其左表中连接字段相等的记录。即使左表中没有匹配,也从右表返回所有的行)
- FULL JOIN: 外连接,返回两表中的行。(只要其中一个表中存在匹配,就返回行)
8、SQL INNER JOIN 关键字
在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
注意:INNER JOIN与JOIN是一样的。
SELECT column_name(s)
FROM table_name1 INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
9、SQL LEFT JOIN 关键字
SELECT column_name(s)
FROM table_name1 LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
希望列出所有的人以及他们的订购-如果有的话。
所以用LEFT JOIN 悉数列出左表,如果右表有匹配的话,也列出。
10、SQL RIGHT JOIN 关键字
列出所有的定单,以及定购它们的人 – 如果有的话。
11、SQL FULL JOIN 关键字
列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。
会先返回所有的左表、右表的行,如果有匹配,会进一步再返回匹配的行。
12、SQL UNION 操作符
用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
13、SQL SELECT INTO 语句
用于创建表的备份复件。
SELECT INTO 语句从一个表中选取数据(可以是所有列* 也可以是指定的列),然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
举例:
制作表的备份复件
SELECT
*
INTO
Persons_backup FROM Persons
向另一个数据库中拷贝表
SELECT
*
INTO
Persons
IN
‘Backup.mdb’ FROM Persons
14、SQL CREATE DATABASE 语句
用于创建数据库
举例:创建一个名为“my_db”的数据库
CREATE DATABASE my_db
15、SQL CREATE TABLE 语句
用于创建数据库中的表
CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... )
举例: 创建一个名为”person”的表
CREATE TABLE Persons ( Id_P int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) )
其中,
int整数
char容纳固定长度
varchar容纳可变长度
date日期
16、SQL 约束
用于限制加入表的数据的类型。
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
- DEFAULT
17、SQL NOT NULL约束
约束强制列不接受NULL值,如果不向字段添加值,就无法插入新记录或者更新记录。
下面的 SQL 语句强制 “Id_P” 列和 “LastName” 列不接受 NULL 值:
CREATE TABLE Persons ( Id_P intNOT NULL
, LastName varchar(255)NOT NULL
, FirstName varchar(255), Address varchar(255), City varchar(255) )
18、SQL UNIQUE 约束
唯一标识数据库表中的每条记录
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
举例: (1)创建“persons”表时在”id_p”列创建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)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
(2)当表已经被创建好,要在其中一个列创建UNIQUE约束:
ALTER TABLE Persons
ADD UNIQUE (Id_P)
如果需要命名UNIQUE约束,并定义多个列的UNIQUE约束:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
撤销UNIQUE约束:
ALTER TABLE Persons
DROP INDEX uc_PersonID (MySQL)
DROP CONSTRAINT uc_PersonID (SQL)
19、SQL PRIMARY KEY 约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
(1)在 “Persons” 表创建时在 “Id_P” 列创建 PRIMARY KEY 约束:
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 约束,以及为多个列定义 PRIMARY KEY 约束:
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
(2)表已经存在,为“Id_P”列创建PRIMARY KEY约束:
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)
如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束:
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
注意:如果使用ALETR TABLE添加主键,需要把主键声明为不包含NULL值(在首次创建的时候)。
撤销PRIMARY KEY约束:
ALTER TABLE Persons
DROP PRIMARY KEY (MYSQL)
DROP CONSTRAINT pk_PersonID (SQL)
20、SQL FOREIGN KEY约束
一个表中的foreign key 指向另一个表中的 PRIMARY 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 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
(1)创建表的时候创建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)
)
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)
)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束
MySQL / SQL Server / Oracle / MS Access:
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)
)
(2)表已经存在:
如果在 “Orders” 表已存在的情况下为 “Id_P” 列创建 FOREIGN KEY 约束
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
撤销FOREIGN KEY约束:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders (MySQL)
DROP CONSTRAINT fk_PerOrders (SQL)
21、SQL CHECK约束
用于限制列中的值的范围。
(1)”Persons” 表创建时为 “Id_P” 列创建 CHECK 约束。CHECK 约束规定 “Id_P” 列必须只包含大于 0 的整数。
My SQL:
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)
)
如果需要命名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')
)
(2)
如果在表已存在的情况下为 “Id_P” 列创建 CHECK 约束:
ALTER TABLE Persons
ADD CHECK (Id_P>0) (MySQL)
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes') (SQL)
撤销CHECK约束:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person (SQL)
DROP CHECK chk_Person (MYSQL)
22、SQL DEFAULT约束
用于向列中插入默认值。如果没有规定其他的值,就会将默认值添加到所有的新纪录。
在表创建的时候为”city”列创建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' )
如果表已存在的情况下为“city”创建DEFAULT约束
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES' (MySQL)
ALTER COLUMN City SET DEFAULT 'SANDNES'(SQL)
撤销:
ALTER TABLE Persons ALTER City DROP DEFAULT (Mysql)
ALTER CULUMN City DROP DEFAULT (sql)
23、SQL CREATE INDEX语句
用于在表中创建索引,在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
可以在表中创建索引,以便加快查询效率,用户无法看到索引,只能加速查询。
更新一个有索引的表比更新一个没有的慢,所以理想的做法是仅在常常被搜索的列(以及表)上创建索引。
创建一个简单索引:
CREATE INDEX index_name ON table_name (column_name)
创建一个不重复的简单索引:
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
举例:
降序索引某个列的值,添加保留字DESC
CREATE INDEX PersonIndex ON Person (LastName DESC)
24、SQL DROP
删除索引、表、数据库。
DROP TABLE 表名称
DROP DATABASE 数据库名称
如果只需要删除表内数据,不删除表本身:
TRUNCATE TABLE 表名称
25、SQL 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
举例:
ALTER TABLE Persons
ALTER Birthday date (添加名为“Birthday”的新列)
ALTER TABLE Persons
ALTER COLUMN Birthday year (修改名为“Birthday”列的数据类型)
ALTER TABLE Persons
DROP COLUMN Birthday (删除名为“Birthday”的新列)
26、SQL AUTO INCREMENT 字段
会在新纪录插入表中时生成一个唯一的数字。即如果希望在每次插入新纪录时,自动地创建主键字段的值,可以在表中创建一个auto-increment字段。
27、SQL VIEW(视图)
视图是可视化的表,总是基于最近的数据。
SQL CREATE VIEW实例:
样本数据库 Northwind 拥有一些被默认安装的视图。视图 “Current Product List” 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:
CREATE VIEW
[Current Product List]AS
SELECT
ProductID,ProductNameFROM
ProductsWHERE
Discontinued=No#正在使用的产品
SQL更新视图:
SQL CREATE OR REPLACE VIEW Syntax CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
SQL撤销视图:
您可以通过 DROP VIEW 命令来删除视图。
SQL DROP VIEW Syntax DROP VIEW view_name
28、SQL Date函数
SQL Server Date 函数
下面的表格列出了 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
当查询不含有时间,只有日期的时候,就比较容易处理和解决。
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
29、SQL NULL值
NULL 值是遗漏的未知数据。
默认地,表的列可以存放 NULL 值。如果向表中插入一条不带值的记录,该列会使用NULL值保存。使用IS NULL和IS NOT NULL操作符来区别。
选取“Address”列中带有NULL值的记录:
SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NULL
30、SQL ISNULL函数
如果 “UnitsOnOrder” 是 NULL,则不利于计算,因此如果值是 NULL 则 ISNULL() 返回 0。
SQL Server / MS Access
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products
31、SQL 数据类型
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 | 存储结果集,供稍后处理。 |