链接查询
经过链接运算符能够实现多个表查询。链接是关系数据库模型的主要特色,也是它区别于其它类型数据库管理系统的一个标志。
在关系数据库管理系统中,表创建时各数据之间的关系没必要肯定,常把一个实体的全部信息存放在一个表中。当检索数据时,经过链接操做查询出存放在多个表中的不一样实体的信息。链接操做给用户带来很大的灵活性,他们能够在任什么时候候增长新的数据类型。为不一样实体建立新的表,尔后经过链接进行查询。
链接能够在SELECT 语句的FROM子句或WHERE子句中创建,似是而非在FROM子句中指出链接时有助于将链接操做与WHERE子句中的搜索条件区分开来。因此,在Transact-SQL中推荐使用这种方法。
SQL-92标准所定义的FROM子句的链接语法格式为:
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出参与链接操做的表名,链接能够对同一个表操做,也能够对多表操做,对同一个表操做的链接又称作自链接。
join_type 指出链接类型,可分为三种:内链接、外链接和交叉链接。内链接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操做,并列出这些表中与链接条件相匹配的数据行。根据所使用的比较方式不一样,内链接又分为等值链接、天然链接和不等链接三种。
外链接分为左外链接(LEFT OUTER JOIN或LEFT JOIN)、右外链接(RIGHT OUTER JOIN或RIGHT JOIN)和全外链接(FULL OUTER JOIN或FULL JOIN)三种。与内链接不一样的是,外链接不仅列出与链接条件相匹配的行,而是列出左表(左外链接时)、右表(右外链接时)或两个表(全外链接时)中全部符合搜索条件的数据行。
交叉链接(CROSS JOIN)没有WHERE 子句,它返回链接表中全部数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
链接操做中的ON (join_condition) 子句指出链接条件,它由被链接表中的列和比较运算符、逻辑运算符等构成。
不管哪一种链接都不能对text、ntext和image数据类型列进行直接链接,但能够对这三种列进行间接链接。例如:
SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
(一)内链接
内链接查询操做列出与链接条件匹配的数据行,它使用比较运算符比较被链接列的列值。内链接分三种:
一、等值链接:在链接条件中使用等于号(=)运算符比较被链接列的列值,其查询结果中列出被链接表中的全部列,包括其中的重复列。
二、不等链接: 在链接条件使用除等于运算符之外的其它比较运算符比较被链接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
三、天然链接:在链接条件中使用等于(=)运算符比较被链接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除链接表中的重复列。
例,下面使用等值链接列出authors和publishers表中位于同一城市的做者和出版社:
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用天然链接,在选择列表中删除authors 和publishers 表中重复列(city和state):
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二)外链接
内链接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和链接条件的行。而采用外链接时,它返回到查询结果集合中的不只包含符合链接条件的行,并且还包括左表(左外链接时)、右表(右外链接时)或两个边接表(全外链接)中的全部数据行。
以下面使用左外链接将论坛内容和做者信息链接起来:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外链接将city表中的全部做者以及user表中的全部做者,以及他们所在的城市:
SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(三)交叉链接
交叉链接不带WHERE 子句,它返回被链接的两个表全部数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉链接检索到的记录数将等
于6*8=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type html
转自:http://topic.csdn.net/t/20060809/09/4936637.html sql
12 楼aw511(点点星灯)回复于 2006-08-22 09:13:42 得分 0 --查询分析器中执行: 数据库
--建表table1,table2:
create table table1(id int,name varchar(10))
create table table2(id int,score int)
insert into table1 select 1,'lee'
insert into table1 select 2,'zhang'
insert into table1 select 4,'wang'
insert into table2 select 1,90
insert into table2 select 2,100
insert into table2 select 3,70
如表
-------------------------------------------------
table1|table2|
-------------------------------------------------
idname|idscore|
1lee|190|
2zhang|2100|
4wang|370|
-------------------------------------------------
如下均在查询分析器中执行
1、外链接
1.概念:包括左向外联接、右向外联接或完整外部联接
2.左链接:left join 或 left outer join
(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的全部行,而不单单是联接列所匹配的行。若是左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的全部选择列表列均为空值(null)。
(2)sql语句
select * from table1 left join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
------------------------------
注释:包含table1的全部子句,根据指定条件返回table2相应的字段,不符合的以null显示
3.右链接:right join 或 right outer join
(1)右向外联接是左向外联接的反向联接。将返回右表的全部行。若是右表的某行在左表中没有匹配行,则将为左表返回空值。
(2)sql语句
select * from table1 right join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
NULLNULL370
------------------------------
注释:包含table2的全部子句,根据指定条件返回table1相应的字段,不符合的以null显示
4.完整外部联接:full join 或 full outer join
(1)完整外部联接返回左表和右表中的全部行。当某行在另外一个表中没有匹配行时,则另外一个表的选择列表列包含空值。若是表之间有匹配行,则整个结果集行包含基表的数据值。
(2)sql语句
select * from table1 full join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
NULLNULL370
------------------------------
注释:返回左右链接的和(见上左、右链接)
2、内链接
1.概念:内联接是用比较运算符比较要联接列的值的联接
2.内链接:join 或 inner join
3.sql语句
select * from table1 join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
------------------------------
注释:只返回符合条件的table1和table2的列
4.等价(与下列执行效果相同)
A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 cross join table2 where table1.id=table2.id (注:cross join后加条件只能用where,不能用on)
3、交叉链接(彻底)
1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉链接产生3*3=9条记录)
2.交叉链接:cross join (不带条件where...)
3.sql语句
select * from table1 cross join table2
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang190
4wang190
1lee2100
2zhang2100
4wang2100
1lee370
2zhang370
4wang370
------------------------------
注释:返回3*3=9条记录,即笛卡尔积
4.等价(与下列执行效果相同)
A:select * from table1,table2 .net