zoukankan      html  css  js  c++  java
  • 《SQL必知必会》读书笔记

    Author:chemandy

     目录
    第1章 了解SQL
    第2章 检索数据
    第3章 排序检索数据
    第4章 过滤数据
    第5章 高级数据过滤
    第6章 用通配符进行过滤
    第7章 创建计算字段
    第8章 使用数据处理函数
    第9章 汇总数据
    第10章 分组数据
    第11章 使用子查询
    第12章 联结表
    第13章 创建高级联结
    第14章 组合查询
    第15章 插入数据
    第16章 更新和删除数据
    第17章 创建和操作表
    第18章 使用视图
    第19章 使用存储过程
    第20章 管理实务处理
    第21章 使用游标
    第22章 了解高级SQL特性

     
    第1章 了解SQL
    1. 数据库(database)保存有组织的数据的容器(一个/一组文件)。
    2. 表(table)某种特定类型的结构化清单。
    3. 模式(schema)关于数据库和表的部署及特性的信息。
    4. 列(colomn)表中的一个字段。所有表都由一个或多个列组成。
    5. 行(row)表中的一个记录。
    6. 主键(primary key)一列(或一组列),其值能够唯一标识表中每个行。
       ①任意两行都不具有相同的主键值;
       ②每个行都必须具有一个主键值(主键列不允许NULL值);
       ③主键列中的值不允许修改或更新;
       ④主键值不能重用(如果某行从表中删除,它主键不能赋给以后的新行)。
    7. SQL(Structured Query Language,结构化查询语句)是一门专门用来与数据库通信的语言。


    第2章 检索数据
    1. SELECCT语句用途是从一个或多个表中检索信息。
    2. 关键字(Keyword)作为SQL组成部分的保留字,不能用作表或列的名字。
    3. 检索列:SELECT列名   FROM 表名;
    4. SQL关键字不分大小写,建议关键字大写。结束语句用分号;


    第3章 排序检索数据
    1. 子句(clause)SQL语句由子句构成,通常由一个关键字加上所提供的数据组成。
    2. 可用ORDER BY子句明确地排序用SELECT语句检索出的数据。应保证ORDER BY子句是SELECT语句中最后一条子句。
    3. 按列名排序:ORDER BY列名,列名;(按多个列排序)
    4. 按列位置排序:ORDER BY 2,3;按SELECT中第2、3个列名排序。
    5. 进行降序排序,DESC关键字只应用到直接位于其前面的列名。ORDER BY prod_price DESC, prod_name;



    第4章 过滤数据
    1. 只检索所需数据需要制定搜索条件(search criteria),也称过滤条件(filter condition)。
    2. 数据根据WHERE子句中指定的搜索条件进行过滤,WHERE子句在表名(FROM子句)之后给出。
    3. WHERE子句操作符:
       <>(不等于)
       !=(不等于)
       =(等于)
       <(小于)
       <=(小于等于)
       !<(不小于)
       >(大于)
       >=(大于等于)
       !>(不大于)
       BETWEEN … AND …(指定值间)
       IS NULL(为NULL值)
    4. 限定条件中出现字符或字符串,需要单引号括起来,如:'HELLO'
    5. 范围检索例:WHERE prod_price BETWEEN 5 AND 10;
    6. NULL无值(no value),区别于0、空字符、空格。
    7. 检查NULL值列例:WHERE prod_price IS NULL;


    第5章 高级数据过滤
    1. 更强过滤控制,给出多个WHERE子句,这些子句以两种方式使用,即以AND子句方式或OR子句方式使用。
    2. 为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。WHERE vend_id = 'DLL01' AND prod_price <= 4;
    3. OR用于WHERE子句中,用来表示检索匹配任意给定条件的行。WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
    4. AND操作符的优先级高于OR,为避免条件匹配错误或歧义,都应该使用圆括号明确地分组操作符。
    5. IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值得有逗号分隔的清单,全都在圆括号中。功能与OR相当。WHERE vend_id IN('DLL01','BRS01')
       优点:
       ①使用长的合法选项清单时,IN操作符的语法更清楚、直观。
       ②在用IN时,计算次序更容易管理(操作符更少)。
       ③IN操作符一般比OR操作符清单执行更快。
       ④IN最大优点是可包含其他SELECT语句,使得更能动态地建立WHERE子句。
    6. NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。WHERE NOT vend_id = 'DLL01'



    第6章 用通配符进行过滤
    1. 通配符(wildcard)用来匹配值的一部分的特殊字符。
    2. 搜索模式(Search Pattern):由字面值、通配符或者两者组合构成的搜索条件。
    3. 为在搜索句子中使用通配符,必须使用LIKE操作符,以指示DBMS,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
    4. 通配符搜索只能用于文本字段(串),非文本数据类型字段不能使用通配符搜索。
    5. 百分号通配符(%)可匹配任何字符出现任意次数。(在MS Access中符号为*)  WHERE prod_name LIKE 'Fish%';
    6. 下划线通配符(_)只匹配一个字符。(MS Access中符号为?)
    7. 方括号通配符([])用来指定一个字符集,必须匹配指定位置(即通配符位置)的一个字符。仅少数DBMS支持:MS Access、MS SQL和Sybase Adaptive Server。此通配符可以用前缀字符^(脱字号)来否定。(MS Access用!)
    8. 使用通配符技巧:
       ①不要过分使用通配符。能不用尽量不用。
       ②除非必要。否则通配符勿用于搜索模式开始处。(会导致性能下降)
       ③注意正确放置通配符位置。


    第7章 创建计算字段
    1. 字段(field)基本上与列(column)的意思相同,常互换使用,不过数据库一般称为“列”,而术语“字段”通常用在计算字段的连接上。
    2. 拼接(concatenate)将值联结到一起构成单个值,可用加号(+)或两个竖杠(||)表示,这依赖于具体的DBMS。
    3. TRIM函数(大多数DBMS支持),RTRIM()去掉串右边空格、LTRIM()去掉串左边空格以及TRIM()去掉串左右两边的空格。
    4. 一个未命名的列不能用于客户机应用中,因为客户机没有办法引用它。须用列别名(alias)解决。
    5. 列别名(alias)是一个字段或值的替换名,使用AS关键字赋予:
    SELECT RTRIM(vend_name) || '(' || RTRIM(vend_country) || ')' AS vend_title
    6. 计算字段用途:字符串拼接、算术计算。
    7. 计算字段执行算术运算示例:
       SELECT prod_id,
       quantity,
       Item_price,
       quantity*item_price AS expanded_price
       FROM …
       WHERE...



    第8章 使用数据处理函数
    1. SQL支持利用函数来处理数据,不同的DBMS函数名与功能有所差异,难以移植。
    2. 大多数SQL实现支持一下类型的函数:
       ①用于处理文本串(如删除、填充值,转换值为大/小写)的文本函数。
       ②用于在数值数据上进行算术操作的数值函数。
       ③用于处理日期和时间值并从这些值中提取特定成分的日期和时间的函数。
       ④返回DBMS正使用的特殊信息(如返回用户登录信息)的系统函数。



    第9章 汇总数据
    1. 聚集函数(aggregate function)运行在行组上,计算和返回单个值的函数。(得到的是汇总信息而非实际数据本身)
       ①AVG()返回某列平均值
       ②COUNT()返回列行数
       ③MAX()返回某列最大值
       ④MIN()返回某列最小值
       ⑤SUM()返回某列值之和
    2. AVG()通过对对表中行数计数并计算特定列值之和,得到列平均值。
    3. COUNT()确定表中行数的数目或符合特定条件的行的数目。
       ①使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
       ②使用COUNT(column)对特定列中具有值的进行计数,忽略NULL。
    4. 利用标准的算术操作符,所有聚集函数都可用来执行多个列上计算。
    5. 聚集不同值
       ①对所有的行执行计算,指定ALL参数或不给参数。(ALL为默认)
       ②只包含不同的值,指定DISTINCT函数。
    6. SELECT语句可包含多个聚集函数。(组合聚合函数)


    第10章 分组数据
    1. 分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
    2. GROUP BY子句指示DBMS分组数据。一些该子句重要规定:
       ①~子句可以包含任意数目的列
       ②如果在G~子句中嵌套了分组,数据将在最后规定的分组上进行汇总。
       ③GROUP BY子句列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如在SELECT中用表达式,则需在GROUP BY子句指定相同表达式。不能使用别名。
       ④大多数SQL实现不允许G~B~列带有长度可变数据类型(文本或备注)。
       ⑤除聚集计算语句外,SELECT语句中每个列都必须在GROUP BY子句中给出。
       ⑥如分组列中具有NULL值,则NULL将作为一个分组返回。如列中有很多行NULL值,它们将分为一组。
       ⑦G~B~子句必须在WHERE子句之后,ORDER BY子句之前。
    3. HAVING用于过滤分组(可以取代WHERE过滤行),WHERE用于过滤行(不能在GROUP BY后过滤分组)。
    4. WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。不指定GROUP BY,多数DBMD将两者同等对待。良好习惯:应仅在与GROUP BY子句结合时才用HAVING,而WHERE子句用于标准的行级过滤。
    5. 使用ORDER BY对GROUP BY分组数据排序。
    6. SELECT子句顺序:(括号内布尔值表示是否必须使用)
       SELECT(是)→FROM(仅在从表选择数据时)→WHERE(否)→GROUP BY(仅在按组计算聚集时)→HAVING(否)→ORDER BY(否)


    第11章 使用子查询
    1. SQL允许创建子查询(Subquery),即:嵌套在其他查询中的查询。
    2. 作为子查询的SELECT语句只能查询单个列。
    3. 使用子查询的另一个方法是创建计算字段。



    第12章 联结表
    1. 关系表的设计是要保证把信息分解成多个表,一类数据一个表。各个表通过某些常用的值(即关系设计中的关系(relational))相互关联。
    2. 可伸缩性(Scale)能适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好(scale well)。
    3. 联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
    4. 联结的创建:规定要联结的所有表以及它们如何关联即可。
       如:SELECT vend_name, prod_name, prod_price
       FROM Vendors, Products   (要联结的表)
       WHERE Vendors.vend_id = Product.vend_id;(联结方式)
    5. 完全限定名(用一个句点分隔的表明和列名),在引用的列可能出现二义性时,必须使用完全限定名。
    6. DBMS不能自行联结,需使用WHERE子句作过滤条件匹配联结。
    7. 笛卡儿积(cartesian product)由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
    8. 等值联结(equijoin)即内部联结,基于两个表之间的相等测试。
    9. 创建联结的另一种语法:INNER JOIN … ON
       SELECT vend_name, pro_name, prod_price
       FROM Vendors INNER JOIN Products
       ON Vendors.vend_id = Products.vend_id;
       (ANSI SQL规范首选INNER JOIN语法)
    10. SQL对一条SELECT语句中可以联结的表的数目没有限制。创建联结的基本规则也相同。首先列出所有表,然后定义表间关系。


    第13章 创建高级联结
    1. 使用表别名:除了用于列名和计算字段外,SQL还允许给表名起别名。
       原因:①缩短SQL语句
       ②允许在单条SELECT语句中多次使用相同的表。
       例:SELECT cust_name, cust_contact
       FROME Customer AS C, Orders AS O, OrderItems AS OI
       WHERE C.cust_id = O.order_num AND …
    2. 表别名可用于SELECT列表,WHERE、ORDER BY子句及语句的其他部分。
    3. 表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户机。
    4. 自联结:使用表别名多次引用同一个表。通常作为外部语句用来替代相同表中检索数据的使用子查询语句。
    5. 自然联结:排除多次出现,使每个列值返回一次。(重复列不返回)
    6. 外部联结:联结包含了那些在相关表中没有关联行的行。
       例1:
       SELECT Customers.cust_id, Orders.Order_num
       FROM Customer LEFT OUTER JOIN Orders
       ON Customers.cust_id = Order.cust_id;
       (LEFT或RIGHT关键字指定包括其所有行的表。(OUTER JOIN)
       例2:
       SELECT Customers.cust_id, Orders.order_num
       FROM Customers, Orders
       WHERE Customers.cust_id *= Orders.cust_id
       (在Oracle中用“(+)”代替例子中的*
    7. 全部外部联结关键字: FULL、OUTER、JOIN
    8. 可在联结中使用聚集函数。
    9. 关于联结使用的要点
       ①注意所使用的联结类型
       ②各DBMS支持语法尽不相同,应查看具体文档
       ③保证使用正确的联结条件。
       ④应该总是提供联结条件,否则会得到笛卡儿积。
       ⑤分别测试每个联结。



    第14章 组合查询
    1. 复合查询(compound query)或并(union):执行多个查询(SELECT语句)并将结果作为单个查询结果集返回。
       使用情况:
       ①在单个查询中从不同的表类似返回结构数据。
       ②对单个表执行多个查询,按单个查询返回数据。
    2. 复合查询操作符UNION,放置于两条SELECT语句之间即可。
    3. UNION使用规则:
       ①UNION必须由两条或两条以上的SELECT语句组成,语句间用UNION分隔。
       ②UNION中的每个查询必须包含相同的列、表达式或聚集函数。
       ③列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型。
    4. UNION从查询结果集中自动去除了重复的行。
       使用UNION ALL代替UNION,则返回所有匹配行。
    5. 对组合查询结果排序,用ORDER BY放在最后一条SELECT语句之后,只能用一个ORDER BY。
    6. 其他类型的UNION:
       ①EXCEPT:检索第一个表中存在,第二个表不存在的行。
       ②INTERSECT:检索两个表中都存在的行。


    第15章 插入数据
    1. INSERT语句,用来插入(或添加)行到数据库表的。
       方式:
       ①插入完整的行
       ②插入行的一部分
       ③插入某些查询的结果(使用INSERT需DBMS中特定安全权限)
    2. 插入完整的行:
       ◇不安全方式:
       INSERT INTO Customers
       VALUES( '10000006'
       'ToyLand'
       '123 Any Street',
       'New York',
       NULL,
       NuLL);
       ◇安全方式:
       INSERT INTO Customers (
       Cust_id,
       Cust_name,
       Cust_address)
       VALUES(
       '10000006',
       'Toy Land',
       '123 Any Street');
    3. 插入部分行,在INSERT中给出要加入列的名字,并提供值(如上安全方式)。
       省略的列必须满足一下某个条件:
       ①该列定义为允许NULL值(无值或空值)。
       ②在表定义中给出默认值。这表示如果不给出值,将使用默认值。
    4. 插入检索出的数据,使用INSERT...SELECT...语法。
       INSERT INTO Customers (
       Cust_id,
       Cust_contact)
       SELECT Cust_id,
       Cust_contact
       FROM CustNew;
    5. 将一个表的内容复制到一个全新的表(在运行中创建的表),可以使用SELECT INTO语句。
    6. INSERT SELECT与SELECT INTO重要区别:前者导出数据,而后者导入表。
    7. SELECT INTO用法:
       ◇例子1
       SELECT *
       INTO CustCopy
       FORM Customers;
       ◇例子2
       CREATE TABLE CustCopy AS
       SELECT *
       FROM Customers;(MySQL与Oracle用法)
    8. SELECT INTO使用须知:
       ①任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY。
       ②可以用联结从多个表插入数据。
       ③不管从多少个表中检索数据,数据都只能插入单个表中。


    第16章 更新和删除数据
    1. 为了更新(修改)表中的数据,可以使用UPDATE语句。
       两种方式:
       ①更新表中特定行
       ②更新表中所有行
    2. UPDATE语句使用:
       ①要更新的表
       ②列名和他们的新值
       ③确定更新行过滤条件
       UPDATE Customers
       SET cust_email = 'kim@thetoystore.com',
       cust_contact = 'Sam Roberts'  (也可以用于删除某个列值,设为NULL)
       WHERE cust_id = '1000006';
    3. 为了从一个表中删除(去掉)数据,使用DELETE语句。
       两种方式:
       ①从表中删除特定的行
       ②从表中删除所有行
    4. DELETE使用:(删除行而非表本身)
       DELETE FROM Customers
       WHERE cust_id = '1000006';
    5. 若要删除表中所有行,使用TRUNCATE TABLE更快(不记录Data变动)
    6. DELETE删除整行而不是删除列。要删除指定的列,请使用UPDATE语句。
    7. 更新和删除的指导原则:
       ①除非确定打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句
       ②保证每个表都有主键,尽可能像WHERE子句那样使用它(可以指定各主键、多个值或值的范围)。
       ③在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防止编写的WHERE子句不正确。
       ④使用强制实施引用完整性的数据库,这样DBMS将不允许删除具有与其他表相关联的数据的行。
       ⑤有的DBMS允许数据库管理员施加约束,以防止不带WHERE子句的UPDATE或DELETE。
    8. SQL没有撤销(undo)按钮,须小心使用UPDATE和DELETE。


    第17章 创建和操作表
    1. 两种创建表的方法:
       ①多数DBMS都具有交互式创建和管理表的工具
       ②表也可以直接用SQL语句来操纵。
    2. 利用CREATE TALBE创建表,必须给出下列信息:
       ①新表的名字,在关键字CREATE TABLE之后给出;
       ②表列的名字和定义,用逗号分隔;
       ③有的DBMS还要求指定表的位置。
       CREATE TABLE Products
       (
       prod_id CHAR(10) Not NULL,
       prod_desc VARCHAR(1000) NULL,
       quantity INTEGER NOT NULL DEFAULT 1
       );
    3. 每个表的列或者是NULL列,或者是NOT NULL列,这种状态在创建时由表的定义规定。
    4. NOT NULL会阻止插入没有值的列。如果试图插入没有值的列,将返回错误,且插入失败。
    5. 主键是其唯一标识表中每一行的列,其列必为NOT NULL列。
    6. SQL允许指定默认值,在插入行时如果不给出值,DBMS将自动采用默认值。默认值在CREATE TABLE语句的列定义中用关键字DEFAULT指定。
    7. 为更新表定义,可使用ALTER TABLE语句。各DBMS允许更新内容差别大,应考虑下面几点:
       ①一般来说在表中包含数据时不要对其进行更新。应在设计表是做充分考虑。
       ②所有DBMS都允许给现有的表增加列,不过对所增加列的数据类型(以及NULL和DEFAULT的使用)有所限制。
       ③许多DBMS不允许删除或更改表中的列。
       ④许多DBMS对已经填有数据的列的更改有限制,对未填有数据的列几乎没有限制。
       ⑤多数DBMS允许重命名表中的列。
    8. 为使用ALTER TABLE更改表结构,必须给出下面的信息:
       ①在ALTER TABLE之后给出要更改的表名
       ②所做更改的列表
       ◇例子1
       ALTER TABLE Vendors
       ADD vend_phone CHAR(20);
       ◇例子2
       ALTER TABLE Vendors
       DROP COLUMN vend_phone;
    9. 复杂的表结构一般需要手动删除过程,涉及步骤:
       ①用新的列布局创建一个新表
       ②使用INSERT SELECT语句从旧表复制数据到新表。如果有必要可使用转换函数和计算字段。
       ③检验包含所需数据的新表;
       ④重命名旧表(如果确定,可以删除它);
       ⑤用旧表原来的名字重命名新表;
       ⑥根据需要,重新创建触发器、存储过程、索引和外键。
    10. 删除表(删除整个表而不是其内容):使用DROP TABLE语句:
       DROP TABLE CustCopy;
    11. 重命名表,DB2、MySQL、Oracle和PostgreSQL用Rename语句;SQL Server、Sybase用sp_rename语句。


    第18章 使用视图
    1. 视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
    2. 使用视图的原因:
       ①重用SQL语句
       ②简化复杂的SQL操作。在编写查询后,可方便地重用它而不必知道它的基本查询细节。
       ③使用表的组成部分而不是整个表。
       ④保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
       ⑤更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
    3. 视图仅仅是用来查看存储在别处的一种设施,其本身不包含数据,因此他们返回的数据是从其他表中检索出来的。
    4. 视图的规则和限制:
       ①与表一样,视图必须唯一命名。
       ②对于可以创建的视图数目没有限制。
       ③为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理员授予。
       ④视图可以嵌套,即:可以利用从其他视图中检索数据的查询来构造一个视图。
       ⑤许多DBMS禁止视图查询中使用ORDER BY子句。
       ⑥有的DMBS要求命名返回的所有列,如果是计算字段,则需用别名。
       ⑦视图不能索引,也不能有关联的触发器或默认值。
       ⑧有的DBMS把视图作为只读的查询。
       ⑨有的DBMS允许创建这样的视图,它不允许进行导致行不在属于视图的插入和更新。
    5. 视图用CREATE VIEW语句创建,用DROP删除、覆盖或更新。
    6. 视图最常见应用之一是隐藏复杂的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;
    7. 视图的另一常见用途是重新格式化检索出的数据。
       CREATE VIEW VendLocation AS
       SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')' AS vend_title
       FROM Vendors;
    8. 用视图过滤不想要的数据,用WHERE子句于视图创建中。
    9. 视图对于简化计算字段的使用特别有用。
       CREATE VIEW OrderItemsExpanded AS
       SELECT order_num, prod_id, quantity, item_price, quantity * item_price AS expanded_price
       FROM OrderItems;


    第19章 使用存储过程
    1. 存储过程:为以后的使用而保存的一条或多条SQL语句的集合。
    2. 使用存储过程的原因:
       ①通过把处理封装在容易使用的单元中,简化复杂的操作。
       ②由于不要求反复建立一系列处理步骤,而防止错误保证了数据一致性。
       ③简化对变动的管理,安全性。
       ④存储过程通常以编译过的形式存储,提高了性能。
       △综上所述,优点:简单、安全、高性能
       △缺点如下:
       ①不同DBMS中存储过程语法有所不同。
       ②存储过程的编写比基本SQL语句复杂,需要更高的技能、经验。
    3. 用EXECUTE执行存储过程,它接受存储过程名和需要传递给它的任何参数。
    4. 对于不同DBMS,可能有以下存储过程的执行选择:
       ①参数可选,具有不提供参数时的默认值。
       ②不按次序给出参数,以“参数二值”的方式给出参数。
       ③输出参数,允许在存储过程在正执行的应用程序中更新所用的参数。
       ④用SELECT语句检索数据。
       ⑤返回代码,允许存储过程返回一个值到正在执行的应用程序。
    5. SQL中进行注释的标准方式是在句首放置-- (连个连字符)。


    第20章 管理实务处理
    1. 事务管理(transaction processing)可以用来维护数据库的完整性,它保证成批的SQL操作要么完全执行,要么完全不执行。
       术语:事务(transaction)指一组SQL语句;
       回退(rollback)指撤销指定SQL语句的过程;
       提交(commit)指将未存储的SQL语句结果写入数据库表;
       保留点(save point)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(注意与回退整个事务处理不同)。
    2. 事务处理可回退INSERT、UPDATE和DELETE,不能回退SELECT、CREATE和DROP操作。
    3. 各DBMS有不同方法标识事务处理块。
       ◇SQL Server:
       BEGIN TRANSACTION
       …
       COMMIT TRANSACTION
       ◇MySQL
       START TAANSACTION
       …
       ◇PostgreSQL
       BEGIN;
       …
    4. SQL的ROLLBACK命令用来回退(撤销)SQL语句:
       DELETE FROM Orders; ROLLBACK;
    5. 一般的SQL语句都是直接针对数据库表执行和编写的。这就是所谓的隐含提交(implicit commit),即提交(写或保存)操作是自动进行的。
    6. 在事务处理块中,提交不会隐含地进行。但不同DBMS做法不一。
       SQL Server:
       BEGIN TRANSATION
       DELETE OrderItems WHERE order_num = 12345
       DELETE Orders WHERE order_num = 12345
       COMMIT TRANSACTION
    7. 使用保留点,支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符。如需回退,可退至某占位符。
       SAVEPOINT deletel;
       (在SQL Server和Sybase中)
       SAVE TRANSACTION deletel;
       ...
       ROLLBACK TRANSACTION deletel;
    8. 保留点越多越好,这样就能按自己的意愿灵活地进行回退。


    第21章 使用游标
    1. 结果集(result set)SQL查询所检索出的结果。
    2. 游标(cursor)是一个存储在DBMS服务器上的数据查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。
    3. 不同DBMS支持不同游标选项和特性。常见选项和特性:
       ①能够标记游标为只读,使数据能读取,但不能更新和删除。
       ②能控制可以执行的定向操作(向前、向后、第一、最后、绝对位置、相对位置等)。
       ③能标记某些列为可编辑的,某些列为不可编辑的。
       ④规定范围,使游标对创建它的特定请求(如存储过程)或对所有请求可访问。
       ⑤指示DBMS对检索出的数据(而不是指表中活动数据)做复制,使在游标打开和访问期间数据不变化。
    4. 使用游标涉及步骤
       ①在能够使用游标前,必须声明(定义)它。
       ②一旦声明后,必须打开游标以供使用。用前面定义的SELECT语句,把实际数据检索出来。
       ③对于填有数据的游标,根据需要取出(检索)各行。
       ④在结束游标使用时,必须关闭游标,可能的话,释放游标。
    5. 游标用DECLARE语句创建,这条语句在不同DBMS中有所不同。
       ◇DB2、SQL Server、Sybase中
       DECLARE CustCursor CURSOR
       FOR
       SELECT * FROM Customers
       WHERE cust_email IS NULL
       ◇Oracle、Postgre SQL中
       DECLARE CURSOR CustCursor
       IS
       SELECT * FROM Customers
       WHERE cust_email IS NULL
    6. 用OPEN CURSOR语句打开游标执行查询,存储检查出的数据以供浏览和滚动。
    7. 用FETCH语句访问游标数据。指出要检索的行,从何处检索它们以及将它们放于何处(如变量名)。
    8. 游标在使用完毕时需要关闭,部分DBMS要求明确释放游标所占资源(CLOSE语句)。


    第22章 了解高级SQL特性
    1. 约束(constraint)管理如何插入或处理数据库数据的规则。
    2. 主键是一种特殊的约束,表中的一个(组)列的值唯一标识表中的行。
       ①任意两行的主键值都不相同
       ②每行都具有一个主键值(即列中不允许NULL值)
       ③包含主键值的列不修改或更新
       ④主键值不能重用。如果从表中删除某一行,其主键不分配给新行。
       创建主键:
       CREATE TABLE Vendors
       (
       vend_id CHAR(10) NOT NULL PRIMARY KEY,
       vend_name CHAR(50) NOT NULL
       );
       ------------------
       ALERT TABLE Vendors
       ADD CONSTRAINT PRIMARY KEY(vend_id);
    3. 外键是表中的一个列,其值必须在另一表的主键中列出。用于关联其他表,保证引用完整性。
       例子:
       CREATE TABLE Orders
       (
       Order_num INTEGER NOT NULL PRIMARY KEY,
       Order_date DATETIME NOT NULL,
       Cust_id CHAR(10) NOT NULL REFERENCES Customers(cust_id)
       );
       或
       ALTER TABLE Customers
       ADD CONSTRAINT
       FOREIGN KEY(cust_id) REFERENCES Customers(cust_id)
    4. 唯一约束用来保证一个列(或一组列)中的数据唯一。区别于主键:
       ①表可包含多个唯一约束,但每个表只允许一个主键。
       ②唯一约束列可包含NULL值。
       ③唯一约束列可修改或更新。
       ④唯一约束列的值可重复使用。
       ⑤与主键不同,唯一约束不能用来定义外键。
    5. 唯一约束可以用UNIQUE关键字在表定义中定义,也可用单独的CONSTRAINT定义。
    6. 检查约束用来保证一个列(或一组列)中的数据满足一组指定的条件。
       ①检查最小或最大
       ②指定范围
       ③只允许特定的值
       △数据类型限制了列中可保存的数据类型。检查约束在数据类型内又进一步的限制。
       例1:
       CREATE TABLE OrderItems
       (
       Order_num INTEGER NOT NULL,
       Quantity INTEGER NOT NULL CHECK(quantity > 0)
       );
       例2:
       ADD CONSTRAINT CHECK(gender LIKE '[MF]')
    7. 索引用来排序数据以加快搜索和排序操作的速度。
       ①索引改善检索操作的性能,但降低数据插入、修改和删除的性能。
       ②索引数据可能要占用大量的存储空间。
       ③并非所有数据都适合于索引(如唯一性不好的数据)。
       ④索引用于数据过滤和数据排序。
       ⑤可以在索引中定义多个列。
       △索引用CREATE INDEX语句创建(不同DBMS语法差异大)
       CREATE INDEX pro_name_ind
       ON PRODUCTS(prod_name);
    8. 触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。可与特定表上的INSERT、UPDATE和DELETE操作相关联。
       ◇触发器内代码具有以下数据访问权:
       ①INSERT操作中的所有新数据;
       ②UPDATE操作中的所有新数据和旧数据;
       ③DELETE操作中删除的数据。
       ◇触发器一些常见用途:
       ①保持数据一致。
       ②基于某个表的变动在其他表上执行活动。
       ③进行额外的验证并根据需要回退数据。
       ④计算计算列的值或更新时间戳。
       例子(SQL Sever版):
       CREATE TRIGGER customer_state
       ON Customers
       FOR INSERT,UPDATE
       AS
       UPDATE Customers
       SET cust_state = Upper(cust_state)
       WHERE Customers.cust = inserted.cust_id;
       ◇约束比触发器快,应该尽量使用约束。
    9. 数据库安全性通过SQL的GRANT和REVOKE语句管理。
       需要保护的某些操作:
       ①对数据库管理功能(创建表、更改或删除已存在的表等)的访问;
       ②对特定数据库或表的访问;
       ③访问的类型(只读、对特定列的访问等);
       ④仅通过视图或存储过程对表进行访问;
       ⑤创建多层次的安全措施,从而允许多种基于登录的访问和控制。
       ⑥限制管理用户账户的能力。
  • 相关阅读:
    遮罩
    css3 transform
    jq图片懒加载
    transition
    css3动画
    div水平垂直居中的方法
    一行文字的时候,文字在整个盒子中垂直水平居中,超过一行之后,文字在盒子中垂直水平居中,文字左对齐
    10个你可能没用过的Linux命令
    sed命令详解
    linux中的快捷键汇总
  • 原文地址:https://www.cnblogs.com/chemandy/p/2123786.html
Copyright © 2011-2022 走看看