SQL必知必会(第3版)学习笔记【16-22章】

版权声明:本文为博主 http://blog.csdn.net/churximi 原创文章,未经允许不得转载,谢谢。 https://blog.csdn.net/churximi/article/details/51606458

第16章 更新和删除数据

更新数据

  • UPDATE语句
    • 更新表中特定行
    • 更新表中所有行
UPDATE Customers 
SET cust_email = '[email protected]' 
WHERE cust_id = '1000000005';
  • 更新多个列
UPDATE Customers 
SET cust_contact = 'Sam Roberts', 
    cust_email = '[email protected]' 
WHERE cust_id = '1000000006';

删除数据

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

更新和删除的指导原则

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

第17章 创建和操纵表

创建表

  • 两种创建表的方法

    • 多数DBMS具有交互式创建和管理表的工具
    • 直接用SQL语句操纵
  • CREATE TABLE语句

表创建基础

为利用CREATE TALBE创建表,必须给出下列信息:
- 新表的名字
- 表列的名字和定义,用逗号分隔
- 有的DBMS要求指定表的位置

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值

  • 每个表列或者是NULL列,或者是NOT NULL列,这种状态在创建时由表的定义规定
  • 如果不指定,则默认是NULL
  • 只有不允许NULL值的列才可用于主键

指定默认值

  • 关键字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
);

获取系统日期

数据库 函数/变量
Access NOW()
DB2/PostgreSQL CURRENT_DATE
MySQL CURRENT_DATE()
Oracle SYSDATE
SQL Server/Sybase GETDATE()

更新表(表的定义)

  • ALTER TABLE语句

    • 表中包含数据时一般不要更新
    • 所有DBMS都允许给现有的表增加列
    • 许多DBMS不允许删除或更改表中的列
    • 多数DBMS允许重新命名表中的列
    • 许多DBMS对已经填有数据的列的更改有限制,对未填有数据的列几乎没有限制
  • 为了使用ALTER TABLE更改表结构,必须给出下面的信息:

    • 在ALTER TABLE之后给出要更改的表名
    • 所做更改的列表
ALTER TABLE Vendors 
ADD vend_phone CHAR(20);

删除表

  • DROP TABLE语句
DROP TABLE CustCopy;

重命名表

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

第18章 使用视图

视图

  • 视图是虚拟的表,它只包含使用时动态检索数据的查询
  • 某个查询包装成一个虚拟表(名为ProductCustomers)
  • 可以如下检索出相同的数据:
SELECT cust_name, cust_contact 
FROM ProductCustomers 
WHERE prod_id = 'RGAN01';
  • 视图不包含任何列或数据,它包含的是一个查询

为什么使用视图

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

在视图创建之后,可以用与表基本相同的方式利用它们。(虚拟表)

视图的规则和限制

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

创建视图

  • CREATE VIEW语句
  • DROP VIEW viewname语句来删除视图
  • 覆盖(或更新)视图:必须先DROP它,再重新创建它

利用视图简化复杂的联结

- 视图最常见的应用之一是隐藏复杂的SQL,这通常都会涉及联结

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语句的层次)

第19章 使用存储过程

  • 为以后的使用而保存的一条或多条SQL语句的集合
  • 可将其视为批文件,虽然它们的作用不仅限于批处理

为什么要使用存储过程

  • 通过把处理封装在容易使用的单元中,简化复杂的操作
  • 由于不要求反复建立一系列处理步骤,保证了数据的一致性(防止错误)
  • 简化对变动的管理(保证安全性)
  • 存储过程通常以编译过的形式存储,所以DBMS为处理命令所做的工作较少,提高性能
  • 存在一些只能用在单个请求中的SQL元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码

  • 简单、安全、高性能

-缺点:
- 不同DBMS的存储过程语法有所不同
- 存储过程的编写比基本SQL语句复杂

执行存储过程

  • EXECUTE语句
  • EXECUTE接受存储过程名和需要传递给它的任何参数

创建存储过程

  • 编写代码

第20章 管理事务处理

事务处理

  • 事务处理用来维护数据库的完整性,它保证成批的SQL操作要么完全执行,要么完全不执行
  • 事务处理是一种机制,用来管理必须成批执行的SQL操作,以保证数据库不包含不完整的操作结果(好比运行过程中突然断电了,导致批处理意外终止)

  • 事务:指一组SQL语句

  • 回退:rollback,撤销指定SQL语句的过程
  • 提交:commit,将未存储的SQL语句结果写入数据库表
  • 保留点:临时占位符

  • 可以回退INSERT、UPDATE、DELETE语句

  • 不能回退CREATE、DROP、SELECT(回退SELECT也没有必要)

控制事务处理

  • ROLLBACK语句
  • COMMMIT语句
  • SAVEPOINT语句

第21章 使用游标

  • 有时,需要在检索出来的行中前进或后退一行或多行,因此使用游标(cursor)
  • 在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据
  • 特性:

    • 能够标记游标为只读,数据不能更新和删除
    • 能控制可以执行的定向操作(向前、向后、第一、最后、绝对位置、相对位置等)
    • 能标记某些列为可编辑的,某些列为不可编辑的
    • 规定范围,使游标对创建它的特定请求(如存储过程)或对所有请求可访问
    • 指示DBMS对检索出的数据(而不是指出表中活动数据)做复制,使在游标打开和访问期间数据不变化
  • 游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改

使用游标

步骤:
- 在能够使用游标前,必须声明(定义)它
- 一旦声明后,必须打开游标以供使用(数据检索出来)
- 对于填有数据的游标,根据需要取出(检索)各行
- 在结束游标使用时,必须关闭游标,而且可能的话,释放游标

创建游标

  • DECLARE语句
DECLARE CustCursor CURSOR
FOR
SELECT * FROM Customers 
WHERE cust_email IS NULL;

使用游标

  • OPEN CURSOR语句
OPNE CURSOR CustCursor 
  • FETCH语句访问游标数据

关闭游标

CLOSE CustCursor 

第22章 了解高级SQL特性

高级数据处理特性

约束

管理如何插入或处理数据库数据的规则
引用完整性
- 主键(一种特殊的约束),创建主键:PRIMARY KEY
- 外键:外键是表中的一个列,其值必须在另一表的主键中列出(REFERENCES关键字)
- 唯一约束:用来保证一个列(或一组列)中的数据唯一(UNIQUE约束)
- 表可包含多个唯一约束,但每个表只允许一个主键
- 唯一约束列可包含NULL值
- 唯一约束列可修改或更新
- 唯一约束列的值可重复使用
- 与主键不一样,唯一约束列不能用来定义外键

  • 检查约束(CHECK)
    • 检查最小或最大值
    • 指定范围
    • 只允许特定的值

索引

用来排序数据,以加快搜索和排序操作的速度。
- 索引改善检索操作的性能,但降低数据插入、修改和删除的性能。在执行这些操作时,DBMS必须动态地更新索引
- 索引数据可能要占用大量的存储空间
- 并非所有数据都适合于索引。唯一性不好的数据从索引得到的好处不必具有更多可能值的数据从索引得到的好处多
- 索引用于数据过滤和数据排序,如果经常以某种特定的顺序排序数据,则该数据可能是索引的备选
- 可以在索引中定义多个列

  • CREATE INDEX语句

触发器

触发器是特殊对存储过程,它在特定的数据库活动发生时自动执行。
- 保证数据一致(如大小写自动转换)
- 基于某个表的变动在其他表上执行活动
- 进行额外的验证并根据需要回退数据
- 计算计算列的值或更新时间戳

一般来说,约束的处理比触发器快,因此在可能的时候,尽量使用约束

数据库安全

  • 利用管理机制授予或限制对数据的访问
  • 任何安全系统的基础都是用户授权和身份确认
  • GRANT、REVOKE语句

猜你喜欢

转载自blog.csdn.net/churximi/article/details/51606458