《SQL必知必会》16-18章笔记

最近有些懈怠,得改。

第16章 更新和删除数据

16.1更新数据

UPDATE的使用方式:

  • 更新表中的特定行
  • 更新表中的所有行
    基本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';

16.2删除数据

从一个表中删除数据,使用DELETE语句。有两种删除的方式:

  • 从表中删除特定的行
  • 从表中删除所有行

下面语句从Customers表删除一行:

DELETE FROM Customers 
WHERE cust_id = '100000006';
  • DELETE删除整行而不是删除列
  • 删除指定的列,可使用UPDATE语句
  • DELETE不删除表本身
  • 删除所有行,可使用TRUNCATE TABLE语句,速度更快(因为不记录数据的变动)

16.3更新和删除的指导原则

更新和删除的指导原则

  • 除非确实打算更新和删除每一行,否则绝对要带有WHERE子句
  • 保证每个表都有主键
  • 在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录
  • 使用强制实施引用完整性的数据库,这样DBMS将不允许删除具有与其他表相关联的数据的行

第17章 创建和操作表

17.1 创建表

一般有两种创建表的方法:

  • 多数具有交互式地创建和管理数据库表的工具;
  • 也可以直接用SQL语句操纵

17.1.1表创建基础

利用CREATE TABLE创建表,必须给出下列信息

  • 新表的名字,在关键字CREATE TABLE后给出;
  • 表列的名字和定义,用逗号分隔;
  • 有的DBMS还要求指定表的位置

下例是本书创建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
);

17.1.2使用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。这就会组织没有插入值的列。如果插入没有值的列,将返回错误,且插入失败。

17.1.3指定默认值

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用来更改表结构,必须给出下面的信息:

  • 在ALTER TABLE之后给出要更改的表名(该表必须存在,否则出错);
  • 列出要做哪些更改

例如:

ALTER TABLE Vendors 
ADD vend_phone CHAR(20);

这条语句给Vendors增加一个名为vend_phone的列,其数据类型是CHAR。

更改或者删除列、增加约束或增加键,这些操作也使用类似的语法:

ALTER TABLE Vendors
DROP COLUMN vend_phone

复杂的表结构更改一般需要手动删除过程,它涉及以下步骤:

  1. 用新的列布局创建一个新表
  2. 使用INSERT SELECT语句从旧表复制数据到新表。有必要的话可以使用转换函数和计算字段;
  3. 检验包含所需数据的新表
  4. 重命名旧表
  5. 用旧表原来的名字来命名新表
  6. 根据需要,重新创建触发器、存储过程、索引和外键

17.3删除表

DROPTABLE CustCopy;

17.4重命名表

  • DB2、MySQL、Oracle和PostgreSQL可使用RENAME语句
  • SQL Server和Sybase可使用sp_rename

18章 使用视图

18.1视图

视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

如果我们需要查询订购了某种产品的顾客。我们可以这么做

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是一个视图,它不包含任何列或数据,包含的是一个查询。

18.1.1为什么使用视图

  • 重用SQL语句
  • 简化复杂的SQL操作
  • 使用表的组成部分而不是整个表
  • 保护数据,可以给用户授予表的特定部分的访问权限,而不是整个表的访问权限
  • 更改数据格式和表示,视图可返回与底层表的表示和格式不同的数据

18.1.2视图的规则和限制

一些常见的规则和限制

  • 视图必须唯一命名
  • 对于可以创建的视图数目没有限制
  • 为了创建视图,必须具有足够的访问权限
  • 视图可以嵌套,即:可以利用从其他视图中检索数据的查询来构造一个视图
  • 许多DBMS禁止在视图查询中使用ORDER BY子句
  • 有的DBMS要求命名返回的所有列,如果列是计算字段,则需要使用别名
  • 视图不能索引,也不能有关联的触发器或默认值
  • 有的DBMS把视图作为只读的查询
  • 有的DBMS允许创建这样的视图:它不允许进行导致行不再术语视图的插入或更新

18.2创建视图

视图用CREATE VIEW来创建,与CREATE TABLE一样,只能创建不存在的视图。
删除视图 DROP VIEW viewname。

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;

这条语句创建了一个名为ProductCustomers的视图,它联结了三个表,返回已订购了任意产品的所有顾客的列表。如果执行SELECT * FROM ProductCustomers,将列出订购了任意商品的顾客。
检索订购了产品RGAN01的顾客,可如下进行:

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 VendorLocation AS
SELECT RTRIM(vend_name)||'('||
RTRIM(vend_country)||')'
    AS vend_title
FROm Vendors

要检索数据,创建所有邮件的标签,可如下进行:

SELECT *
FROM VendorLocations;

18.2.3用视图过滤不想要的数据

可以定义CustomerEMailList视图,过滤没有电子邮件地址的顾客。为此可以使用下面语句

CREATE VIEW CustomerEMailList AS
SELECT cust_id,cust_name,cust_email
FROM Customers
WHERE cust_email IS NOT NULL;

18.2.4使用视图与计算字段

检索某个订单中的物品,并计算每种物品的总价格:

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;

可以看到,视图非常容易创建,而且很好使用。

你可能感兴趣的:(SQL)