实现SQL Server数据库中的视图和查询.ppt
1视图基本概念视图基本概念一、视图基本概念一、视图基本概念1基本表基本表基本表是独立存在的表。在基本表是独立存在的表。在SQLServer中中创建了一个基本表,那么可以在表中添加记创建了一个基本表,那么可以在表中添加记录,这些记录存放在硬盘上。录,这些记录存放在硬盘上。“学生表学生表”、“课课程表程表”、“成绩表成绩表”等等,都是基本表。等等,都是基本表。SQLServer2000实用教程实用教程2视图视图视图看上去同表似乎一模一样,具有一组命名的视图看上去同表似乎一模一样,具有一组命名的字段和数据项,但它其实是一个虚拟的表,在物理上字段和数据项,但它其实是一个虚拟的表,在物理上并不实际存在。视图是由查询数据库表产生的,它限并不实际存在。视图是由查询数据库表产生的,它限制了用户能看到和修改的数据。制了用户能看到和修改的数据。视图一旦定义后,就视图一旦定义后,就可以和基本表一样被查询、被删除,也可以在一个视可以和基本表一样被查询、被删除,也可以在一个视图基础上再定义新的视图。图基础上再定义新的视图。视图兼有表和查询的特点:与查询相类似的是,视图兼有表和查询的特点:与查询相类似的是,视图可以用来从一个或多个相关联的表或视图中提取视图可以用来从一个或多个相关联的表或视图中提取有用信息;与表相类似的是,视图可以用来更新其中有用信息;与表相类似的是,视图可以用来更新其中的信息,并将更新结果永久保存在磁盘上。我们可以的信息,并将更新结果永久保存在磁盘上。我们可以用视图使数据暂时从数据库中分离成为游离数据,以用视图使数据暂时从数据库中分离成为游离数据,以便在主系统之外收集和修改数据。便在主系统之外收集和修改数据。SQLServer2000实用教程实用教程二、视图的优缺点二、视图的优缺点 当对通过视图看到的数据进行修改时,相应当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映的数据发生变化,则这种变化也可以自动地反映到视图中。到视图中。视图有很多优点,主要表现在:视图有很多优点,主要表现在:1 1、视点集中视点集中 视视图图集集中中即即是是使使用用户户只只关关心心它它感感兴兴趣趣的的某某些些特特定定数数据据和和他他们们所所负负责责的的特特定定任任务务。这这样样通通过过只只允允许许用用户户看看到到视视图图中中所所定定义义的的数数据据而而不不是是视视图图引引用表中的数据而提高了数据的安全性。用表中的数据而提高了数据的安全性。SQLServer2000实用教程实用教程 2 2、简化操作、简化操作 视视图图大大大大简简化化了了用用户户对对数数据据的的操操作作。因因为为在在定定义义视视图图时时,若若视视图图本本身身就就是是一一个个复复杂杂查查询询的的结结果果集集,这这样样在在每每一一次次执执行行相相同同的的查查询询时时,不不必必重重新新写写这这些些复复杂杂的的查查询询语语句句,只只要要一一条条简简单单的的查查询询视视图图语语句句即即可可。可可见见视视图图向向用用户户隐隐藏藏了了表与表之间的复杂的连接操作。表与表之间的复杂的连接操作。3 3、定制数据、定制数据 视视图图能能够够实实现现让让不不同同的的用用户户以以不不同同的的方方式式看看到到不不同同或或相相同同的的数数据据集集。因因此此,当当有有许许多多不不同同水水平平的的用用户户共共用用同同一一数数据据库库时时,这这显显得得极极为为重要重要。SQLServer2000实用教程实用教程 4 4、合并分割数据、合并分割数据 在有些情况下,由于表中数据量太大,故在在有些情况下,由于表中数据量太大,故在表的设计时常将表进行水平分割或垂直分割,但表的设计时常将表进行水平分割或垂直分割,但表的结构的变化却对应用程序产生不良的影响。表的结构的变化却对应用程序产生不良的影响。如果使用视图就可以重新保持原有的结构关系,如果使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。通过视图来重载数据。5 5、组合分区数据组合分区数据用户可以把来自不同表的两个或多个查询用户可以把来自不同表的两个或多个查询结果组合成单一的结果集。这在用户看来是一个结果组合成单一的结果集。这在用户看来是一个单独的表,称为分区视图。单独的表,称为分区视图。SQLServer2000实用教程实用教程 6 6、安全性、安全性视图可以作为一种安全机制。通过视图用视图可以作为一种安全机制。通过视图用户只能查看和修改他们所能看到的数据。其它户只能查看和修改他们所能看到的数据。其它数据库或表既不可见也不可以访问。如果某一数据库或表既不可见也不可以访问。如果某一用户想要访问视图的结果集,必须授予其访问用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的权限。视图所引用表的访问权限与视图权限的设置互不影响。设置互不影响。7、视图的缺点、视图的缺点视图的缺点主要表现在其对数据修改的限视图的缺点主要表现在其对数据修改的限制上。制上。SQLServer2000实用教程实用教程三、使用视图的场合三、使用视图的场合 1)表的行或列的子集。)表的行或列的子集。2)两个或多个表的联合。)两个或多个表的联合。3)两个或多个表的连接。)两个或多个表的连接。4)其他视图的子集。)其他视图的子集。5)视图与表的组合。)视图与表的组合。SQLServer2000实用教程实用教程2创建视图创建视图创建视图时应该注意以下情况:创建视图时应该注意以下情况:只能在当前数据库中创建视图。只能在当前数据库中创建视图。视图中最多只能引用视图中最多只能引用10241024列。列。如如果果视视图图引引用用的的基基表表或或者者视视图图被被删删除除,则则该该视视图图不不能能再再被被使使用用,直直到到创创建建新新的的基基表表或或者视图。者视图。如如果果视视图图中中某某一一列列是是函函数数、数数学学表表达达式式、常常量量或或者者来来自自多多个个表表的的列列名名相相同同,则则必必须须为为列列定义名称。定义名称。SQLServer2000实用教程实用教程当当视视图图所所引引用用不不同同基基表表的的列列中中有有相相同同列列名名时时或或者者希希望望给给视视图图中中的的列列指指定定新新的的列列名名时时则则需要重新指定列的别名。需要重新指定列的别名。不不能能在在视视图图上上创创建建索索引引,不不能能在在规规则则、缺省、触发器的定义中引用视图。缺省、触发器的定义中引用视图。当当通通过过视视图图查查询询数数据据时时,SQLServer要要检检查查以以确确保保语语句句中中涉涉及及的的所所有有数数据据库库对对象象存存在在,而且数据修改语句不能违反数据完整性规则。而且数据修改语句不能违反数据完整性规则。视视图图的的名名称称必必须须遵遵循循标标识识符符的的规规则则,且且对对每每个个用用户户必必须须是是唯唯一一的的。此此外外,该该名名称称不不得得与该用户拥有的任何表的名称相同。与该用户拥有的任何表的名称相同。SQLServer2000实用教程实用教程 注意:注意:一个视图可以基于一个或若干个基一个视图可以基于一个或若干个基表,也可以基于一个或若干个视图,同时也可表,也可以基于一个或若干个视图,同时也可以基于基表和视图的混合体。以基于基表和视图的混合体。SQLServer2000实用教程实用教程使用使用Transact-SQL语言创建视图语言创建视图 创建视图的语法格式如下:创建视图的语法格式如下:CREATE CREATE VIEW VIEW.视视图图名名(列名列名,.,.n)n)WITH WITH ENCRYPTION|SCHEMABINDING|VIEW_METADATAENCRYPTION|SCHEMABINDING|VIEW_METADATAAS AS SELECT SELECT查询语句查询语句 WITH CHECK OPTIONWITH CHECK OPTIONSQLServer2000实用教程实用教程参数说明:参数说明:(1)(1)视视图图名名称称必必须须符符合合标标识识符符规规则则。可可以以选选择择是是否指定视图所有者名称。否指定视图所有者名称。(2)(2)CREATEVIEW子句中的列名是视图中显示子句中的列名是视图中显示的列名。只有在下列情况下,才必须命名的列名。只有在下列情况下,才必须命名CREATEVIEW子句中的列名:当列是从算术子句中的列名:当列是从算术表达式、函数或常量派生的,两个或更多的列可表达式、函数或常量派生的,两个或更多的列可能会具有相同的名称(通常是因为联接),视图能会具有相同的名称(通常是因为联接),视图中的某列被赋予了不同于派生来源列的名称。当中的某列被赋予了不同于派生来源列的名称。当然也可以在然也可以在SELECT语句中指派列名。语句中指派列名。注意注意:如果未指定列名,如果未指定列名,则视图则视图列将列将获获得与得与 SELECT SELECT 语语句中的列相同的名称。句中的列相同的名称。SQLServer2000实用教程实用教程 (3 3)定定义义视视图图的的语语句句是是一一个个 SELECTSELECT查查询询语语句句。该该语语句句可可以以使使用用多多个个表表或或其其它它视视图图。若若要要从从创创建建视视图图的的 SELECT SELECT 子子句句所所引引用用的的对对象象中中选选择择,必必须须具具有有适适当当的的权权限限。视视图图不不必必是是具具体体某某个个表表的的行行和和列列的的简简单单子子集集。可可以以用用具具有有任任意意复复杂杂性性的的 SELECT SELECT 子子句句,使使用用多多个个表表或或其其它它视视图图来来创创建视图。建视图。(4 4)在索引视图定义中,)在索引视图定义中,SELECT SELECT 语句必须是语句必须是单个表的语句或带有可选聚合的多表单个表的语句或带有可选聚合的多表 JOINJOIN。SQLServer2000实用教程实用教程 (5 5)在在CREATE CREATE VIEWVIEW语语句句中中,对对于于SELECTSELECT查询语句有如下限制:查询语句有如下限制:创建视图的用户必须对该视图所参照或引用创建视图的用户必须对该视图所参照或引用的表或视图具有适当的权限。的表或视图具有适当的权限。在查询语句中,不能包含在查询语句中,不能包含ORDER BYORDER BY(如果如果要包含的话要包含的话SELECTSELECT子句中要用子句中要用TOP n percentTOP n percent)、COMPUTECOMPUTE或或COMPUTE BYCOMPUTE BY关键字。也不能包关键字。也不能包含含INTOINTO关键字。关键字。不能在临时表中定义视图不能在临时表中定义视图(不能引用临时表不能引用临时表)。SQLServer2000实用教程实用教程 (6 6)WITH WITH CHECK CHECK OPTIONOPTION:强强制制视视图图上上执执行行的的所所有有数数据据修修改改语语句句都都必必须须符符合合由由 SELECTSELECT查查询询语语句句设设置置的的准准则则。通通过过视视图图修修改改数数据据行行时时,WITH WITH CHECK CHECK OPTION OPTION 可可确确保保提提交修改后,仍可通过视图看到修改的数据。交修改后,仍可通过视图看到修改的数据。(7 7)WITH WITH ENCRYPTIONENCRYPTION:表表 示示 SQL SQL Server Server 加加密密包包含含 CREATE CREATE VIEW VIEW 语语句句文文本本的的系系统统表表列列。使使用用 WITH WITH ENCRYPTION ENCRYPTION 可可防防止止将视图作为将视图作为 SQL Server SQL Server 复制的一部分发布。复制的一部分发布。SQLServer2000实用教程实用教程 (8)SCHEMABINDING:将视图绑定到架将视图绑定到架构上。指定构上。指定 SCHEMABINDING 时,时,SELECT查询语句必须包含所引用的表、视图或用户定查询语句必须包含所引用的表、视图或用户定义函数的两部分名称义函数的两部分名称(owner.object)。不能除去不能除去参与用架构绑定子句创建的视图中的表或视图,参与用架构绑定子句创建的视图中的表或视图,除非该视图已被除去或更改,不再具有架构绑除非该视图已被除去或更改,不再具有架构绑定。否则,定。否则,SQL Server 会产生错误。另外,如会产生错误。另外,如果对参与具有架构绑定的视图的表执行果对参与具有架构绑定的视图的表执行 ALTER TABLE 语句,而这些语句又会影响该架构绑定语句,而这些语句又会影响该架构绑定视图的定义,则这些语句将会失败视图的定义,则这些语句将会失败。SQLServer2000实用教程实用教程 (9)VIEW_METADATA:指定为引用视图的查询指定为引用视图的查询请求浏览模式的元数据时,请求浏览模式的元数据时,SQLServer将向将向DBLIB、ODBC和和OLEDBAPI返回有关视图的元数据信息,返回有关视图的元数据信息,而不是返回基表或表。浏览模式的元数据是由而不是返回基表或表。浏览模式的元数据是由SQLServer向客户端向客户端DB-LIB、ODBC和和OLEDBAPI返返回的附加元数据,它允许客户端回的附加元数据,它允许客户端API实现可更新的客实现可更新的客户端游标。浏览模式的元数据包含有关结果集内的列所户端游标。浏览模式的元数据包含有关结果集内的列所属的基表信息。属的基表信息。对于用对于用VIEW_METADATA选项创建选项创建的视图,当描述结果集中视图内的列时,浏览模式的元的视图,当描述结果集中视图内的列时,浏览模式的元数据返回与基表名相对的视图名。当用数据返回与基表名相对的视图名。当用VIEW_METADATA创建视图时,如果该视图具有创建视图时,如果该视图具有INSERT或或UPDATEINSTEADOF触发器,则视图触发器,则视图的所有列(的所有列(timestamp除外)都是可更新的。除外)都是可更新的。SQLServer2000实用教程实用教程3管理视图管理视图1、使用系统存储过程查看视图信息、使用系统存储过程查看视图信息sp_help表表/视图视图sp_helptext表表/视图视图sp_depends表表/视图视图SQLServer2000实用教程实用教程2、使用、使用T-SQL语句修改视图语句修改视图ALTER VIEWALTER VIEW语句的语法格式为:语句的语法格式为:ALTERALTERVIEW VIEW.视图视图名名(列名列名,.,.n)n)WITHWITHENCRYPTION|SCHEMABINDING|VIEW_METADATAENCRYPTION|SCHEMABINDING|VIEW_METADATAAS AS SELECT SELECT查询语句查询语句 WITH CHECK OPTIONWITH CHECK OPTION参数参数说说明同明同CREATE VIEWCREATE VIEW相同。相同。SQLServer2000实用教程实用教程3、使用使用DROP VIEW删除视图删除视图删除视图的语法格式如下。删除视图的语法格式如下。DROP VIEW视图名视图名1,视图名,视图名n使用该语句一次可以删除多个视图。使用该语句一次可以删除多个视图。SQLServer2000实用教程实用教程4通过视图访问数据通过视图访问数据 使用视图管理表中的数据包括插入、更新使用视图管理表中的数据包括插入、更新和删除三种操作,在操作时要注意以下几点:和删除三种操作,在操作时要注意以下几点:修改视图中的数据时,可以对基于两个以修改视图中的数据时,可以对基于两个以上基表或视图的视图进行修改,但是不能同时上基表或视图的视图进行修改,但是不能同时影响两个或者多个基表,每次修改都只能影响影响两个或者多个基表,每次修改都只能影响一个基表。一个基表。不能修改那些通过计算得到的列,例如年龄不能修改那些通过计算得到的列,例如年龄和平均分等。和平均分等。若在创建视图时定义了若在创建视图时定义了 WITH CHECK WITH CHECK OPTIONOPTION选项,那么使用视图修改基表中的数选项,那么使用视图修改基表中的数据时,必须保证修改后的数据满足定义视图的据时,必须保证修改后的数据满足定义视图的限制条件。限制条件。SQLServer2000实用教程实用教程 执行执行UPDATEUPDATE或或DELETEDELETE命令时,所更新或删除命令时,所更新或删除的数据必须包含在视图的结果集中。的数据必须包含在视图的结果集中。如果视图引用多个表时,无法用如果视图引用多个表时,无法用DELETEDELETE命令删命令删除数据。除数据。如果视图引用多个表,使用如果视图引用多个表,使用INSERTINSERT或或UPDATEUPDATE语句对视图进行操作时,被插入或更新的列必须属语句对视图进行操作时,被插入或更新的列必须属于同一个表。于同一个表。视图的字段来自集合函数,则此视图不允许修改视图的字段来自集合函数,则此视图不允许修改操作。操作。若若视视图图定定义义中中含含有有GROUPBY子子句句,则则此此视视图图不允许修改操作。不允许修改操作。若若视视图图定定义义中中含含有有DISTINCT短短语语,则则此此视视图图不不允许修改操作。允许修改操作。一一个个不不允允许许修修改改操操作作视视图图上上定定义义的的视视图图,也也不不允允许修改操作。许修改操作。SQLServer2000实用教程实用教程5SELECT语句语句SELECT语句能够从数据库中检索出符合用户需求的数据,语句能够从数据库中检索出符合用户需求的数据,并将结果以表格的形式返回,是并将结果以表格的形式返回,是SQLServer中使用最频繁的语中使用最频繁的语句之一。基本语法格式如下:句之一。基本语法格式如下:SELECT列名列名1,列名列名2.INTO新表名新表名FROM表名表名1,表名表名2.WHERE条件条件GROUPBY列名列表列名列表HAVING条件条件ORDERBY列名列表列名列表ASC|DESC其中,用其中,用表示可选项。表示可选项。SELECT语句至少包含两个子句:语句至少包含两个子句:SELECT和和FROM,SELECT子句指定要查询的指定表中的列,子句指定要查询的指定表中的列,FROM子句指定查询子句指定查询的表。的表。SQL Server 2000实用教程实用教程SELECT子句子句SELECT子句用于指定要返回的列,其完整的子句用于指定要返回的列,其完整的语法如下:语法如下:SELECTALLDISTINCTTOPnPERCENT列名列名AS别名别名别名别名=表达式表达式,.nSQL Server 2000实用教程实用教程FROM子句子句只要只要SELECT子句有要查询的列,就必须使子句有要查询的列,就必须使用用FROM子句指定进行查询的单个或者多个表。子句指定进行查询的单个或者多个表。此外,此外,SELECT语句要查询的数据源除了表以外语句要查询的数据源除了表以外还可以是视图,视图相当于一个临时表,其语还可以是视图,视图相当于一个临时表,其语法格式如下:法格式如下:FROM表名表名|视图名视图名,.n当有多个数据源时,可以使用逗号当有多个数据源时,可以使用逗号“,”分隔,分隔,但是但是最多只能有最多只能有16个数据源个数据源。数据源也可以像。数据源也可以像列一样指定别名,该别名只在当前的列一样指定别名,该别名只在当前的SELECT语语句中起作用,方法为:数据源名句中起作用,方法为:数据源名AS别名,或者别名,或者数据源名数据源名别名。指定别名的好处在于以较短的别名。指定别名的好处在于以较短的名字代替原本见名知意的长名。名字代替原本见名知意的长名。SQL Server 2000实用教程实用教程WHERE子句子句WHERE子句指定查询的条件,限制返回子句指定查询的条件,限制返回的数据行。其语法格式如下:的数据行。其语法格式如下:WHERE指定条件指定条件WHERE子句用于指定搜索条件,过滤不子句用于指定搜索条件,过滤不符合查询条件的数据记录,使用比较灵活且符合查询条件的数据记录,使用比较灵活且复杂。可以使用的条件包括比较运算、逻辑复杂。可以使用的条件包括比较运算、逻辑运算、范围、模糊匹配以及未知值等。运算、范围、模糊匹配以及未知值等。SQL Server 2000实用教程实用教程一、使用通配符一、使用通配符*select*from表名表名/视图名视图名返回返回from中指定的表中的所有列。中指定的表中的所有列。二、使用指定的列二、使用指定的列select列名列名1,列名列名2,列名列名nfrom表名表名/视图名视图名返回返回from中指定的表中的指定列。中指定的表中的指定列。SQL Server 2000实用教程实用教程三、使用三、使用TOP关键字关键字selecttopnpercent列名列名四、使用四、使用DISTINCT关键字关键字使用使用DISTINCT关键字时,关键字时,1、无论遇到多少个空值,只返回一个。、无论遇到多少个空值,只返回一个。2、表达式只包含一个列名,且不能包含算术、表达式只包含一个列名,且不能包含算术表达式。表达式。3、不能包含、不能包含text、ntext和和image类型字段。类型字段。4、是、是sum、avg和和count的可选关键字。的可选关键字。SQL Server 2000实用教程实用教程五、使用计算列五、使用计算列六、使用列的别名六、使用列的别名1、select列名列名1别名别名1,2、select别名别名1=列名列名1,3、select列名列名1as别名别名1,七、使用七、使用SELECT语句进行无数据源检索语句进行无数据源检索SQL Server 2000实用教程实用教程6使用使用WHERE子句子句select列名列名from表名表名/视图名视图名where说明:说明:1、中的条件数目无限制。中的条件数目无限制。2、where子句必须紧跟在子句必须紧跟在from子句的后面。子句的后面。SQL Server 2000实用教程实用教程一、使用比较运算符一、使用比较运算符用于比较两个表达式是否满足条件。用于比较两个表达式是否满足条件。用于除用于除text、ntext和和image类型外的所类型外的所有表达式。其结果返回值是布尔类型,有表达式。其结果返回值是布尔类型,即即true或或false。二、使用逻辑运算符二、使用逻辑运算符三种逻辑运算符:三种逻辑运算符:or、and和和not。SQL Server 2000实用教程实用教程三、使用三、使用BETWEEN关键字关键字在在where子句中使用子句中使用BETWEEN关键字关键字来限制查询数据的来限制查询数据的范围。范围。BETWEEN关键字的效果可以用含有关键字的效果可以用含有=的表达式来代替;的表达式来代替;NOTBETWEEN关关键字的效果可以用含有键字的效果可以用含有和和的表达式来代的表达式来代替。替。SQL Server 2000实用教程实用教程四、使用四、使用IN关键字关键字IN关键字用以确定一个给定值是否与子查询关键字用以确定一个给定值是否与子查询或列表中的值相匹配。或列表中的值相匹配。要查询不在子查询或列表中的记录,可以使要查询不在子查询或列表中的记录,可以使用用NOTIN。注:在注:在where中使用中使用between是记录的一段取是记录的一段取值范围;使用值范围;使用in是记录的离散取值范围。是记录的离散取值范围。SQL Server 2000实用教程实用教程五、使用五、使用LIKE关键字关键字SQL Server 2000实用教程实用教程注:注:1、一定要把、一定要把LIKE运算符与运算符与=运算符区别开。通配符只有在运算符区别开。通配符只有在LIKE子句中才有意义。子句中才有意义。2、万一要查询的字符串中包含了通配符作为字符串的一部分,、万一要查询的字符串中包含了通配符作为字符串的一部分,如何处理?如何处理?假设一个表假设一个表test的某一列的某一列col有以下有以下4个值:个值:xyz%xyzx_yzxyz查找以查找以“X_”开头的字符串开头的字符串SelectcolFromtestWherecolLIKEX_%ESCAPESQL Server 2000实用教程实用教程7ORDERBY子句子句ORDERBY列名列名ASC|DESC说明:说明:1、ASC-升序升序(默认默认),DESC-降序降序2、不能使用、不能使用text、ntext和和image类型类型的字段的字段3、引用列的数量不能大于、引用列的数量不能大于select语句中语句中的列的数量的列的数量SQL Server 2000实用教程实用教程8使用表的别名使用表的别名SELECT表的别名表的别名.列名列名1,表的别名表的别名.列名列名2.FROM表名表名AS表的别名表的别名9多表查询多表查询在很多情况下,需要从多个表中提取数据,组合在很多情况下,需要从多个表中提取数据,组合成一个结果集。如果一个查询需要对多个表进行操作,成一个结果集。如果一个查询需要对多个表进行操作,则将此查询称为连接查询。连接查询包括内连接、外则将此查询称为连接查询。连接查询包括内连接、外连接和交叉连接等。连接和交叉连接等。一、内连接一、内连接内连接使用比较运算符(最常使用的是等号,即内连接使用比较运算符(最常使用的是等号,即等值连接),根据每个表共有列的值匹配两个表中的等值连接),根据每个表共有列的值匹配两个表中的行。只有每个表中都存在相匹配列值的记录才出现在行。只有每个表中都存在相匹配列值的记录才出现在结果集中。在内连接中,所有表是平等的,没有主次结果集中。在内连接中,所有表是平等的,没有主次之分。之分。SQLServer2000实用教程实用教程1.在在where子句中指定连接子句中指定连接select表表.查询列名查询列名1,表表.查询列名查询列名nfrom表表1,表表2where表表1.列名列名=表表2.列名列名2.使用使用join和和on关键字指定连接条件关键字指定连接条件select表表.查询列名查询列名1,表表.查询列名查询列名nfrom表表1innerjoin表表2on表表1.列名列名=表表2.列名列名3.内连接的条件查询内连接的条件查询SQLServer2000实用教程实用教程二、外连接二、外连接与内连接相对,参与外连接的表有主次之分。以与内连接相对,参与外连接的表有主次之分。以主表的每一行数据去匹配从表中的数据列,符合连接主表的每一行数据去匹配从表中的数据列,符合连接条件的数据将直接返回到结果集中,对那些不符合连条件的数据将直接返回到结果集中,对那些不符合连接条件的列,将被填上接条件的列,将被填上NULL值后再返回到结果集中。值后再返回到结果集中。外连接可以分为左连接、右连接和完全连接外连接可以分为左连接、右连接和完全连接3种情种情况。况。SQLServer2000实用教程实用教程1、左连接左连接将将左左表表中中的的所所有有记记录录分分别别与与右右表表中中的的每每条条记记录录进进行行组组合合,结结果果集集中中除除返返回回内内部部连连接接的的记记录录以以外外,还还在在查查询询结结果果中中返返回回左左表表中中不不符符合合条条件件的的记记录录,并并在在右右表表的的相相应应列列中中填填上上NULL,由由于于BIT类类型型不不允允许许为为NULL,就以就以0值填充。左外连接的语法格式如下:值填充。左外连接的语法格式如下:SELECT列名列表列名列表FROM表名表名1ASALEFTOUTERJOIN表名表名2ASBONA.列名列名=B.列名列名SQLServer2000实用教程实用教程2、右连接、右连接和和左左连连接接类类似似,右右连连接接是是将将左左表表中中的的所所有有记记录录分分别别与与右右表表中中的的每每条条记记录录进进行行组组合合,结结果果集集中中除除返返回回内内部部连连接接的的记记录录以以外外,还还在在查查询询结结果果中中返返回回右右表表中中不不符符合合条条件件的的记记录录,并并在在左左表表的的相相应应列列中中填填上上NULL,由由于于BIT类类型型不不允允许许为为NULL,就就以以0值值填填充充。右右连连接接的的语语法格式如下:法格式如下:SELECT列名列表列名列表FROM表名表名1ASARIGHTOUTERJOIN表名表名2ASBONA.列名列名=B.列名列名SQLServer2000实用教程实用教程3、完全连接、完全连接完完全全连连接接是是将将左左表表中中的的所所有有记记录录分分别别与与右右表表中中的的每每条条记记录录进进行行组组合合,结结果果集集中中除除返返回回内内部部连连接接的的记记录录以以外外,还还在在查查询询结结果果中中返返回回两两个个表表中中不不符符合合条条件件的的记记录录,并并在在左左表表或或右右表表的的相相应应列列中中填填上上NULL,BIT类类型型以以0值填充。全外连接的语法格式如下:值填充。全外连接的语法格式如下:SELECT列名列表列名列表FROM表名表名1ASAFULLOUTERJOIN表名表名2ASBONA.列名列名=B.列名列名SQLServer2000实用教程实用教程三、三、交叉连接交叉连接交叉连接的结果是两个表的笛卡儿积,在实际应交叉连接的结果是两个表的笛卡儿积,在实际应用中一般是没有意义的,但在数据库的数学模式上有用中一般是没有意义的,但在数据库的数学模式上有重要的作用。交叉连接的语法格式如下:重要的作用。交叉连接的语法格式如下:SELECT列名列表列名列表FROM表名表名1CROSSJOIN表名表名2或者或者SELECT列名列表列名列表FROM表名表名1,表名表名2SQLServer2000实用教程实用教程四、四、连接两个以上的表连接两个以上的表五、自连接五、自连接自自连连接接就就是是一一个个表表的的两两个个副副本本之之间间的的内内连连接接。表表名名在在FROM子子句句中中出出现现两两次次,必必须须对对表表指指定定不不同同的的别别名名,在在SELECT子子句句中中引引用用的的列列名名也也要要使使用用表表的的别别名名进进行限定。自连接行限定。自连接的语法格式如下:的语法格式如下:selectA.列名列名B.列名列名from表名表名asA连接方式连接方式join表名表名asBSQLServer2000实用教程实用教程10使用使用UNION子句子句 UNION运算符用于将两个或多个检索结果合并成一个结果,当使用UNION时,需遵循以下两个规则。(1)所有查询中的列数和列的顺序必须相同。(2)所有查询中按顺序对应列的数据类型必须兼容。SQLServer2000实用教程实用教程11 使用GROUP BY子句命令格式:命令格式:SELECT SELECT 列名列名 FROM FROM 表名表名 GROUP BY GROUP BY ALLALL 组名组名SQLServer2000实用教程实用教程 命令说明:命令说明:命令说明:命令说明:(1)(1)在在SELECTSELECT语语句句中中所所指指定定的的列列必必须须是是GROUP GROUP BYBY子子句中的列名,或是被聚合函数所使用的列。句中的列名,或是被聚合函数所使用的列。(2)ALL(2)ALL关关键键字字,它它指指定定返返回回由由GROUP GROUP BYBY子子句句产产生生的的所所有有组组,即即使使某某些些组组没没有有符符合合WHEREWHERE子子句句中中指指定定条条件件的的行。行。(3)text(3)text、ntextntext和和imageimage类类型型的的列列不不能能用用于于GROUP GROUP BYBY子句。子句。(4)(4)分分组组的的列列中中包包含含多多个个NULLNULL时时,这这些些空空值值将将放放入入一个组中进行显示。一个组中进行显示。(5)(5)在在GROUP BYGROUP BY子句中必须使用列的名称。子句中必须使用列的名称。SQLServer2000实用教程实用教程使用使用GROUP BYGROUP BY注意事项:注意事项:1 1、什么时候使用、什么时候使用GROUP BYGROUP BY子句子句?当需要按某一列数据的值进行分类,在分类的基当需要按某一列数据的值进行分类,在分类的基础上对数据进行统计,就需要使用础上对数据进行统计,就需要使用GROUP BYGROUP BY子句。子句。2 2、指定、指定GROUP BYGROUP BY时,选择列表中任一非聚合表时,选择列表中任一非聚合表达式内的所有列都应包含在达式内的所有列都应包含在GROUP BYGROUP BY列表中。列表中。3 3、选择列表中的列如果不在聚合函数里面,就、选择列表中的列如果不在聚合函数里面,就必须在必须在GROUP BYGROUP BY列表里面。否则语法上虽然不会出列表里面。否则语法上虽然不会出错,但是执行起来会出错。错,但是执行起来会出错。SQLServer2000实用教程实用教程USE pubsGOSELECT type,pub_id,avg(price)FROM titlesgroup by typeGOUSE pubsGOSELECT type,pub_id,avg(price)FROM titlesgroup by type,pub_idorder by 1,2GOERROR!OK!SQLServer2000实用教程实用教程一、一、在在GROUP BYGROUP BY子句中使用多个列子句中使用多个列 可可以以在在GROUP GROUP BYBY子子句句中中列列出出多多个个列列,以以实实现现嵌嵌套套分分组。组。二、二、GROUP BYGROUP BY子句和子句和ALLALL关键字关键字 在在包包含含GROUP GROUP BYBY子子句句的的查查询询中中可可以以使使用用WHEREWHERE子子句句。利利用用WHEREWHERE中中的的条条件件可可在在分分组组之之前前消消除除不不符符合合WHEREWHERE条条件件的行。的行。在在GROUP GROUP BYBY语语句句中中使使用用ALLALL关关键键字字,只只有有在在SELECTSELECT语语句中含有句中含有WHEREWHERE子句时才显得有意义。子句时才显得有意义。没没有有ALLALL关关键键字字,包包含含GROUP GROUP BYBY子子句句的的SELECTSELECT语语句句将将不不显显示示不不符符合合条条件件的的行行的的组组。如如果果使使用用ALLALL关关键键字字,那那么么查查询询结结果果将将包包括括由由GROUP GROUP BYBY子子句句产产生生的的所所有有组组,不不符符合查询条件的列在使用统计函数时将返回合查询条件的列在使用统计函数时将返回NULLNULL值。值。SQLServer2000实用教程实用教程12121212 使用使用使用使用HAVINGHAVINGHAVINGHAVING子句子句子句子句 在包含在包含GROUPBYGROUPBY子句的查询中可以使用子句的查询中可以使用WHEREWHERE子句。子句。利用利用WHEREWHERE中的条件可在分组之前消除不符合中的条件可在分组之前消除不符合WHEREWHERE条条件的行。当完成对数据结果的查询和统计后,可以使件的行。当完成对数据结果的查询和统计后,可以使用用HAVINGHAVING关键字对查询和计算的结果进行进一步的筛关键字对查询和计算的结果进行进一步的筛选。选。注意注意HAVINGHAVING和和WHEREWHERE的区别:的区别:1 1、WHEREWHERE子句搜索条件在进行分组操作之前应用;子句搜索条件在进行分组操作之前应用;而而 HAVING HAVING 搜索条件在进行分组操作之后应用。搜索条件在