现代的 SQL 服务器构建在 RDBMS 之上。
DBMS - 数据库管理系统(Database Management System)
数据库管理系统是一种可以访问数据库中数据的计算机程序。
DBMS 使我们有能力在数据库中提取、修改或者存贮信息。
不同的 DBMS 提供不同的函数供查询、提交以及修改数据。
RDBMS - 关系数据库管理系统(Relational Database Management System)
关系数据库管理系统 (RDBMS) 也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。
20 世纪 70 年代初,IBM 公司发明了 RDBMS。
RDBMS 是 SQL 的基础,也是所有现代数据库系统诸如 Oracle、SQL Server、IBM DB2、Sybase、MySQL 以及 Microsoft Access 的基础。
SQL 是用于访问和处理数据库的标准的计算机语言。
SQL 指结构化查询语言
SQL 使我们有能力访问数据库
SQL 是一种 ANSI 的标准计算机语言
SQL 语句后面的分号:
某些数据库系统要求在每条 SQL 命令的末端使用分号。
分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的语句。
如果您使用的是 MS Access 和 SQL Server 2000,则不必在每条 SQL 语句之后使用分号,不过某些数据库软件要求必须使用分号。
SQL DML 和 DDL
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
///////////////////////////////////////////////////////////////
where:
= 等于
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
SELECT * FROM Persons WHERE City='Beijing'(列是文本,要加单引号;数值,则不能加)
/////////////////////////////////////////
Distinct:
选择不重复的列:SELECT DISTINCT Company FROM Orders
///////////////////////////////////////////////
And & or:组合关键字
组合条件:SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'
/////////////////////////////////////////////////
order by:排序关键字
第一列降序,第二列升序:SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC(ASC可以不写)
/////////////////////////////////////////////////
Insert:插入数据关键字
插入一条(所有列):INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
插入一条(某几列):INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
/////////////////////////////////////////////////
Update:更新关键字
更新两列数据:UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
/////////////////////////////////////////////////
Delete:关键字
删除表中的某行:DELETE FROM Person WHERE LastName = 'Wilson'
删除表中所有行:DELETE FROM table_name 或者 DELETE * FROM table_name
/////////////////////////////////////////////////
TOP 关键字
TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
注释:并非所有的数据库系统都支持 TOP 子句。
SQL Server 的语法:SELECT TOP number|percent column_name(s) FROM table_name
SELECT TOP 50 * FROM Persons
SELECT TOP 50 PERCENT * FROM Persons
MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的:
MySQL 语法:SELECT * FROM Persons LIMIT 5
Oracle 语法:SELECT * FROM Persons WHERE ROWNUM <= 5
/////////////////////////////////////////////////
LIKE:关键字
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
以N开头:SELECT * FROM Persons WHERE City LIKE 'N%'
以g结尾:SELECT * FROM Persons WHERE City LIKE '%g'
中间有lon的:SELECT * FROM Persons WHERE City LIKE '%lon%'
中间不能含oop的:SELECT * FROM Persons WHERE City not LIKE '%oop%'
/////////////////////////////////////////////////
SQL 通配符:
在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。
SQL 通配符必须与 LIKE 运算符一起使用。
在 SQL 中,可使用以下通配符:
1.%:替代一个或多个字符
2._:仅替代一个字符
3.[charlist]:字符列中的任何单一字符
4.[^charlist]或者[!charlist]:不在字符列中的任何单一字符
例:以ALN三个字符中的一个开头:SELECT * FROM Persons WHERE City LIKE '[ALN]%'
例:不能以ALN三个字符中的一个开头:SELECT * FROM Persons WHERE City LIKE '[!ALN]%'
/////////////////////////////////////////////////
IN 操作符
IN 操作符允许我们在 WHERE 子句中规定多个值。
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
/////////////////////////////////////////////////
BETWEEN 操作符
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter' 根据数据库不同,端点包含情况不同
SELECT * FROM Persons WHERE LastName not BETWEEN 'Adams' AND 'Carter' 不在区间范围内的值
/////////////////////////////////////////////////
AS 操作符
给表名或者列名起的别名,便于写SQL语句
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
///////////////////////////////////////////////////////////////////
join 关键字
用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
可以使用的 JOIN 类型,以及它们之间的差异:
JOIN: 如果表中有至少一个匹配,则返回行(inner join = join)
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
例:引用两个表
"Id_P" 列把两个表联系了起来。
我们可以通过引用两个表的方式,从两个表中获取数据:
谁订购了产品,并且他们订购了什么产品?(结果集是交集)
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
除了上面的方法,我们也可以使用关键词 JOIN 来从两个表中获取数据。
如果我们希望列出所有人的定购,可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
或者:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
--------------------------------------------------
SQL INNER JOIN 关键字
在表中存在至少一个匹配时,INNER JOIN 关键字返回行。(上面例子)
INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。
--------------------------------------------------
SQL LEFT JOIN 关键字
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
语法:
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
例:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
将会列出所有的客户,即便是客户现在没有订单
它会将左表中不在右表中出现的项放在后面(order by排序后)
--------------------------------------------------
SQL RIGHT JOIN 关键字
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
语法:
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
例:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
将会列出所有的订单,即便是订单没有填写客户名称
--------------------------------------------------
SQL FULL JOIN 关键字
只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。(结果是并集)
语法:
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
例:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。
如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。
////////////////////////////////////////////////////////////////////////////
UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意:UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
UNION 语法:
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
==注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
////////////////////////////////////////////////////////////////////////////
SELECT INTO 语句可用于创建表的备份复件。
语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语法例:
制作备份复件
下面的例子会制作 "Persons" 表的备份复件:
SELECT *
INTO Persons_backup
FROM Persons
IN 子句可用于向另一个数据库中拷贝表:
SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons
如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:
SELECT LastName,FirstName
INTO Persons_backup
FROM Persons
where city='beijing'
从一个以上的表中选取数据也是可以做到的
下面的例子会创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:
SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
////////////////////////////////////////////////////////////////////////////
CREATE DATABASE 用于创建数据库。
用法:CREATE DATABASE database_name
////////////////////////////////////////////////////////////////////////////
CREATE TABLE 语句用于创建数据库中的表。
语法:
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最常用的数据类型:
容纳整数类型。在括号内规定数字的最大位数。
integer(size)
int(size)
smallint(size)
tinyint(size)
小数的数字类型。"size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。
decimal(size,d)
numeric(size,d)
固定长度的字符串类型(可容纳字母、数字以及特殊字符)。在括号中规定字符串的长度。
char(size)
可变长度的字符串类型(可容纳字母、数字以及特殊的字符)。在括号中规定字符串的最大长度。
varchar(size)
日期格式。
date(yyyymmdd)
////////////////////////////////////////////////////////////////////////////
SQL Constraints 约束
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
我们将主要探讨以下几种约束:
1.NOT NULL
2.UNIQUE
3.PRIMARY KEY
4.FOREIGN KEY
5.CHECK
6.DEFAULT
----------------------------------------------------------------------------
NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
下面的 SQL 语句强制 "Id_P" 列和 "LastName" 列不接受 NULL 值:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
------------------------------------------------------------------
UNIQUE 约束唯一标识表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 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),
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)
)
如果需要命名 UNIQUE 约束(给约束起个名),以及为多个列定义 UNIQUE 约束,请使用下面的 SQL 语法:
在MySQL / SQL Server / Oracle / MS Access中:
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)
)
当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:
ALTER TABLE Persons ADD UNIQUE (Id_P)
如需命名 UNIQUE 约束???,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:
在MySQL / SQL Server / Oracle / MS Access中:
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
如需撤销 UNIQUE 约束,请使用下面的 SQL:
在MySQL中:
ALTER TABLE Persons DROP INDEX uc_PersonID
在SQL Server / Oracle / MS Access中:
ALTER TABLE Persons DROP CONSTRAINT uc_PersonID
------------------------------------------------------------------
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。主键列不能包含 NULL 值。每个表都应该有且仅有一个主键。
下面的 SQL 在 "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 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
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 PRIMARY KEY (Id_P,LastName)
)
如果在表已存在的情况下为 "Id_P" 列创建 PRIMARY KEY 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons ADD PRIMARY KEY (Id_P)
如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)//这个约束被命名为pk_PersonID
注释:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons DROP PRIMARY KEY
SQL Server / Oracle / MS Access:
ALTER TABLE Persons DROP CONSTRAINT pk_PersonID
------------------------------------------------------------------
FOREIGN KEY 约束
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
下面的 SQL 在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY:
===MySQL:
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (O_Id),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
===SQL Server / Oracle / MS Access:
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) //约束被命名为fk_PerOrders
REFERENCES Persons(Id_P)
)
表已存在:
如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束,请使用下面的 SQL:
=====MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
=====MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:
====MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
====SQL Server / Oracle / MS Access:
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
-----------------------------------------------------------------
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
下面的 SQL 在 "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 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
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')
)
如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束,请使用下面的 SQL:
======MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CHECK (Id_P>0)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
======MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
如需撤销 CHECK 约束,请使用下面的 SQL:
=====MySQL:
ALTER TABLE Persons
DROP CHECK chk_Person
======SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
--------------------------------------------------------------
DEFAULT 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
下面的 SQL 在 "Persons" 表创建时为 "City" 列创建 DEFAULT 约束:
=====My SQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
如果在表已存在的情况下为 "City" 列创建 DEFAULT 约束,请使用下面的 SQL:
====MySQL:
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
====SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
如需撤销 DEFAULT 约束,请使用下面的 SQL:
====MySQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT
====SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
///////////////////////////////////////////////////////////////////////////
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
语法:在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name) //注释:"column_name" 规定需要索引的列。
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
实例:
创建一个简单的索引,索引名为 "PersonIndex",在 Person 表的 LastName 列:
CREATE INDEX PersonIndex
ON Person (LastName)
如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:
CREATE INDEX PersonIndex
ON Person (LastName DESC)
假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
///////////////////////////////////////////////////////////////////////////////
DROP 语句,可以删除索引、表和数据库。
使用DROP INDEX 命令删除表格中的索引:
用于 MySQL 的语法:
====ALTER TABLE table_name DROP INDEX index_name
用于 IBM DB2 和 Oracle 语法:
====DROP INDEX index_name
用于 MS SQL Server 的语法:
====DROP INDEX table_name.index_name
用于 Microsoft SQLJet (以及 Microsoft Access) 的语法:
====DROP INDEX index_name ON table_name
DROP TABLE 语句用于删除表:DROP TABLE 表名称(表的结构、属性以及索引也会被删除):
DROP DATABASE 语句用于删除数据库:DROP DATABASE 数据库名称
TRUNCATE TABLE 命令(仅仅删除表格中的数据):TRUNCATE TABLE 表名称
//////////////////////////////////////////////////////////////////////////////
ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
如需在表中添加列,请使用下列语法:
ALTER TABLE table_name
ADD column_name datatype
要删除表中的列,请使用下列语法:
ALTER TABLE table_name
DROP COLUMN column_name
注释:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。
要改变表中列的数据类型,请使用下列语法:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
///////////////////////////////////////////////////////////////////////
AUTO INCREMENT 字段,我们通常希望在每次插入新记录时,自动地创建主键字段的值。
下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:
MySQL:
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:
====ALTER TABLE Persons AUTO_INCREMENT=100
要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES ('Bill','Gates')
上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。
---------------------------------------------------------------
SQL Server:
CREATE TABLE Persons
(
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
MS SQL 使用 IDENTITY 关键字来执行 auto-increment 任务。
默认地,IDENTITY 的开始值是 1,每条新记录递增 1。
要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10)
要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES ('Bill','Gates')
----------------------------------------------------
Access:
CREATE TABLE Persons
(
P_Id int PRIMARY KEY AUTOINCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
MS Access 使用 AUTOINCREMENT 关键字来执行 auto-increment 任务。
默认地,AUTOINCREMENT 的开始值是 1,每条新记录递增 1。
要规定 "P_Id" 列以 20 起始且递增 10,请把 autoincrement 改为 AUTOINCREMENT(20,10)
要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES ('Bill','Gates')
----------------------------------------------------
Oracle:
在 Oracle 中,代码稍微复杂一点。
您必须通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。
请使用下面的 CREATE SEQUENCE 语法:
CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
上面的代码创建名为 seq_person 的序列对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高访问速度要存储多少个序列值。
要在 "Persons" 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):
INSERT INTO Persons (P_Id,FirstName,LastName)
VALUES (seq_person.nextval,'Lars','Monsen')
上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 的赋值是来自 seq_person 序列的下一个数字。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。
//////////////////////////////////////////////////////////////////
VIEW 什么是视图?
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
SQL CREATE VIEW 语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
例:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
我们可以查询上面这个视图:
SELECT * FROM [Current Product List]
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName
SQL 更新视图写法:
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
现在,我们希望向 "Current Product List" 视图添加 "Category" 列。我们将通过下列 SQL 更新视图:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
通过 DROP VIEW 命令来删除视图语法:
====DROP VIEW view_name
//////////////////////////////////////////////////
SQL 日期
当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。
只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。
在讨论日期查询的复杂性之前,我们先来看看最重要的内建日期处理函数。
日期处理函数随库不同而不同。具体使用需要现查。
比如获取当前的日期和时间:
在MySql中是Now();而在Sql Server中则是GETDATE();
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 - 格式: 唯一的数字
SQL 日期处理 如果不涉及时间部分,那么我们可以轻松地比较两个日期!
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
如果有时间部分,在oracle中可能需要to_date()函数.
//////////////////////////////////////////////////
NULL
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 用作未知的或不适用的值的占位符。
NULL 值的处理方式与其他值不同。
测试 NULL 值呢?
无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。必须使用 IS NULL 和 IS NOT NULL 操作符。
例:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL (或者 IS NOT NULL)
-----------------------------------------------------------------
假如 "UnitsOnOrder" 列是可选的,而且可以包含 NULL 值。
我们使用如下 SELECT 语句:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
在上面的例子中,如果有 "UnitsOnOrder" 值是 NULL,那么结果是 NULL。
微软的 ISNULL() 函数用于规定如何处理 NULL 值。
NVL(), IFNULL() 和 COALESCE() 函数也可以达到相同的结果。
在这里,我们希望 NULL 值为 0。
下面,如果 "UnitsOnOrder" 是 NULL,则不利于计算,因此如果值是 NULL 则 ISNULL() 返回 0。
SQL Server / MS Access:
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
Oracle:
Oracle 没有 ISNULL() 函数。不过,我们可以使用 NVL() 函数达到相同的结果:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
MySQL:
MySQL 也拥有类似 ISNULL() 的函数 IFNULL(),就像这样:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
或者我们可以使用 COALESCE() 函数,就像这样:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products
////////////////////////////////////////////////////////////////////
SQL 函数
SQL 拥有很多可用于计数和计算的内建函数。语法为:
=====SELECT function(列) FROM 表函数的类型
在 SQL 中,基本的函数类型和种类有若干种。函数的基本类型是:
Aggregate 函数:合计函数操作面向一系列的值,并返回一个单一的值
Scalar 函数 :操作面向某个单一的值,并返回基于输入值的一个单一的值。
注释:如果在 SELECT 语句的项目列表中的众多其它表达式中使用 SELECT 语句,则这个 SELECT 必须使用 GROUP BY 语句!
1.AVG 函数返回数值列的平均值。NULL 值不包括在计算中。
SELECT AVG(column_name) FROM table_name
例:
我们希望找到 OrderPrice 值高于 OrderPrice 平均值的客户。
SELECT Customer FROM Orders
WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
2.COUNT() 函数返回匹配指定条件的行数。
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECT COUNT(column_name) FROM table_name
COUNT(*) 函数返回表中的记录数:
SELECT COUNT(*) FROM table_name
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:
SELECT COUNT(DISTINCT column_name) FROM table_name
注释:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是无法用于 Microsoft Access。
如:希望计算 "Orders" 订单表中不同客户的数目。
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders
3.FIRST() 函数 返回指定的字段中第一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
如:SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders where conditions order by column
4.LAST() 返回指定字段中的最后一个记录的值。同first() 用法。
5.MAX()/MIN() 函数返回一列中的最大/小值。NULL 值不包括在计算中。
SELECT MAX(column_name) FROM table_name
注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
6.SUM() 函数返回数值列的总数(总额)。
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders
7.GROUP BY 用于结合合计函数,根据一个或多个列对结果集进行分组。
注:合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。
语法:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
希望查找每个客户的总金额(总订单),使用下列 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
如果使用:SELECT Customer,SUM(OrderPrice) FROM Orders 将得不到想要的结果。
SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。
"SUM(OrderPrice)" 返回一个单独的值("OrderPrice" 列的总计),
而 "Customer" 返回 6 个值(每个值对应 "Orders" 表中的每一行)。
因此,我们得不到正确的结果。不过,GROUP BY 语句解决了这个问题。
对一个以上的列应用 GROUP BY 语句,就像这样:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate
8.HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
SQL HAVING 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
例:
希望查找订单总金额少于 2000 的客户。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。
我们在 SQL 语句中增加了一个普通的 WHERE 子句:
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
9.UCASE 函数把字段的值转换为大写。
LCASE 函数把字段的值转换为小写。
语法
SELECT UCASE(column_name) FROM table_name
SELECT LCASE(column_name) FROM table_name
10.MID 函数用于从文本字段中提取字符。
SELECT MID(column_name,start[,length]) FROM table_name
column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
例:
希望从 "City" 列中提取前 3 个字符,(显示该列值的前三个字符)。
SELECT MID(City,1,3) as SmallCity FROM Persons
11.LEN 函数返回文本字段中值的长度。语法:
SELECT LEN(column_name) FROM table_name
12.ROUND 函数 用于把数值字段舍入为指定的小数位数。(四舍五入方式)
SELECT ROUND(column_name,decimals) FROM table_name
column_name 必需。要舍入的字段。
decimals 必需。规定要返回的小数位数。(小数点后的位数)
13.NOW 函数返回当前的日期和时间。
提示:如果您在使用 Sql Server 数据库,请使用 getdate() 函数来获得当前的日期时间。
语法:SELECT NOW() FROM table_name
例:
SELECT ProductName, UnitPrice, Now() as PerDate FROM Products (一共三列,时间都显示为当前时间)
14.FORMAT 函数用于对字段的显示进行格式化。
语法:
SELECT FORMAT(column_name,format) FROM table_name
column_name 必需。要格式化的字段。
format 必需。规定格式。
例:希望显示每天日期所对应的名称和价格(日期的显示格式是 "YYYY-MM-DD")。
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate
FROM Products