2.1.检索单个列
SELECT prod_name
FROM Products;
2.2.检索多个列
SELECT prod_id,prod_name,prod_price
FROM Products;
2.3.检索所有列
SELECT *
FROM Products;
3.1 排序数据
SELECT prod_name
FROM Products
ORDER BY prod_name;
3.2 按多个列排序
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY prod_price,prod_name;
3.3按列位置排序
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY 2,3;
跟上面的一样
3.4 指定排序方向
降序
SELECT prod_id,proc_price,prod_name
FROM Products
ORDER BY prod_price DESC;
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY prod_price DESC,prod_name;
过滤数据
4.1 使用WHERE子句
SELECT prod_name,prod_price
FROM Products
WHERE prod_price = 3.49;
4.2 WHERE子句操作符
4.2.1 检查单个值
SELECT prod_name,prod_price
FROM Products
WHERE prod_price < 10;
SELECT prod_name,prod_price
FROM Products
WHERE prod_price <= 10;
4.2.2 不匹配检查
SELECT vend_id,prod_name
FROM Products
WHERE vend_id <> ‘DLL01’;
SELECT vend_id,prod_name
FROM Products
WHERE vend_id != ‘DLL01’;
4.2.3 范围值检查
SELECT prod_name,prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
4.2.4 空值检查
SELECT prodname
FROM Products
WHERE prod_price IS NULL;
SELECT vend_id
FROM Vendors
WHERE vend_state IS NULL;
高级数据过滤
5.1 组合WHERE子句
5.1.1 AND操作符号
SELECT prod_id,prod_price,prod_name
FROM Products
WHERE vend_id = ‘DLL01’ AND prod_price <= 4;
5.1.2 OR操作符号
SELECT prod_name, prod_price
FROM Products
WHERE vend_id= ‘DLL01’ OR vend_id= ‘BRS01’;
5.1.3 计算次序
优先处理AND
SELECT prod_name,prod_price
FROM Products
WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’
AND prod_price >= 10;
SELECT prod_name,prod_price
FROM Products
WHERE (vend_id= ‘DLL01’ OR vend_id= ‘BRS01’)
AND prod_price >=10;
5.2 IN操作符
SELECT prod_name,prod_price
FROM Products
WHERE vend_id IN (‘DLL01’, ‘BRS01’)
ORDER BY prod_name;
SELECT prod_name,prod_price
FROM Products
WHERE vend_id = ‘DLL01’ OR vend_id = 'BRS01;
ORDER BY prod_name;
5.3 NOT操作符
SELECT prod_name
FROM Products
WHERE NOT vend_id = ‘DLL01’
ORDER BY prod_name;
SELECT prod_name
FROM Products
WHERE vend_id <> ‘DLL01’
ORDER BY prod_name;
通配符进行过滤
6.1 LIKE操作符
通配符 (wildcard) 用来匹配值的一部分的特殊字符
搜索模式(search pattern) 由字面值,通配符或两者组合构成的搜索条件
6.1.1 百分号(%)通配符
Fish开头
SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE ‘Fish%’;
匹配任何位置包含文件bean bag的值
SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE ‘%bean bag%’;
以F开头,y结尾
SELECT prod_name
FROM Products
WHERE prod_name LIKE ‘F%y’;
6.1.2 下划线 (_) 通配符
只能匹配单个字符
SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE ‘_ inch teddy bear’;
SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE ‘% inch teddy bear’;
6.1.3 方括号 ([]) 统配符
用来指定一个字符集,必须匹配指定位置的一个字符
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE ‘[JM]%’
ORDER BY cust_contact;
^表示否定
SELECT cust_contact
FROM Customers
WHERE cust_contact LINKE ‘[^JM]%’
ORDER BY cust_contact;
与上面相同
SELECT cust_contact
FROM Customers
WHERE NOT cust_contact LIKE ‘[JM]%’
ORDER BY cust_contact;
6.2 使用通配符的技巧
不要过分使用通配符.
除非绝对有必要,否则不要把它们用在搜索模式的开始处.
注意通配符的位置.
创建计算字段
7.1 计算字段
字段(field) 基本上与列(column)的意思相同.
7.2 拼接字段
拼接(concatenate) 将值联结到一起构成单个值.
SELECT vend_name + ‘(’ + vend_country + ‘)’
FROM Vendors
ORDER BY vend_name;
SELECT vend_name || ‘(’ || vend country || ‘)’
FROM Vendors
ORDER BY vend_name;
上面两个都相同
如果要去掉空格,下面两个都相同
SELECT RTRIM(vend_name) + ‘(’ + RTRIM(vend_country) + ‘)’
FROM Vendors
ORDER BY vend_name;
SELECT RTRIM(vend_name) || ‘(’ || RTRIM(vend_country) || ‘)’
FROM Vendors
ORDER BY vend_name;
RTRIM()函数去掉值右边的所有空格
使用别名(alias)
AS
SELECT RTRIM(vend_name) + ‘(’ + RTRIM(vend_country) + ‘)’ AS vend_title
ORDER BY vend_name;
SELECT RTRIM(vend_name) || ‘(’ || RTRIM(vend_country) || ‘)’ AS vend_title
FROM Vendors
ORDER BY vend_name;
7.3 执行算术计算
SELECT prod_id,quantity,item_price
FROM OrderItems
WHERE order_name = 20000;
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS
expanded_price
FROM OrderItems
WHERE Order_num = 20000;
使用数据处理函数
8.1 函数
8.2.1 文本处理函数
UPPER()
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase
FROM Vendors
ORDER BY vend_name;
SELECT cust_name,cust_contact
FROM Customers
WHERE cust_contact = ‘Michael Green’;
SOUNDEX()匹配所有发音类似于Michael Green 的联系名:
SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX (‘Michael Green’);
8.2.2 日期和时间处理函数
DATEPART
SQL Server版本
SELECT order_num
FROM Orders
WHERE DATEPART(yy, order_date)=2004;
Access版本
SELECT order_num
FROM
WHERE DATEPART(‘yyyy’,order_date)=2004;
PostgreSQL版本
SELECT order_num
FROM Orders
WHERE DATE_PART(‘year’,order_date)=2004;
MySQL版本
SELECT order_num
FROM Orders
WHERE YEAR(order_date)=2004;
Oracle版本
SELECT order_num
FROM Orders
WHERE to_number(to_char(order_date,‘YY’))=2004;
使用BETWEEN
SELECT order_num
FROM Orders
WHERE order_date BETWEEN to_date(‘01-JAN-2004’)
AND to_date(‘31-DEC-2004’);
8.2.3 数值处理函数
汇总数据
9.1 聚集函数
聚集函数(aggregate function) 运行在行组上,计算和返回单个值的函数
9.1.1 AVG()函数
SELECT AVG(prod_price) AS avg_price
FROM Products;
SELECT AVG(prod_price) AS avg_price
FROM Products
WHERE vend_id = ‘DLL01’;
9.1.2 COUNT()函数
SELECT COUNT(*) AS num_cust
FROM Customers;
SELECT COUNT(cust_email) AS num_cust
FROM Customers;
9.1.3 MAX()函数
SELECT MAX(prod_price) AS max_price
FROM Products;
9.1.4 MIN()函数
SELECT MIN(prod_price) AS min_price
FROM Products;
9.1.5 SUM()函数
SELECT SUM(quantity) AS items_ordered
FROM OrderItems
WHERE order_num = 20005;
SELECT SUM(item_price*quantity) AS total_price
FROM OrderItems
WHERE order_num = 20005;
9.2 聚聚不同值
使用distinct会抬高prod_price
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = ‘DLL01’;
ALL为默认,不需要指定
只包含不同的值,指定distinct参数
如果指定列名,distinct只能用于count()
9.3 组合聚集函数
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM Products;
分组数据
10.1 数据分组
SELECT COUNT(*) AS num_prods
FROM Products
WHERE vend_id = ‘DLL01’;
10.2 创建分组
SELECT vend_id,COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
10.3 过滤分组
HAVING过滤掉<2的
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT ( * ) >=2;
过滤是基于分组聚集值而不是特定行值的
如果没有WHERE将会多出一行
SELECT vend_id, COUNT( * ) AS num_prods
FROM Products
WHERE prod_price >=4
GROUP BY vend_id
HAVING COUNT ( * ) >=2;
10.4 分组和排序
SELECT order_num, COUNT (*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT ( * ) >=3;
SELECT order_name, COUNT ( * ) AS items
FROM OrderItems
GROUP BY order_name
HAVING COUNT ( * ) >=3
ORDER BY items, order_num;
10.5 SELECT子句顺序
使用字查询
查询(query) 任何SQL语句都是查询的.一般指SELECT语句.
子查询(subquery)
11.2 利用子查询进行过滤
SELECT order_name
FROM OrderItems
WHERE prod_id = ‘RGAN01’;
SELECT cust_id
FROM Orders
WHERE order_num IN (20007,20008);
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id =(‘RGAN01’);
检索两列的SQL语句
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (‘1000000004’,‘1000000005’);
SELECT cust_name,cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = ‘RGAN01’));
11.3 作为计算字段使用子查询
SELECT COUNT(*) AS orders
FROM Orders
WHERE cust_id = ‘1000000001’;
SELECT cust_name,cust_state,(SELECT COUNT(*) FROM Orders
WHERE Orders, cust_id = Customers.cust_id)
AS orders
FROM Customers
ORDER BY cust_name;
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE cust_id = cust_id) AS orders
FROM Customers
ORDER BY cust_name;
联结表
12.1 联结
join
12.1.1 关系表
12.1.2 为什么要使用联结
12.2 创建联结
从两张表中选出相同特征的
SELECT vend_name,prod_name,prod_price
FROM Vendors,Products
WHERE Vendors.vend_id = Products.vend_id;
12.2.1 WHERE子句的重要性
SELECT vend_name,prod_name,prod_price
FROM Vendors,Products;
12.2.2 内部联结
INNER JOIN…ON…
SELECT vend_name,prod_name,prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id
12.2.3 联结多个表
SELECT prod_name,vend_name,prod_price,quantity
FROM OrderItems,Products,Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;
SELECT cust_name,cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = (‘RGAN01’ ));
使用联结的相同查询
SELECT cust_name,cust_contact
FROM Customers,Orders,OrderItems
WHERE Customers,cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = ‘RGAN01’;
创建高级联结
13.1 使用表别名
SELECT RTRIM(vend_name) + ’ (’ + RTRIM(vend_country)
+ ’ ) ’ AS vend_title
FROM Vendors
ORDER BY vend_name;
SELECT cust_name, cust_contact
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = ‘RGAN01’;
13.2 使用不同类型的联结
13.2.1 自联结
SELECT cust_id,cust_name,cust_contact
FROM Customers
WHERE cust_name = (SELECT cust_name
FROM Customers
WHERE cust_contact = ’ Jim Jones ’ );
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM Customers AS c1, Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = ’ Jim Jones ';
13.2.2 自然联结
SELECT C.*, O.order_num, O.order_date, OI.prod_id, OI.quantity,OI.item_price
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = ‘RGAN01’;
13.2.3 外部联结
包含了那些在相关表中没有关联行的行称为外部联结
SELECT Customers.cust_id, Orders.order_num
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
外部联结必须包含LEFT或RIGHT
LEFT OUTER JOIN … ON …
SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
RIGHT OUTER JOIN … ON …
SELECT Customers.cust_id, Orders.order_num
FROM Customers RIGHT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
*=用来指定应该包括Customers表中的每一行,为左外联结操作符.
SELECT Customers.cust_id,Orders.order_num
FROM Customers,Orders
WHERE Customers.cust_id *= Orders.cust_id;
=为右外联结操作符
SELECT Customers.cust_id,Orders.order_num
FROM Customers,Orders
WHERE Orders.cust_id = Customers.cust_id;
Oracle版本
SELECT Customers.cust_id,Orders.order_num
FROM Customers,Orders
WHERE Customers.cust_id (+) = Orders.cust_id;
Access,MYSQK,SQL Server或Sybase不支持的FULL OUTER JOIN
SELECT Customers.cust_id, Orders.order_num
FROM Orders FULL OUTER JOIN Customers
ON Orders.cust_id = Customers.cust_id;
13.3 使用带聚集函数的联结
SELECT Customers.cust_id, COUNT(Orders.order_num) AS num_ord
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id;
SELECT Customers.cust_id, COUNT(Orders.order_num0 AS num_ord
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id;
Oracle没有AS
13.4 使用联结和联结条件
组合查询
14.1 组合查询
14.2 创建组合查询
14.2.1 使用UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ( ‘IL’, ‘IN’, ‘MI’ );
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = ’ Fun4All ’ ;
组合这两条语句
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ( ‘IL’, ‘IN’, ‘MI’)
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = ’ Fun4All ';
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ( ‘IL’, ‘IN’, ‘MI’ )
OR cust_name = ‘Fun4All’;
14.2.2 UNION规则
14.2.3 包含或取消重复的行
返回所有匹配行
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ( ‘IL’, ‘IN’, ‘MI’ )
UNION ALL
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = ‘Fun4All’;
14.2.4 对组合查询结果排序
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ( ‘IL’, ‘IN’, ‘MI’ )
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = ‘Fun4All’
ORDER BY cust_name, cust_contact;
插入数据
15.1 数据插入
15.1.1 插入完整的行
INSERT INTO Customers
VALUES(’ 1000000006’,
‘Toy Land’,
‘123 Any Street’,
‘New York’,
‘NY’,
‘11111’,
‘USA’,
NULL,
NULL);
编写INSERT语句更安全
INSERT INTO Customers(cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust-country,
cust_contact,
cust_email)
VALUES(’ 1000000006’,
‘Toy Land’,
‘123 Any Street’,
‘New York’,
‘NY’,
‘11111’,
‘USA’,
NULL,
NULL);
顺序不同,但是给了列名,插入的结果仍然正确
15.1.2 插入部分行
可以缺省
15.1.3 插入检索出的数据
INSERT INTO Customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust-country)
SELECT cust-id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust-country
FROM CustNew;
15.2 从一个表复制到另一个表
SELECT *
INTO CustCopy
FROM Customers;
CREATE TABLE CustCopy AS
SELECT *
FROM Customers;
跟新和删除数据
UPDATE Customers
SET cust_email = ‘kim@thetoystore.com’
WHERE cust_id = ‘100000005’;
UPDATE Customers
SET cust_contact = ‘Sam Roberts’,
cust_email = ‘sam@toyland.com’
WHERE cust_id =‘1000000006’;
去值
UPDATE Customers
SET cust_email = NULL
WHERE cust_id = ‘10000005’;
删除数据
DELETE FROM Customers
WHERE cust_id = ‘1000000006’;
16.3 更新和删除的指导原则
创建和操纵表
17.1 创建表
17.1.1 表创建基础
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);
17.1.2 使用NULL值
CREATE TABLE Orders
(
order_num INTEGER NOT NULL,
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT NULL
);
默认NULL
CREATE TABLE Vendors
(
vend_id CHAR(10) NOT NULL,
vend_name CHAR(50) NOT NULL,
vend_address CHAR(50) ,
vend_city CHAR(50) ,
vend_state CHAR(5) ,
vend_zip CHAR(10) ,
vend_country CHAR(50)
);
17.1.3 指定默认值
关键字DEFAULT
CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
item_price DECIMAL(8,2) NOT NULL
);
17.2 更新表
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
这个不是所有DBMS都可以用
ALTER TABLE Vendors
DROP COLUMN vend_phone;
17.3 删除表
DROP TABLE CustCopy;
17.4 重命名表
RENAME
使用视图
18.1 视图
SELECT cust_name,cust_contact
FROM Customers,Orders,OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = ‘RGAN01’;
SELECT cust_name,cust_contact
FROM ProductCustomers
WHERE prod_id = ‘RGAN01’;
18.1.1 为什么使用视图
18.1.2 视图的规则和限制
18.2 创建视图
18.2.1 利用视图简化复杂的联结
联结三个表
CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact,prod_id
FROM Customers,Orders,OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order.num;
SELECT * FROM ProductCustomers
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = ‘RGAN01’;
18.2.2 用视图重新格式化检索出的数据
SELECT RTRIM(vend_name) + ‘(’ + RTRIM(vend_country)
+ ‘)’ AS vend_title
FROM Vendors
ORDER BY vend_name;
CREATE VIEW VendorLocations AS
SELECT RTRIM(vend_name) + ’ (’ + RTRIM(vend_country)
+ ’ )’ AS vend_title
FROM Vendors;
SELECT *
FROM VendorLocations;
18.2.3 用视图过滤不想要的数据
CREATE VIEW CustomerEMailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL;
SELECT *
FROM CustomerEMailList;
18.2.4 使用视图与计算字段
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_numj = 20000;
CREATE VIEW OrderItemExpanded AS
SELECT order_num,
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems;
SELECT *
FROM OrderItemsExpanded
WHERE order_name = 20000;
使用存储过程
19.1 存储过程
19.2 为什么要使用存储过程
19.3 执行存储过程
EXECUTE
AddNewProduct定义为存储过程自身的组成部分
EXECUTE AddNewProduct( ‘JTS01’,
‘Stuffed Eiffel Tower’,
6.49,
‘Plush stuffed toy with the text La Tour Eiffel in red white and blue’)
存储过程所完成的工作
19.4 创建存储过程
Oracle版本
CREATE PROCEDURE MailingListCount
(ListCount OUT NUMBER)
IS
BEGIN
SELECT * FROM Customers
WHERE NOt cust_email IS NULL;
ListCount := SQL%ROWCOUNT;
END;
Microsoft SQL Server
CREATE PROCEDURE MailingListCount
AS
DECLARE @cnt INTEGER
SELECT @cnt = COUNT(*)
FROM Customers
WHERE NOT cust_email IS NULL;
RETURN @cnt;
SQL Server
管理事务处理
20.1 事务处理
transaction processing
20.2 空值事务处理
标识开始和结束
sql server
BEGIN TRANSACTION
…
COMMIT TRANSACTION
MYSQL
START TRANSACTION
…
20.2.1 使用ROLLBACK
回撤
DELETE FROM Orders;
ROLLBACK;
20.2.2 使用COMMIT
隐含提交implicit commit
SQL Server
BEGIN TRANSACTION
DELETE OrderItems WHERE order_num = 123456
DELETE Orders WHERE order_num = 123456
COMMIT TRANSACTION
20.2.3 使用保留点
MYSQL,Oracle
保留点
SAVEPOINT delete;
SQL Server,Sybase
SAVE TRANSACTION delete1;
SQL Server
ROLLBACK TRANSCATION delete1;
MYSQL,Oracle
ROLLBACK TO delete1;
SQL Server完整例子
使用游标
21.1 游标
21.1 使用游标
21.2.1 创建游标
DB2,SQL Server ,Sybase
Oracle PostgreSQL
21.2.2 使用游标
OPEN CURSOR CustCursor
FETCH用来检索当前行(自动从第一行开始)到声明的变量CustRecord中.
Oracle
从第一行到最后一行,对检索出来的数据进行循环.
21.2.3 关闭游标
CLOSE CustCursor
SQL Server
CLOSE CustCursor
DEALLOCATE CURSOR CustCursor
了解高级SQL特性
22.1 约束
22.1.1 主键
添加主键
22.1.2 外键
22.1.3 唯一约束
22.1.4 检查约束
22.2 索引
22.3 触发器
SQL Server
Oracle PostgreSQL
22.4 数据库安全
A样例脚本
A.2 获得样例表
http://www.forta.com/books/0672325675/
SQL语句的语法
索引