UPDATE的使用方式:
e.g:
UPDATE Customers SET cust_email = '[email protected]' WHERE cust_id = '1000000005';
UPDATE语句总是以要更新的表名开始。SET命令用来将新值赋给被更新的列,UPDATE语句以WHERE子句结束,它告诉DBMS更新哪一行。没有WHERE将会更新所有行,这不是我们所希望的。
更新多个列:
UPDATE Customers SET cust_contact = 'Sam Roberts', cust_email = '[email protected]' WHERE cust_id = '1000000006';
要删除某个列的值,可设置它为NULL,如下进行:
UPDATE Customers SET cust_email = NULL WHERE cust_id = '1000000005';
从一个表中删除数据,使用DELETE语句。有两种删除的方式:
下面语句从Customers表删除一行:
DELETE FROM Customers WHERE cust_id = '100000006';
更新和删除的指导原则
一般有两种创建表的方法:
利用CREATE TABLE创建表,必须给出下列信息
下例是本书创建Products表的例子
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 );
每个表列要么是NULL列,要么是NOT NULL列,这种状态在创建时由表的定义规定。
CREATE TABLE Orders ( order_num INTEGER NOT NULL , order_date DATETIME NOT NULL , cust_id CHAR(10) NOT NULL );
这里每一列的定义都有NOT NULL。这就会组织没有插入值的列。如果插入没有值的列,将返回错误,且插入失败。
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 );
ALTER TABLE用来更改表结构,必须给出下面的信息:
例如:
ALTER TABLE Vendors ADD vend_phone CHAR(20);
这条语句给Vendors增加一个名为vend_phone的列,其数据类型是CHAR。
更改或者删除列、增加约束或增加键,这些操作也使用类似的语法:
ALTER TABLE Vendors DROP COLUMN vend_phone
复杂的表结构更改一般需要手动删除过程,它涉及以下步骤:
DROPTABLE CustCopy;
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
如果我们需要查询订购了某种产品的顾客。我们可以这么做
SELECT cust_num,cust_contact FROM Customers,Orders,OrderItems WHERE Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num AND prod_id = 'RGAN01'
任何需要使用这个数据的人是需要理解相关表的结构,知道如何创建查询和对表进行联结。检索其他产品或者多个产品的数据必须要修改最后的WHERE子句。
现在,加入可以把整个查询包装成一个名为ProductCustomers的虚拟表,则可以如下轻松地检索出相同的数据:
SELECT cust_name, cust_contact FROM ProductCustomers WHERE prod_id = 'RGAN01';
这就是视图的作用。ProductCustomers是一个视图,它不包含任何列或数据,包含的是一个查询。
一些常见的规则和限制
视图用CREATE VIEW来创建,与CREATE TABLE一样,只能创建不存在的视图。
删除视图 DROP VIEW viewname。
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;
这条语句创建了一个名为ProductCustomers的视图,它联结了三个表,返回已订购了任意产品的所有顾客的列表。如果执行SELECT * FROM ProductCustomers,将列出订购了任意商品的顾客。
检索订购了产品RGAN01的顾客,可如下进行:
SELECT cust_name,cust_contact FROM ProductCustomers WHERE prod_id = 'RGAN01'
SELECT RTRIM(vend_name)||'('|| RTRIM(vend_country)||')' AS vend_title FROm Vendors ORDER BY vend_name;
现在,假设经常需要这个格式的结果。我们不必每次需要时执行这种拼接,而是创建一个视图,使用它时即可。
CREATE VIEW VendorLocation AS SELECT RTRIM(vend_name)||'('|| RTRIM(vend_country)||')' AS vend_title FROm Vendors
要检索数据,创建所有邮件的标签,可如下进行:
SELECT *
FROM VendorLocations;
可以定义CustomerEMailList视图,过滤没有电子邮件地址的顾客。为此可以使用下面语句
CREATE VIEW CustomerEMailList AS SELECT cust_id,cust_name,cust_email FROM Customers WHERE cust_email IS NOT NULL;
检索某个订单中的物品,并计算每种物品的总价格:
SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price FROM OrderItems WHERE order_num = 20008;
要将其转换为一个视图,可以如下进行
CREATE VIEW OrderItemExpanded_price SELECT order_num, prod_id, quantity, item_price, quantity*item_price AS expanded_price FROM OrderItems
利用视图来检索订单20008的详细内容就可以如下进行:
SELECT * FROM OrderItemExpanded WHERE order_num=20008;
可以看到,视图非常容易创建,而且很好使用。