SQL必知必会读书笔记

《SQL必知必会》

1、SQL概述(概念、优点、数据库术语)
* 日常生活中的数据库案例举例(例如在网站搜索东西;登录账号密码;取钱;)
*
数据库概念:数据库database(以一种有组织的方式存储的数据集合或容器。例如一个文件柜); 数据库管理系统(DBMS)也叫数据库软件,和数据库的概念不是相同的。表:一种结构化的文件,用来存储特定类型的数据。模式(schema):关于数据库和表的布局以及特性的信息。列:表中的一个字段,表由一个或者多个列组成。数据类型:所允许的数据的类型。作用:可限定列中的数据类型,同时帮助正确分类数据,优化磁盘的使用。行:表中的一个记录。主键(primary key):一列,其值能够唯一标识表中的每一行。作用:没有主键更新或删除表困难,不能保证只涉及相关的行。便于数据库的操作和管理。
*
作为主键的条件:1、任意两行都不具有相同的主键值;2、每一行都必须具有一个主键值(主键值列不允许null值);3、主键列中的值不允许修改或更新;4、主键值不能重用(若某行的从表中删除,其主键不能赋予给新的行。);可以是一列,也可以是联合主键,同时联合主键时,上述条件必须应用到其中,所有列值的组合必须是唯一的(但单个的值可以不唯一)。
*
SQL 英语为structured query language ,译为结构化查询语言,专门用于与数据库沟通的语言。SQL优点:1、使用广泛:可以应用到以下数据库管理系统(DBMS):Apache Open Office Base ;IBM DB2 ;Microsoft SQL ;Microsoft Access; Maria DB;MYSQL;Oracle;Postgresql;SQLite;2、简单易学;3、强有力的语言,可进行复杂高级的数据库操作。标准SQL由ANSI标准委员会管理;称为ANSI SQL;

2、检索数据
*
关键字:SQL是由关键字组成的语言,用于执行SQL操作的特殊词汇。在命名数据库、表、列和其他数据库对象时,一定不要使用这些关键字,必须保留。——附录E内容《SQL必知必会》。注意以下几点: 关键字随不同的DBMS而变化,并非下面的所有关键字都被所有DBMS采用。 许多DBMS扩展了SQL保留字,使其包含专门用于实现的术语。多数DBMS专用的关键字未列在下面。 为保证以后的兼容性和可移植性,应避免使用这些保留字,即使它们不是你使用的DBMS的保留字。

SELECT 语句
* 检索单个列;select prod_name from products;输出结果为没有排序的数据;

* SQL语句不区分大小写,以;结束最好。

* 检索多个列:`select prod_name,prod_price,prod_id from products;`列名用逗号分隔。

* 检索所有的列:select *from products;给定通配符*返回表中所有的列;虽然省事,但使用*会降低检索和应用程序的性能。

* 检索一列或多列中不同的值;`select distinct  vend_id from products。`使用distinct 关键字,指示数据库只返回不同的值。注意:不能部分使用distinct.同时作用于所有的列,不仅仅是跟在其后的那一列。

* 限制结果的select :只想返回第一行或者一定数量的行;使用limit;`select prod_name from products limit 5`;返回不超过5行的数据。

* limit 5 offset 5 第一个数字是检索的行数,第二个数字是指从哪儿开始检索;   select prod_name from products limit 5 offset 5;返回从第5行起的5行数据;limit制定的行数,而offset 指定从哪儿开始。注意:检索的第一行是第0行,而不是第一行。简化版select prod_name  from  products limit 3,4——逗号之前的值对应offset,逗号之后的值对应limit。(其他库中可以使用top来限制返回)

* 使用注释#。注释的作用:文件开始处的一些描述性说明;可以暂时停止执行SQL代码;类型:“_ _” 或者从/*开始,到*/结束,两个/之间的内容就是注释;或者使用#放在前面。

3、排序检索数据(order by、asc、desc)
*
使用order by 对一个或多个列进行排序;select prod_id from products; select prod_id, prod_price,prod_name from products order by prod_id ,prod_name; order by 字句的位置应该保证它是select 语句中最后一条字句,否则将会出现错误信息。同时还可以用列名制定排序顺序:select prod_id ,prod_name, prod_price from products order by 2,3;指定的是列的相对位置而不是列名——好处:不用重新输出列名;坏处:不明确指定列名会造成错用列名排序,同时在对select清单进行更改时容易错误地对数据进行排序,最后排序的列不在select清单中则无法使用这项技术。
*
指定排序方向:使用desc或者asc ; select prod_id ,prod_name, prod_price from products order by prod_price desc;
*
对多个列指定排序,必须对每一列指定desc关键字。desc 是descending的缩写;默认是asc升序;

4、过滤数据(where过滤检验相等、不相等、大于小于以及 null值的范围)
*
只检索所需要数据需要指定搜索条件,也叫过滤条件。SQL通过where字句中指定的搜索条件进行过滤。where字句放在from字句之后:select prod_name,prod_price from products where prod_price=3.49;
*
注意:当出现order by 和where字句时,应该让orderby 位于前面,否则错误。
*
where字句操作符(见下图)包括检查单个值、不匹配检查(!= 、<>" " )、范围值检查(between and )、空值检查(NULL)、

* 

如果将值与字符串进行比较,就需要限定引号。用来与数值进行比较的就不用限定引号。
*
null:无值(no value)与字段为0、空字符串、或者仅仅包含空格不同。where字句:select prod_name from products where prod_price is null;用来判断具有null值的列;

5、高级数据过滤(or/and/not/in)
*
组合where子句,使用and或者or方式使用;
*
要通过不止一个列进行过滤,可以使用and操作符给where子句添加附加条件。select prod_id, prod_price,prod_name from products where vend_id="DLL01" and prod_price <=4;
*
or操作符指示DBMS检索匹配任一条件的行。select prod_name,prod_price from products where vend_id =“DLL01” or vend_id=“BRS01”;
*
or 和and 在组合使用时会优先求and的值,解决方法是使用圆括号对操作符进行明确分组。select prod_name,prod_price from products where (vend_id="DLL01" or vend_id ="BRS01") AND prod_price>=10;使用圆括号可以消除歧义。
*
in操作符用于指定范围,范围中的每一个条件都可以进行匹配。select prod_name, prod_price from products where vend_id in ("DLL01","BRS01")order by prod_name; In操作符后跟由逗号分隔的合法值,这些值必须在圆括号中。in操作符完成了与or相同的功能。
*
为什么使用in操作符?优点如下:1、在有很多合法选项时,in操作符的语法更清楚、直观;2、在与其他and和or操作符组合使用时,求值顺序更容易管理;3、in操作符一般比or操作符执行的更快;4、最大的优点就是它包含其他select语句,能够更动态地建立where子句。
*
not 操作符用于否定其后所跟的任何条件,不单独使用,与其他操作符一起使用。select prod_name from products where not vend_id="DLL01" order by prod_name; NOT否定跟在其后的条件。也可以使用<>来表示。

6、用通配符进行过滤(在where子句中使用通配符)
*
通配符:用来匹配值的一部分的特殊字符。
*
搜索模式:由字面值、通配符或组合构成的搜索条件。SQL支持几种通配符,为在搜索子句中使用通配符,必须使用like操作符。
*
当操作符作谓词时不是操作符;通配符搜索只能用于文本字段,非文本数据类型字段不能使用通配符搜索。
*
百分号%通配符:表示任何字符出现任意次数,例如,找出所有以“fish”起头的产品id 和名字:select prod_id,prod_name from products where prod_name like"Fish%";“Fish%”即搜索模式;
*
下划线_ 通配符,注意后面的空格;_和%的用途一样,但是_只匹配单个字符,而不是多个字符。而%能匹配多个字符。
*
方括号[]通配符,用来指定一个字符集,但只能指定字符集中法单个字符
*
通配符使用技巧:不要过度使用;尽量不要放在开始处;注意通配符的位置。

7、创建计算字段
*
字段拼接(concat函数);rtrim()函数用于去掉值右边空格;别名用as关键字赋予;
*
SQL算术操作符(下图);

* 

select语句为测试、检验、计算函数提供很好的方法:例如select now 会返回当前日期和时间。

8、函数
*
SQL支持以下类型的函数:1、文本字符串处理函数;2、数值计算函数;3、日期处理函数;
*
常用的文本处理函数(如下图源于《SQL必知必会》)
*
select cust_name,cust_contact from customers where soundex(cust_contact)=soundex("michaelgreen");——soundex函数用于搜索匹配所有发音类似于字符串。

* 

常用数值处理函数如下:

9、汇总数据
*
5个聚集函数(aggregate function)对某些行运行的函数,计算并返回一个值。

* 

select avg(prod_price) as avg_price from products; avg用于对表中行数计数并计算其列值的和,求得该列的平均值。AVG忽略值为null的行;为了获得多个列的平均值,必须使用多个avg函数。
*
count()用于计数:对表中行的数目进行计数,不管是空值(null)还是非空值;使用count(column)对特定列中具有的值的行进行计数,忽略null值。count函数指定列名就会忽略指定列值为空的行,如果是count(*)则不忽略。
*
max()用于返回指定列中最大的值,要求指定列名。忽略列值为null的行。max要求指定列名。在用于文本数据的时候,max返回该列排序后的最后一行。
*
min()函数同上相反,忽略列值为null的行;
*
sum()用于返回指定列值的和(总计);忽略列值为null的行
*
这些函数在同一列上进行计算称为聚合,同一行不同列的值之间的计算为细节表达式。对所有行执行计算,指定all参数或不指定参数,因为all是默认行为。只包含不同的值,指定distinct参数。如果不指定distinct参数,则假定为all。
*
如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*)。类似地,DISTINCT()必须使用列名,不能用于计算或表达式。
*
组合聚集函数:包含多个聚集函数。

10、分组函数(将数据分为多个逻辑组,对每一个组进行聚集计算)
*
groupby 函数用于分组 mysql> select vend_id,count(*) as num_prods from products group by vend_id;
*
使用groupby 的一些重要规定:1、可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组;2、在group by子句中嵌套了分组,数据将在最后指定的分组上进行汇总。3、groupby 子句中列出的每一列都必须是检索列或有效的表达式(但不是聚集函数)4、大多数SQL实现不允许groupby 列带有长度可变的数据类型(如文本或备注型字段);5、除聚集计算语句外,select语句中的每一列都必须在groupby 子句中 给出。 6、分组列中有null指的行,则null将作为一个分组返回,如果有多行null ,则他们将分为一组。7、groupby 子句必须出现在where子句之后,orderby 子句之前。
*
过滤分组:having:用于过滤分组,而where 用来过滤行。并且having 支持所有where 操作符。
*
having 和where 的区别;where 在数据分组前过滤,having在数据分组后进行过滤。where排除的行不包括在分组中。使用having 时应该结合group by子句,而where子句用于标准的行级过滤。
*
同时使用的例子——select vend_id,count(*) as num_prods from products where prod_price >=4 group by vend_id having count(*)>=2;表示查询具有两个以上产品且价格大于等于4 的供应商。where子句用于过滤所有prod-price至少为4的行,然后按照vend-ID进行分组,having子句过滤计数为2或2以上的分组。
*
分组和排序的差别:order by 与group by 的差别。(功能、使用范围、必要性)

* 

查询包含3个以上物品的订单号和订购物品的数目,并进行排序——select order_num,count(*) as items from orderitems group by order_num having count(*) >=3 order by items,order_num;
*
select子句顺序:

11、子查询(subquery:嵌套在其他查询中的查询;用于过滤和计算列)使用子查询进行过滤
*
订单编号、客户ID、订单日期——order表 ;customer表存储顾客信息;各订单物品存储在相关的orderitems表中
*
题目:出订购物品RGAN01的所有顾客——Select cust_id,cust_name from customers where cust_id in (select cust_id from orders where order_num in (select order_num from orderitems where prod_id ="RGAN01"));
*
子查询总是由内向外处理;作为子查询的select语句只能查询单个列;

使用子查询计算字段
*
完全限定列名:用一个句点分隔表名和列名,在有可能混淆列名时必须使用这种语法。如下:select cust_name,cust_state,(select count(*)from orders where orders.cust_id=customers.cust_id)as order_num from customers order by cust_name;
*
子查询常用于where子句的in操作符中,以及用来填充计算列。

12、联结表(join表)逻辑:关系表-联结-创建联结(where、内联结两种)-多个表联结 (和子查询差不多,不过性能不同 )
*
关系数据库设计的基础:相同的数据不能多次出现。应该是把信息进行分解成多个表,一类数据一个表,各表通过某些共同的值互相关联,这才叫关系型数据库。关系型数据库可以有效地存储,方便地处理。其可伸缩性比非关系型数据库要好。
*
可伸缩性:能够适应不断增加的工作量而不失败,设计良好的数据库或应用程序称为可伸缩性好(scale well).
*
供应商表vendors; 产品表products;vendor表的主键将vendors和products 表相互关联,利用主键能从供应商表中找出相应供应商的详细信息;
*
当数据存储在多个表的时候,怎样用一条select语句检索出数据?——使用联结,联结是一种机制,用来在一条select语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
*
引用完整性表示dbms强制实施数据完整性规则,一般由提供了界面的DBMS管理。
*
创建联结:非常简单,指定要联结的所有表以及关联他们的方式——select vend_name,prod_name,prod_price from vendors,products where vendors.vend_id=products.vend_id;并且完全限定了列名。
*
where子句建立联结,作为过滤条件,只包含那些匹配给定的条件。联结即将第一个表中的每一行与第二个表中的每一行配对。
*
笛卡尔积(Cartesian product)由没有联结条件的表关系返回的结果为笛卡尔积,检索出的行的数目将是第一个表的行数乘以第二个表中的行数。要保证所有联结都有where子句,否则DBMS将返回比想要的数据多得多的数据。同时要保证where子句的正确性。
*
叉联结;返回笛卡尔积的联结,也称为叉联结。(cross join);
*
内联结:也叫等值联结,是基于两个表之间的相等测试。select vend_name,prod_price,prod_name from vendors inner join products on vendors.vend_id=products.vend_id;和上面语句返回的同样的结果,在使用这种语法时,联结条件用特定的on子句而不是where子句给出,传递给on的实际条件与传递给where的相同。

13、创建高级联结(其他联结、使用表别名、对联结的表使用聚集函数的使用方式)
*
SQL除了可以对列名和计算字段使用别名,还允许给表名起别名,理由如下:缩短SQL语句;允许一条select语句中多次使用相同的表;表别名只在查询执行中使用,与列表名不一样,表别名不返回到客户端。
*
其他联结:自联结(self join)\自然联结(natural join)\外联结(outer join);
*
自联结:select c1.cust_id,c1.cust_name,c1.cust_contact from customers as c1,customers as c2 where c1.cust_name=c2.cust_name and c2.cust_contact ="jim jones";假如要给与jim jones同一公司的所有顾客发送一封邮件。也可以使用子查询的方式。表c1与表c2是同一个表,但对这个表的引用具有歧义,因此需要使用表别名。where首先联结两个表,然后按第二个表中的cust_contact 过滤数据,返回所需要的数据。
*
自联结通常作为外部语句,用来替代从相同表中检索数据的使用子查询。虽然结果差不多,但许多DBMS处理联结远比处理子查询快得多。
*
自然联结:背景:标准的联结返回所有数据,相同的列甚至多次出现,自然联结排除多次出现,使每一列只返回一次。如何实现:由自己实现,通过只能选择那些唯一的列,一般通过对一个表使用通配符(select*),而对其他表多列使用明确的子集来完成。select c.*,o.order_num,o.order_date,oi.prod_id,oi.quantity,oi.item_price from customers as c,orders as o,orderitems as oi where c.cust_id=o.cust_id and oi.order_num=o.order_num and prod_id = "rgan01";在这个例子中,通配符只对第一个表使用,所有其他列明确列出 ,所以没有重复的列被检索出来。事实上,我们迄今为止建立的每个内联结都是自然联结。
*
外联结:联结包含了那些在相关表中没有关联的行,这种联结成为外联结。例如:列出所有产品以及订购数量,包含那些至今尚未下订单的顾客;select customers.cust_id,orders.order_num from customers left outer join orders on customers.cust_id=orders.cust_id;在使用 外联结时,必须使用right或left关键字指定包括所有行的表,right是指的是outer join右边的表,反之;二者的区别就在于所关联的表的顺序,换句话说,调整from或where子句中表的顺序,左外联结可以转换为右外联结。因此两种联结可以互为转换。
*
全外联结:(fullouterjoin)包含两个表的不关联的行,它检索两个表中的所有行并关联那些可以关联的行。语法如下:select customers.cust_id,orders.order_num from orders FULL OUTER JOIN customers on orders.cust_id =customers.cust_id;
*
使用带聚集函数的联结;select customers.cust_id,count(orders.order_num)as num_order from customers inner join orders on customers.cust_id=orders.cust_id group by customers .cust_id; inner join 将两个表互相关联,函数count对每个顾客的订单进行计数,group by分组数据。
*
使用联结和联结条件,注意要点:1、注意所使用的联结类型,一般使用内联结;保证使用正确的联结条件,否则错误;应该总是提供联结条件,否则会得出笛卡尔积;在一个联结中可以包含多个表,甚至可以对每个联结采用不同的联结类型,应该在一起测试他们之前分别测试每个联结,这样会使故障排除更为简单。

14、组合查询(union)
*
背景:SQL允许执行多个查询(多条select语句),并将结果作为一个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query).
*
使用组合查询的情况:1、在一个查询中从不同的表返回结构数据;2、对一个表执行多个查询,按照一个查询返回数据;多个where条件都可以作为一个组合查询。
*
创建和使用组合查询——union:union将两个语句连接:select cust_name,cust_contact,cust_email from customers where cust_name="fun4all" union select cust_name,cust_contact,cust_email from customers where cust_state in("il","in","mi");也可以使用where来检索数据——select cust_name,cust_contact,cust_email from customers where cust_state in ("il","in","mi") or cust_name="fun4all";
*
使用union需要注意几条规则:1、union必须由两条及以上的select语句组成,语句之间用关键词union分隔;2、union中的每个查询必须包含相同的列、表达式或聚集函数;3、列数据类型必须兼容,类型不必完全相同,但必须是DBMS可以隐含转换的类型。
*
union从查询结果中自动去除了重复的行,重复行被自动取消,这时union的默认行为,如果愿意也可以改变它自动取消,可以使用union all 实现。select cust_name,cust_contact,cust_email from customers where cust_name="fun4all" union all select cust_name,cust_contact,cust_email from customers where cust_state in("il","in","mi");
*
对组合查询的结果进行排序:只能使用一条order by子句,并且必须要位于最后一条select语句之后,对于结果集不存在用一个方式排序一部分,另一种方式排序另一部分的情况,因此不允许使用多条orderby子句。
*
某些DBMS还支持另外两种union:except有时称为minus,可以用来检索只在一个表中存在,而在第二个表中不存在的行;而intersect用来检索两个表中都存在的行。

15、插入数据(insert)
*
insert用于将行插入(或添加)到数据库表,插入有几种方式;1:插入完整的行;2、插入行的一部分;3、插入某些查询的结果。
*
插入完整的行:insert into customers values("100000006","toy land","123 any street","new york","ny","11111","usa",null,null);这种插入方式高度依赖于表中列的定义次序,以及次序信息。这样的SQL语句很不安全。
*

INSERT INTO Customers(cust_id,
	*     ->                        cust_name,

	*     ->                        cust_address,

	*     ->                        cust_city,

	*     ->                        cust_state,

	*     ->                        cust_zip,

	*     ->                        cust_country,

	*     ->                        cust_contact,

	*     ->                        cust_email)

	*     -> VALUES('1000000006',

	*     ->        'Toy Land',

	*     ->        '123 Any Street',

	*     ->        'New York',

	*     ->        'NY',

	*     ->        '11111',

	*     ->        'USA',

	*     ->        NULL,

	*     ->        NULL);
* 这种插入方式在插入行的时候,DBMS将values列表中的响应值填入到相应的列表中的对应项,values中的第一个值对一个于第一个指定列名……,因为提供了指定的列名,values必须以其指定的次序匹配指定多列名,不一定按照各列出现在表中的实际次序。优点是:即使表的结构改变,这条insert语句仍然正常工作。

* 插入部分的行:如果表的定义允许,可以在插入操作中省略某些列,省略的列必须满足以下条件:1、该列定义允许为null值(无值或者空值);2、在表定义中给出默认值,这表示如果不给出值,将使用默认值。没有这两个条件还省略,将会产生错误。

* 插入检索出的数据:用来插入select语句的结果。由一条insert语句和select语句组成。

* insert into 用于插入行数据;insert select 从别的表中插入数据;select into从别的表直接复制表;

16、更新和删除数据(update、delete)

* 更新数据:update用于更新(修改)表中的数据,有两种使用方式:1、更新表中的特定行;2、更新表中的所有行。注意:不要省略where子句。

* 使用update语句可能需要特殊的安全权限,应该保证自己有足够的安全权限。

* update语句组成部分:1、要更新的表;2、列名和他们的新值;3、确定要更新那些行的过滤条件。update  customers set  cust_email="kim@thetoystore.com"where cust_id="100000005";set用于将新值赋予被更新的列,没有where子句将更新customers表中所有的行。在更新多个列的时候只需要使用一条set命令,每一“列“等于值对之间用逗号分隔(最后一列之后不用逗号)。要删除某个列的值,可以将它设置为null值,null表示没有值,而空字符串表示是一个值。update语句中可以使用子查询。使得能够用select语句检索出的数据更新列数据。

* 删除数据:delete用于从表中删除特定的行;从表中删除所有的行。不要省略where语句。delete不需要列名或通配符,delete是删除行而不是删除列,要删除指定的列,使用update 语句。同时delete是删除表的内容而不是表。如果想要删除所有的行,可以使用truncate table 语句,速度更快。

* 使用update或delete时需要遵循的重要原则:1、一定要使用带where的子句;2、保证每个表都有主键 3、在update或delete使用where子句之前,先用select进行测试,保证过滤的是正确的记录,以防编写的where子句不正确。4、使用强制实施引用完整性的数据库,DBMS不允许删除其数据与其他表相关联的行。5、有的DBMS允许数据库管理员施加约束,防止执行不带where子句的更新或删除操作,若是SQL没有undo按钮,应该小心地使用更新或删除操作,否则会发现错误。

17、创建和操纵表
*
创建表——create table 加表名。SQL要求首先手工删除该表,然后在重建它,而不是简单地用创建语句覆盖。
*
null值 ,允许null值的列也允许在插入改行时不给出该列的值,不允许null值的列不接受没有列值的行,也就是在插入或更新行时,该列必须有值。只有不允许null的值的列可以作为主键,允许null的值的列不能作为 唯一标识。null值是没有值,空字符串“ ”在notnull中是允许的,表示0.
*
用default 加值;表示默认值,default current_date()表示将系统日期表示时间。
*
不同DBMS获得系统日期的语法:

* 

使用default而不是null值。
*
使用alter table 语句来更新表定义,使用注意事项如下:1、理想情况下,不要在表中包含数据时对其进行更新;2、所有的DBMS都允许给现有的表增加列,不过对所增加列的数据类型有所限制;3、许多DBMS不允许删除或更改表中的列;4、多数DBMS允许重新命名表中的列,对未填有的数据的列几乎 没有限制。
*
alter table 更改表结构,需要给出下面的信息:1、在alter table之后 给出要更改的表名,该表必须存在,列出要做那些更改。alter table vendors add vend_phone char(20);
*
复杂的表结构更改一般需要手动删除的过程,涉及如下步骤:1、用新的列布局创建一个新表;2、使用insert select语句从旧表复制到新表,有必要的话,可以使用转换函数和计算字段;3、检验包含所需数据的新表;4、重命名旧表(如果确定,可以删除它);5、用旧表原来的名字重命名新表;6、根据需要,重新创建触发器、存储过程、索引和外键。
*
小心使用alter table,应该在进行改动前进行完整的备份(包括表的结构和数据的备份)。因为操作都是永久性的。
*
删除表:drop table 加表名。许多DBMS使用关系规则防止意外删除。
*
重命名表——rename。

18、视图
*
视图:虚拟的表,与包含数据库的表不一样,视图只包含使用时动态检索数据的查询,不包含数据。查询的封装。
*
视图的常见应用:1、重用SQL;2、简化复杂的SQL操作;3、使用表的一部分而不是整个表;4、保护数据,授予用户访问用户访问表的特定部分的权限;5、更改数据格式和表示;
*
创建和使用视图的规则:1、与表一样,视图必须唯一命名;对于可以创建的视图数目没有限制;创建视图必须有足够的访问权限,视图可以嵌套,可以利用从其他视图中枷锁数据的查询来构造视图;许多DBMS禁止在视图查询中使用order by子句,视图不能索引,也不能有关联的触发器或者默认值;有些视图作为只读的查询,表示可以从视图 检索数据,但不能把数据写会底层表;
*
creat view语句来创建视图,只能用于创建不存在的视图;
*
删除视图:drop biew viewname;

19、存储
*
存储过程就是为以后使用而保存的一条或多条SQL语句
*
为什么使用存储过程:1、简化复杂的操作;2、保证数据的一致性;3、简化对变动的管理;4、‘提高性能;
*
执行存储过程:exeute 加存储名字;
*
创建存储过程:create+

20、事务管理
*
事务:事务处理是一种机制,用来管理必须成批执行的SQL操作,保证数据库不包含不完整的操作结果,可以保证一组操作不会中途停止,要么完全执行,要么完全不执行。
*
事务:一组SQL语句;
*
回退:撤销指定SQL语句的过程;
*
提交:将未存储的SQL语句结果写入数据库表;
*
保留点:指事务处理中设置的临时占位符;

21、游标
*
是一个存储在DBMS服务器上的数据库查询,它不是一条select语句,而是被该语句检索出来的结果集。
*
创建游标表:declare custcursor cursor
*
使用游标:open cursor ……close ……

22、高级SQL特性
*
约束
*
主键
*
外键
*
唯一约束
*
检查约束
*
索引
*
触发器
*
数据库安全:需要保护的操作:1、对数据库管理功能;2、对特定数据库或表的访问;3、访问的类型;4、仅仅通过视图或存储过程对表进行访问;5、创建多层次的安全措施,从而允许多种基于登录的访问和控制;6、限制管理用户账号的能力。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值