【例6.28】在样例数据库pubs中查询在同一城市的出版社和作者的信息
USE pubs
SELECT p.pub_name,p.city,a.au_fname,a.au_lname
FROM publishers AS p INNER JOIN authors AS a ON p.city = a.city
ORDER BY pub_name
运行结果:
pub_name city au_fname au_lname
---------------------------------------- -------------------------
Algodata Infosystems Berkeley Cheryl Carson
Algodata Infosystems Berkeley Abraham Bennet
(所影响的行数为 2 行)
此例中,出版社信息与作者信息在两个不同的表中,要查询在同一城市的出版社和作者的信息,需从两个表中查询数据,这里使用了内连接查询到了所需的数据。从查询结果来看,不符连接条件的记录都被丢弃了,只留下两条符合条件的记录。在内连接中,连接的结果是从两个表的组合中挑选出符合连接条件的数据,如果数据无法满足连接条件则将其丢弃。此例中,在连接条件中使用了“=”运算符,当然还可以使用前面提到的其它运算符。
【例6.29】在样例数据库pubs的authors表中查询有相同邮政编码的作者。
USE pubs
SELECT a1.au_fname,a1.au_lname,a1.zip
FROM authors AS a1 INNER JOIN authors AS a2 ON a1.zip = a2.zip
WHERE a1.au_id<>a2.au_id
ORDER BY a1.zip
运行结果:
au_fname au_lname zip
-------------------- -------------------
Albert Ringer 84152
Anne Ringer 84152
Sheryl Hunter 94301
Ann Dull 94301
Dean Straight 94609
Livia Karsen 94609
Dirk Stringer 94609
Livia Karsen 94609
Dean Straight 94609
Dirk Stringer 94609
Abraham Bennet 94705
Cheryl Carson 94705
(所影响的行数为 12 行)
此例属于自连接查询,此查询涉及authors表与其自身的连接,因此authors表以两种角色出显示。要区分这两个角色,必须在FROM子句中为authors表提供两个不同的别名(a1 和a2)。WHERE a1.au_id<>a2.au_id子句是为了防止作者与自身匹配,而在查询结果中出现相同的行。
【例6.30】在样例数据库pubs中,对表publishers和authors以city列值相等为条件做左外连接查询。
USE pubs
SELECT p.pub_name,p.city,a.au_fname,a.au_lname
FROM publishers AS p LEFT OUTER JOIN authors AS a ON p.city = a.city
ORDER BY pub_name
运行结果:
pub_name city au_fname au_lname
---------------------------------------- --------------------
Algodata Infosystems Berkeley Cheryl Carson
Algodata Infosystems Berkeley Abraham Bennet
Binnet & Hardley Washington NULL NULL
Five Lakes Publishing Chicago NULL NULL
GGG&G M黱chen NULL NULL
Lucerne Publishing Paris NULL NULL
New Moon Books Boston NULL NULL
Ramona Publishers Dallas NULL NULL
Scootney Books New York NULL NULL
(所影响的行数为 9 行)
此例中,使用了左外连接查询,所以连接左边的publisher表的所有记录都显示出来了,尽管publishers有些记录在从表中没与连接条件匹配的项。不匹配的行相对应的从表的行的列位置被填上NULL值
【例6.31】在样例数据库pubs中,对表publishers和authors以city列值相等为条件做右外连接查询。
USE pubs
SELECT p.pub_name,p.city,a.au_fname,a.au_lname
FROM publishers AS p RIGHT OUTER JOIN authors AS a ON p.city = a.city
ORDER BY pub_name
运行结果:
pub_name city au_fname au_lname
---------------------------------------- -------------------- ---
NULL NULL Johnson White
NULL NULL Marjorie Green
NULL NULL Michael O'Leary
...
...
NULL NULL Anne Ringer
NULL NULL Albert Ringer
Algodata Infosystems Berkeley Abraham Bennet
Algodata Infosystems Berkeley Cheryl Carson
(所影响的行数为 23 行)
此例中,使用了右外连接查询,所以连接右边的authors表的所有记录都显示出来了,尽管authors表中有些记录在从表中没与连接条件匹配的项。不匹配的行相对应的从表的行的列位置被填上NULL值
【例6.32】在样例数据库pubs中,对表publishers和authors以city列值相等为条件做全连接查询。
USE pubs
SELECT p.pub_name,p.city,a.au_fname,a.au_lname
FROM publishers AS p FULL OUTER JOIN authors AS a ON p.city = a.city
ORDER BY pub_name
运行结果:
pub_name city au_fname au_lname
---------------------------------------- -------------------- --
NULL NULL Johnson White
NULL NULL Marjorie Green
NULL NULL Michael O'Leary
...
...
NULL NULL Anne Ringer
NULL NULL Albert Ringer
Algodata Infosystems Berkeley Abraham Bennet
Algodata Infosystems Berkeley Cheryl Carson
Binnet & Hardley Washington NULL NULL
Five Lakes Publishing Chicago NULL NULL
GGG&G M黱chen NULL NULL
..,
..,
Ramona Publishers Dallas NULL NULL
Scootney Books New York NULL NULL
(所影响的行数为 30 行)
此例中,使用了全外连接查询,所以连接两边publishers和authors表的所有记录都显示出来了,尽管authors和authors表中有些记录在另一个表中没与连接条件匹配的项。不匹配的行相对应的另一个表的行的列位置被填上NULL值
【例6.33】在样例数据库pubs中,对表publishers和authors做交叉查询。
USE pubs
SELECT pub_name,au_fname,au_lname
FROM publishers CROSS JOIN authors
ORDER BY au_lname
查询结果包含184行,即publishers表的行数8乘以authors表的行数23。其查询结果是publisers表的每一行与authors表的每一行匹配。
注:如果交叉连接带有WHERE 子句,则交叉连接的作用将同内连接一样。