分享

《SQL必知必会》读书笔记

 悟静 2012-01-27
目次
第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)表中的一个字段。所有表都由一个或多个列构成。在语句中可以使用列编号代替列名(1列开始)
5. 行(row)表中的一个记录。i=0,1,2,4,。。。
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子句。in (select.........)
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. 应用通配符技能:
   ①不要过分应用通配符。能不消尽量不消。
   ②除非须要。不然通配符勿用于搜刮模式开端处。(会导致机能降落)  尽量不用:like "%........."
   ③重视正确放置通配符地位。


第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. 为了从一个表中删除(drop)数据,应用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用s p_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. 用exacute履行存储过程,它接管存储过程名和须要传递给它的任何参数。
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 l;
   (在SQL Server和Sybase中)
   SAVE TRANSACTION l;
   ...
   ROLLBACK TRANSACTION l;
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 CTRAINT 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 CTRAINT
   FOREIGN KEY(cust_id) REFERENCES Customers(cust_id)
4. 独一束缚用来包管一个列(或一组列)中的数据独一。差别于主键:
   ①表可包含多个独一束缚,但每个表只容许一个主键。
   ②独一束缚列可包含NULL值。
   ③独一束缚列可批改或更新。
   ④独一束缚列的值可反复应用。
   ⑤与主键不合,独一束缚不克不及用来定义外键。
5. 独一束缚可以用UNIQUE关键字在表定义中定义,也可用零丁的CTRAINT定义。
6. 搜检束缚用来包管一个列(或一组列)中的数据满足一组指定的前提。
   ①搜检最小或最大
   ②指定局限
   ③只容许特定的值
   △数据类型限制了列中可保存的数据类型。搜检束缚在数据类型内又进一步的限制。
   例1:
   CREATE TABLE OrderItems
   (
   Order_num INTEGER NOT NULL,
   Quantity INTEGER NOT NULL CHECK(quantity > 0)
   );
   例2:
   ADD CTRAINT 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 = ed.cust_id;
   ◇束缚比触发器快,应当尽量应用束缚。
9. 数据库安然性经由过程SQL的GRANT和REVOKE语句经管。
   须要保护的某些操纵:
   ①对数据库经管功能(创建表、更改或删除已存在的表等)的接见;
   ②对特定命据库或表的接见;
   ③接见的类型(只读、对特定列的接见等);
   ④仅经由过程视图或存储过程对表进行接见;
   ⑤创建多层次的安然办法,从而允很多种基于登录的接见和把握。
   ⑥限制经管用户账户的才能。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多