sql中select语句详解及用途_第1页
sql中select语句详解及用途_第2页
sql中select语句详解及用途_第3页
sql中select语句详解及用途_第4页
sql中select语句详解及用途_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、sql中select语句详解及用途1 SELECT ALL | DISTINCT ON ( expression ,.)2 * | expression AS output_name ,.3 FROM from_item ,.4 WHERE condition 5 GROUP BY expression ,.6 HAVING condition ,.7 UNION | INTERSECT | EXCEPT ALL select 8 ORDER BY expression ASC | DESC | USING operator ,.9 FOR UPDATE OF tablename ,.10 L

2、IMIT count | ALL 11 OFFSET start 这里from_item 可以是:?12 ONLY table_name * 13 AS alias ( column_alias_list )14 I_15 ( select )16 AS alias ( column_alias_list )17 I_18 from_item NATURAL join_type from_item19 ON join_condition | USING ( join_column_list )输入expression表的列/字段名或一个表达式.output_name使用AS子句为一个列/字段或

3、一个表达式声明另一个名称.这个名称主要用于标记输出列用于显示。它可以在ORDER BY 和GROUP BY 子句里代表列/字段的值.但是output_name不能用于 WHERE 或HAVING 子句;用表达式代替.from_item一个表引用,子查询,或者 JOIN子句.详见下文.condition一个布尔表达式,给出真或假的结果.参见下面描述的 WHERE和HAVING 子句.select一个选择语句,可以有除ORDER BY , FOR UPDATE ,和LIMIT 子句以外的所有 特性(甚至在加了括弧的情况下那些语句也可以用).FROM 项可以包括:table_name一个现存的表或视

4、图的名字. 如果声明了 ONLY ,则只扫描该表. 如果没有声明ONLY ,该表和所有其派生表 (如 果有的话)都被扫描.可以在表名后面跟一个 *来表示扫所有其后代表, 但在目前的版本里,这是缺省特性.(在 PostgreSQL 7.1以前的版本里, ONLY是缺省特性.)alias用于于前面的table_name.的替换名字,用于缩写或消除一个表自连接时的含混.(此时同一个表要扫描好几次.)如果写了别名,那么你也可以写一个字段别名列表,为表的一个或者几个字段提供替换名字.select一个在FORM子句里出现的子查询.它的输出作用好象是为这条SELECT命令在其生存期里创建一个临时表.请注意这

5、个子查询必须用园括弧包围.并且必须给它加别名.join_typeINNER JOIN , LEFT OUTER JOIN , RIGHT OUTER JOIN , FULL OUTER JOIN ,或 CROSS JOIN.之 一. 就 INNER 和 OUTER 连接类型,必须出现 NATURAL ON join_condition ,或 USING ( join_column_list ) 之 一.又于 CROSS JOIN ,上面的项都不能出现.join_condition一个条件限制.类似 WHERE条件,只不过它只应用于在这条JOIN子句里连接的两个from_item .join_c

6、olumn_list一个 USING 字段列表 (a, b,.)是 ON 条件 left_table.a = right_table.a AND left_table.b = right_table.b .的缩写.输出Rows你声明的查询返回的所有结果集的行.count查询返回的行的计数.描述SELECT将从一个或更多表中返回记录行。选择的侯选彳T是满足WHERE条件的所有行。或者如果省略了WHERE 语句则选择表中的所有行.(参阅 WHERE子句).实际上,返回的行并不是由FROM/WHERE/GROUP BY/HAVING子句直接生成的行;其实,输出行是通过给每个选出的行计算 SELECT

7、输出表达式形成的.你可以在输出列表上写一个*表示选出的行的所有列.同样我们可以拿table_name.*表示来自该表的所以行.DISTINCT将从选择出来的结果集中删除所有的重复的行。ALL (缺省)将返回所有侯选行,包括重复的行。DISTINCT ON 删除匹配所有你声明的表达式的行,只保留每个重复集的第一行。DISTINCT ON 表达式是用和ORDER BY 项一样的规则来解释的,见下文.注意这里每个重复集的"第一行"是不可预料的,除非我们用ORDER BY来保证我们希望的行最先出现。例如,SELECT DISTINCT ON (location) location,

8、 time, report FROM weatherReports ORDER BY location, time DESC;检索出每个地区的最近的天气预报。但是如果我们没有使用ORDER BY来强制每个地区按时间值降续排列,我们得到的将是每个地区的不可预料的时间的报告。GROUP BY子句允许用户把表分成匹配一个或多个数值的不同行的组.(参考 GROUP BY 子句.)HAVING允许只选择那些满足声明条件的行组(参阅 HAVING 子句.)ORDER BY导致返回的行按照声明的顺序排列.如果没有给出 ORDER BY ,输出的行的顺序将以 系统认为开销最小的顺序产生.(参阅ORDER BY

9、子句.)多个SELECT查询可以用 UNION , INTERSECT ,和EXCEPT操作符 组合起来.必要时请使用圆括弧确 定这些操作符的顺序.UNION操作符计算是那些参与的查询所返回的行的集合。如果没有声明 ALL ,那么重复行被删除.(参阅UNION子句.)INTERSECT给出两个查询公共的行。如果没有声明 ALL ,那么重复行被删除.(参阅INTERSECT子句.)EXCEPT给出存在于第一个查询而不存在于第二个查询的行。如果没有声明 ALL ,那么重复行被删除.(参阅EXCEPT子句.)FOR UPDATE子句允许SELECT语句对选出的行执行排他锁。LIMIT子句允许给用户返

10、回一个查询生成的结果的子集。(参阅 LIMIT子句.)你必须有 SELECT 权限用来从表中读取数值(参阅 GRANT/REVOKE 语句.)FROM子句FROM子句为SELECT声明一个或多个源表.如果声明了多个源表,则概念上结果是所有源表所有行的迪卡尔积-不过通常会增加限制条件以把返回的行限制为迪卡尔积的一个小子集.如果FROM项是一个简单表名字,它隐含包括来自该表子表(继承子表)的行.ONLY将消除从该表的子表来的行. 在PostgreSQL 7.1以前,这是缺省结果, 而获取子表的行是通过在表名后面附加*实现的. 这种老式性质可以通过命令 SET SQL_Inheritance TO

11、OFF;获取.FROM项也可以是一个加了圆括弧的子查询(请注意子查询需要一个别名子句!)这个特性非常实用,因为这是在一条查询中获得多层分组,聚集,或者排序的唯一方法.最后,FROM项可以是一条 JOIN子句,它把两个简单的FROM项组合 在一起.(必要时使用圆括弧来描述嵌套顺序.)CROSS JOIN或INNER JOIN 是简单的迪卡尔积,和你在顶层 FROM 里列出这两个项得到的一样.CROSS JOIN等效于INNER JOIN ON (TRUE),也就是说,不会有任何行被条件删除.这些连接类型只是符号上的便利,因为它们做得一点不比你只利用FROM和WHERE来的多.LEFT OUTER

12、 JOIN 返回所有符合条件的迪卡尔积(也就是说,所有符合它的 ON条件的组合了的行),另外加上所有没有右手边行符合ON条件的左手边表中的行.这样的左手边行通过向右手边行插入NULL扩展为全长.请注意,当判断哪些行合格的时候,只考虑 JOIN自己的ON或USING .然后才考虑外层的ON或WHERE条件.相反,RIGHT OUTER JOIN 返回所有连接的行,另外加上所有未匹配右手边行(左手边插入NULL扩展为全长).这个字句只是符号方便,因为你可以调换左右输入而改用LEFT OUTER JOIN .FULL OUTER JOIN 返回所有连接行,加上所有未匹配的左手边行(右边插入 NULL

13、扩展为全长),再加上所有未匹配的右手边行(左手边插入NULL扩展为全长).除了 CROSS JOIN 以外的所有 JOIN 类型,你必须写 ON join_condition , USING ( join_column_list ), 和 NATURAL 中的一个.大多数情况下会是 ON :你可以写涉及两个连接表的任何条件表达式.USING字段列表(a,b,) 是 ON 条件 left_table.a = right_table.a AND left_table.b = right_table.b 的缩写.另外,USING 假设两对等式中只有一个包含在JOIN输出中,而不是两个. NATURA

14、L 是提及表中所有相似名字字段的USING列表的缩写.WHERE子句可选的WHERE条件有如下常见的形式:WHERE boolean_exprboolean_expr可以包含任意个得出布尔值的表达式。通常表达式会是expr cond_op expr 或log_op expr这里cond_op可以是:=,<,<=, >, >=或 <>,或条件操作符象 ALL , ANY , IN, LIKE 等,或者用户定 义的操作符,而 log_op可以为:AND, OR, NOT. SELECT将忽略所有 WHERE 条件不为 TRUE的行.GROUP BY 子句GROU

15、P BY声明一个分了组的表,该表源于应用使用下面的子句:GROUP BY expression ,.GROUP BY将把所有在组合了的列上共享同样的值的行压缩成一行。如果存在聚集函数,这些聚集函数将计算每个组的所有行,并且为 每个组计算一个独立的值(如果没有GROUP BY ,聚集函数对选出的所有行计算出一个数值)。存在GROUP BY时,除了在聚集函数里面,SELECT输出表达式对任何非组合列的引用都是非法的,因为对一个非组合列会有多于一个可能的返回值。一个在 GROUP BY里面的条目还可以是输出列的名称或者序号(SELECT表达式), 或者是一个从输入列的数值形成的任意表达式.当存在语义

16、模糊时,一个GROUP BY名称将被解释成一个输入列 /字段名称而不是一个输出列/字段名称.HAVING 子句可选的HAVING 条件有如下形式:HAVING boolean_expr 这里boolean_expr和为 WHERE 子句里声明的相同.HAVING子句声明一个从前面的子句的结果集中去除了一些不符合boolean_expr.组后分组的表.HAVING与WHERE不同:WHERE在应用 GROUP BY 之前过滤出单独的行,而 HAVING 过滤由 GROUP BY 创建的 行.在boolean_expr里引用的每个列/字段应该清晰地指明一个组的列/字段, 除非引用在一个聚集函数里。

17、ORDER BY 子句ORDER BY expression ASC | DESC | USING operator ,.一个ORDER BY 项可以是一个输出列(SELECT表达式)的名字或者序数,或者它也可以是任何来自输入列值形成的表达式.在出现混淆白场合下,ORDER BY名字将被解释成一个输出名字.序数指的是列/字段按顺序(从左到右)的位置.这个特性可以使得对没有一个合适名称的列/字段的排序成为可能.这一点可能永远没有用,因为总是可以通过 AS子句给一个要计算的列/字段赋予一个名称,例如:SELECT title, date_prod + 1 AS newlen FROM films

18、ORDER BY newlen;还可以ORDER BY任意表达式(一个对 SQL92的扩展),包括那些没有出现在SELECT结果列表里面的域。因此下面的语句现在是合法的:SELECT name FROM distributors ORDER BY code;这个特性的一个局限就是应用于UNION , INTERSECT ,或者 EXCEPT查询 的ORDER BY 子句只能在一个输出字段名或者数字上声明,而不能在一个表达式上声明.请注意如果一个 ORDER BY条目是一个匹配结果列和输入列的简单名称,ORDER BY 将把它解释成结果列名称.这和GROUP BY 在同样情况下做的选择正相反.这

19、样的不一致是由 SQL92标准强制的.我们可以给ORDER BY 子句里每个列/字段加一个关键字 DESC (降序)或 ASC (升序).如果不声明,ASC是缺省. 我们还可以声明一个排序操作符来实现排序。ASC等效于使用'<'而DESC等效于使用>'。在一个域里,空值排序时排在其它数值前面.换句话说,升序排序时,空值排在末尾,而降序排序时空值排在开头.UNION子句 ?1 table_query UNION ALL table_query2 ORDER BY expression ASC | DESC | USING operator ,.3 LIMIT

20、count | ALL OFFSET | , start 这里table_query表明任何没有 ORDER BY , FOR UPDATE ,或者LIMIT 子句的选择表达式.(如果用圆括弧包围,ORDER BY和LIMIT 可以放在子表达式里.如果没有圆括弧, 这些子句将交给 UNION的结果使用,而不是给它们右手边的输入表达式.)UNION操作符的结果集是那些涉及到的所有查询所返回结果的集合。两个做为UNION直接操作数的SELECT必须生成相同数目的字段,并且对应的字段必须有兼容的数据类型。缺省地,UNION的结果不包含任何重复的行,除非声明了 ALL子句.ALL制止了消除重复的动作.

21、同一 SELECT语句中的多个 UNION操作符是从左向右计算的,除非用圆括弧进行了标识).目前,FOR UPDATE不能在UNION的结果或输入中声明.INTERSECT 子句 ?1 table_query INTERSECT ALL table_query2 ORDER BY expression ASC | DESC | USING operator ,.3 LIMIT count | ALL 4 OFFSET start 这里table_query声明任何没有 ORDER BY , FOR UPDATE ,或者 LIMIT 子句的选择表达式。INTERSECT类似UNION ,只不过它

22、给出在两个查询中都出现的行,而不是两个查询的所有行.INTERSECT的结果不包含任何重复行,除非你声明了ALL选项.用了 ALL以后,一个在 L里有m个重复而在 R里有n个重复 的行将出现 min(m,n)次.除非用圆括号指明顺序, 同一 SELECT语句中的多个INTERSECT操作符是从左向右计算的。 INTERSECT 比UNION 绑定得更紧 -也就是说 A UNION B INTERSECT C 将读做 A UNION (B INTERSECT C),除非你用 圆括弧声明.EXCEPT子句 ?1 table_query EXCEPT ALL table_query2 ORDER B

23、Y expression ASC | DESC | USING operator ,.3 LIMIT count | ALL 4 OFFSET start 这里table_query声明任何没有 ORDER BY , FOR UPDATE ,或者 LIMIT 子句的选择表达式。EXCEPT类似于 UNION ,只不过 EXCEPT给出存在于左边查询输出而不存在于右边查询输出的行。EXCEPT的结果不包含任何重复的行,除非声明了ALL选项. 使用ALL时,一个在 L中有 m个重复而在R中有n个重复的行 将出现 max(m-n,0)次.除非用圆括弧指明顺序,同一 SELECT语句中的多个 EXCE

24、PT操作符是从左向右计算的。EXCEPT和UNION绑定级别相同.LIMIT 子句LIMIT count | ALL OFFSET start 这里count声明返回的最大行数,而 start声明开始返回行之前忽略的行数。LIMIT允许你检索由查询其他部分生成的行的某一部分。如果给出了限制计数,那么返回的行数不会超过哪个限制。 如果给出了一个偏移量,那么开始返回行之前会忽略那个数量的行。在使用LIMIT 时,一个好习惯是使用一个 ORDER BY子句把结果行限制成一个唯一的顺序。否则你会得到无法预料的查询返回的子集 -你可能想要第十行到第二十行,但以什么顺序?除非你声明 ORDER BY ,否

25、则你不知道什么顺序。从PostgreSQL 7.0开始, 查询优化器在生成查询规划时把LIMIT 考虑进去了,所以你很有可能因给出的LIMIT 和OFFSET值不同而得到不同的 规划(生成不同的行序)。因此用不同的 LIMIT/OFFSET 值选择不同的查询结果的子集将不会产生一致的结果,除非你用ORDER BY强制生成一个可预计的结果顺序。这可不是毛病;这是 SQL生来的特点,因为除非用了ORDER BYE约束顺序,SQL不保证查询生成的结果有任何特定的顺序。用法将表films和表 distributors连接在一起: ?1 SELECT f.title, f.did, , f.

26、date_prod, f.kind2 FROM distributors d, films f3 WHERE f.did = d.did45 title | did | name | date_prod | kind6+-+7 The Third Man | 101 | British Lion | 1949-12-23 | Drama8 The African Queen | 101 | British Lion | 1951-08-11 | Romantic9Une Femme est une Femme | 102 | Jean Luc Godard | 1961-03-12 | Rom

27、antic10Vertigo | 103 | Paramount | 1958-11-14 | Action11Becket | 103 | Paramount | 1964-02-03 | Drama1248 Hrs | 103 | Paramount | 1982-10-22 | Action131415161718192021222324?12345678910?12345678910?12345678War and Peace | 104 | Mosfilm | 1967-02-12 | DramaWest Side Story | 105 | United Artists | 196

28、1-01-03 | MusicalBananas | 105 | United Artists | 1971-07-13 | ComedyYojimbo | 106 | Toho | 1961-06-16 | DramaThere's a Girl in my Soup | 107 | Columbia | 1970-06-11 | ComedyTaxi Driver | 107 | Columbia | 1975-05-15 | ActionAbsence of Malice | 107 | Columbia | 1981-11-15 | ActionStoria di una do

29、nna | 108 | Westward | 1970-08-15 | Romantic The King and I | 109 | 20th Century Fox | 1956-08-11 | Musical Das Boot | 110 | Bavaria Atelier | 1981-11-11 | Drama Bed Knobs and Broomsticks | 111 | Walt Disney | | Musical (17 rows)统计用kind分组的所有电影和组的列 /字段的len (长度)的和:SELECT kind, SUM(len) AS total FROM f

30、ilms GROUP BY kind;kind | total +Action | 07:34Comedy | 02:58Drama | 14:28Musical | 06:42Romantic | 04:38 (5 rows)5小时的组总和:统计所有电影(films),组的列/字段len (长度)的和,用 kind分组并且显示小于SELECT kind, SUM(len) AS total FROM filmsGROUP BY kindHAVING SUM(len) < INTERVAL '5 hour'kind | total+Comedy | 02:58Romant

31、ic | 04:38 (2 rows)下面两个例子是根据第二列(name)的内容对单独的结果排序的经典的方法:SELECT * FROM distributors ORDER BY name;SELECT * FROM distributors ORDER BY 2;did | name+109 | 20th Century Fox110 | Bavaria Atelier101 | British Lion9107101021111312104131031410615105161111711218108ColumbiaJean Luc GodardLuso films Mosfilm Par

32、amountTohoUnited ArtistsWalt Disney Warner Bros.Westward19(13 rows)这个例子演示如何获得表distributors和actors的连接,只将每个表中以字母W开头的取出来.因为只取了不相关的行,所以关键字ALL被省略了:1 distributors: actors:2 did | name id | name3 -+4 108 | Westward 1 | Woody Allen5 111 | Walt Disney 2 |WarrenBeatty6 112 | Warner Bros. 3| WalterMatthau7. .8

33、9 SELECT 10 FROM distributors11 WHERE LIKE 'W%'12 UNION13 SELECT 14 FROM actors15 WHERE LIKE 'W%'1617 name18 19 Walt Disney20 Walter Matthau21 Warner Bros.22 Warren Beatty23 Westward24 Woody Allen兼容性扩展PostgreSQL允许我们在一个查询里省略FRO

34、M子句。这个特性是从最初的PostQuel查询语言里保留下来的它的最直接用途就是计算简单的常量表达式的结果:SELECT 2+2;?column?4其它有些 DBMS不能这么做,除非引入一个单行的伪表做select的from.这个特性的另外一个不太明显的用途是把一个普通的从一个或多个表的select缩写:SELECT distributors.* WHERE = 'Westward'did | name108 | Westward这样也可以运行是因为我们给查询中引用了但没有在FROM中提到的每个表都加了一个隐含的FROM项.尽管这是个很方便的

35、写法,但它却容易误用.比如,下面的查询SELECT distributors.* FROM distributors d; 可能就是个错误;用户最有可能的意思是SELECT d.* FROM distributors d;而不是下面的他实际上得到的无约束的连接SELECT distributors.* FROM distributors d, distributors distributors;为了帮助检测这种错误,PostgreSQL 7.1以及以后的版本将在你使用一条即有隐含FROM特性又有明确的FORM子句的查询的时候给出警告.SQL92SELECT子句在SQL92规范里, 可选的关键字

36、 "AS"是多余的,可以忽略掉而不对语句产生任何影响.PostgreSQL分析器在重命名列/字段时需要这个关键字,因为类型扩展的特性会导致上下文语意不清.不过,"AS"在FROM项里是可选的.DISTINCT ON 语法不是 SQL92的标准。LIMIT 和 OFFSET 也不是。在SQL92里,一个ORDER BY 子句只可以使用在结果列名称或者序号上,而GROUP BY 子句只能用于输入列/字段上.PostgreSQL把这两个子句都扩展为允许另一种选择(但是如果出现冲突则使用标准的解 释).PostgreSQL还允许两个子句声明任意的表达式.请注意,

37、在表达式里出现的名称将总是被当做输入列/字段的名称,而不是结果列/字段名称.?1UNION/INTERSECT/EXCE哂2 SQL92 的 UNION/INTERSECT/EXCEPT 法允许一个附力口的 CORRESPONDING EK:345 table_query UNION ALL6 CORRESPONDING BY (column ,.)7 table_queryCORRESPONDING BY 目前还不被 PostgreSQL 支持.SQL 语句(inner join,left out join,right out join 三者的不同用法)jion 语句有三种, inner j

38、oin, left outer join 和 right outer join 者B可以简写,分别为 jion,left join,right jion 。jion语句可以用来组合两个表中的记录,只要在公共字段之中有相符的值即可,该语句联合两个表查询得到的结果是可以添加新的数据,可以把它看成将两个具有相关内容的表联接在一起新生成的表,而一般的select语句没有这个功能。1) 内连接,inner join . on语句格式:FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号)INNER JOIN 表3 ON 表1.字段号=表3.字段号)INNER JOIN 表 4

39、ON Member.字段号=表 4.字段号)INNER JOIN 表 XON Member.字段号=表X.字段号例子:?1 SELECT *23 FROM (Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER J( 45 INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JO67 ORDER BY MemberDate DESC内连接的功能是,把两个表相关联的记录列

40、出来,必须是相关联的记录。2)左外连接,left outer join . on语句格式:FROM 表名 1 LEFT JOIN 表名 2ON 表名1.字段A关系运算符表名2.字段B其实LEFT JOIN的功能就是将LEFT左边的表名1中的所有记录全部保留,而将右边的表名2中的字段B与表名1.字段A相对应的记录显示出来(当使用SELECT *时)。而RIGHT JOIN和LEFT JOIN 相反。外连接的功能是,把 LEFT左边的表中的所有记录保留,而右边表只保留相关联的记录,也就是先执行一次INNER JOIN,然后把LEFT左边的表中的与右边表没有任何关联的记录也保留,而右边表的字段为nu

41、ll.使用左向外联接假设在city列上联接authors表和publishers表。结果只显示在出版商所在城市居住的作者(本例中为AbrahamBennet 和 Cheryl Carson)。若要在结果中包括所有的作者,而不管出版商是否住在同一个城市,请使用SQL-92左向外联接。下面是Transact-SQL左向外联接的查询和结果:?1 USE pubs2 SELECT a.au_fname, a.au_lname, p.pub_name3 FROM authors a LEFT OUTER JOIN publishers p4 ON a.city = p.city5 ORDER BY p.

42、pub_name ASC, a.au_lname ASC, a.au_fname ASC【也就是先把authors表中的所有数据列出,由于 authors表中没有pub_name字段,所以为null 下面是结果集:?1 au_fname au_lname pub_name2 3 Reginald Blotchet-Halls NULL4 Michel DeFrance NULL5 Innes del Castillo NULL6 Ann Dull NULL7 Marjorie Green NULL8 Morningstar Greene NULL9 Burt Gringlesby NULL10

43、 Sheryl Hunter NULL11 Livia Karsen NULL12 Charlene Locksley NULL13 Stearns MacFeather NULL14 Heather McBadden NULL15 Michael O'Leary NULL16 Sylvia Panteley NULL17 Albert Ringer NULL18 Anne Ringer NULL19 Meander Smith NULL20 Dean Straight NULL21 Dirk Stringer NULL22 Johnson White NULL23 Akiko Yok

44、omoto NULL24 Abraham Bennet Algodata Infosystems25 Cheryl Carson Algodata Infosystems2627(23 row(s) affected)不管是否与 publishers表中的city列匹配,LEFT OUTER JOIN 均会在结果中包含 authors表的所有行。注意:结果中所列的大多数作者都没有相匹配的数据,因此,这些行的pub_name列包含空值。3) 右外连接,right outer join . on与left join左右相反。假设在city列上联接authors表和publishers表。结果只显示

45、在出版商所在城市居住的作者(本例中为Abraham Bennet 和 Cheryl Carson) 。 SQL-92 右向外联接运算符RIGHT OUTER JOIN 指明:不管第一个表中是否有匹配的数据,结果将包含第二个表中的所有行。若要在结果中包括所有的出版商,而不管城市中是否还有出版商居住,请使用SQL-92右向外联接。下面是Transact-SQL右向外联接的查询和结果:?1 USE pubs2 SELECT a.au_fname, a.au_lname, p.pub_name3 FROM authors AS a RIGHT OUTER JOIN publishers AS p4 O

46、N a.city = p.city5 ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC下面是结果集:?1 au_fname au_lname pub_name2 3 Abraham Bennet Algodata Infosystems4 Cheryl Carson Algodata Infosystems5 NULL NULL Binnet & Hardley6 NULL NULL Five Lakes Publishing7 NULL NULL GGG&G8 NULL NULL Lucerne Publishin

47、g9 NULL NULL New Moon Books10 NULL NULL Ramona Publishers11 NULL NULL Scootney Books1213(9 row(s) affected)使用谓词(如将联接与常量比较)可以进一步限制外联接。 下例包含相同的右向外联接,但消除销售量低于 50本的书籍的书名:?1 USE pubs2 SELECT s.stor_id, s.qty, t.title3 FROM sales s RIGHT OUTER JOIN titles t4 ON s.title_id = t.title_id5 AND s.qty > 506

48、ORDER BY s.stor_id ASC4)全连接,full join . on(不常使用,只能用于 outer)功能结合了以上三种联军,先执行一次inner join,然后把两个表的多余字段都保留,但连接的对应字段为null.如果想将几个表联接起来,在JOIN操作中我们可以进行嵌套操作,有三个表:表 1、表2、表3,现在将三个表联接起来:FROM (表1 INNER JOIN 表2 ON 表1.序号=表2.序号)INNER JOIN 表3 ON 表1.序号=表3.序号使用完整外部联接若要通过在联接结果中包括不匹配的行保留不匹配信息,请使用完整外部联接。Microsoft? SQL Server? 2000提供完整外部联接运算符 FULL OUTER JOIN ,不管另一个表是否有匹配的值,此运算符都包括两个表中的所有行。假设在city列上联接authors表和publishers表。结果只显示在出版商所在城市居住的作者(本例中为 Abraham Bennet 和 Cheryl Carson) 。 SQL-92 FULL OUTER JOIN 运算符指明:不管表中是否有匹配的数据,结果将包括两个表中的所有行。若要在结果中包括所有作者和出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论