表A 表B
text KK
甲 1
乙 2
3
select * from A,B 为
甲 1
乙 1
甲 2
乙 2
甲 3
乙 3select * from B,A 为
1 甲
1 乙
2 甲
2 乙
3 甲
3 乙我觉得 select * from B,A 为
1 甲
2 乙
3 甲
1 乙
2 甲
3 乙
才对.
究竟 select * from B,A 他们发生了什么情况呢?还有的是 .select 是怎样查询的? 是 select 先?还是 from 先?我怎样都找不到这方面的知识.
谢谢了.
text KK
甲 1
乙 2
3
select * from A,B 为
甲 1
乙 1
甲 2
乙 2
甲 3
乙 3select * from B,A 为
1 甲
1 乙
2 甲
2 乙
3 甲
3 乙我觉得 select * from B,A 为
1 甲
2 乙
3 甲
1 乙
2 甲
3 乙
才对.
究竟 select * from B,A 他们发生了什么情况呢?还有的是 .select 是怎样查询的? 是 select 先?还是 from 先?我怎样都找不到这方面的知识.
谢谢了.
insert into @a
select N'甲'
union all select N'乙'declare @b table(kk int)
insert into @b
select 1 union all select 2 union all select 3select * from @a ,@b
/*
x kk
---------- -----------
甲 1
乙 1
甲 2
乙 2
甲 3
乙 3
*/
select * from @b, @a
/*
kk x
----------- ----------
1 甲
2 甲
3 甲
1 乙
2 乙
3 乙*/
select @@version
/*--------------------------------------------------------
Microsoft SQL Server 2005 - 9.00.3159.00 (Intel X86)
Mar 23 2007 16:15:11
Copyright (c) 1988-2005 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
(1 row(s) affected)*/
给实际例子declare @a table(data varchar(2))
declare @b table(data int)
insert into @a
select '甲'
union select '乙'
insert into @b
select 1
union select 2
union select 3
select * from @a,@b
select * from @b,@adata data
---- -----------
甲 1
乙 1
甲 2
乙 2
甲 3
乙 3
data data
----------- ----
1 甲
2 甲
3 甲
1 乙
2 乙
3 乙declare @a table(data varchar(2) primary key)
declare @b table(data int)
insert into @a
select '甲'
union select '乙'
insert into @b
select 1
union select 2
union select 3
select * from @a,@b
select * from @b,@adata data
---- -----------
甲 1
乙 1
甲 2
乙 2
甲 3
乙 3
data data
----------- ----
1 甲
1 乙
2 甲
2 乙
3 甲
3 乙
create table #2(b int)
insert into #1 values('次')
insert into #1 values('亜')
insert into #2 select 1
union all select 2
union all select 3select * from #1,#2
a b
次 1
亜 1
次 2
亜 2
次 3
亜 3
select * from #2,#1
b a
1 次
1 亜
2 次
2 亜
3 次
3 亜select * from #1,#2 order by b,a
a b
亜 1
次 1
亜 2
次 2
亜 3
次 3select * from #2,#1 order by b,a
b a
1 亜
1 次
2 亜
2 次
3 亜
3 次select * from #1,#2 order by a,b
a b
亜 1
亜 2
亜 3
次 1
次 2
次 3select * from #2,#1 order by a,b
b a
1 亜
2 亜
3 亜
1 次
2 次
3 次
结果
甲 1
乙 1
甲 2
乙 2
甲 3
乙 3没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小.
这样理解输出结果
(1)逐行扫描表A的中的每条记录
(2)对于表A的每条记录,逐行扫描表B的每条记录
(3)将表A的当前扫描行和表B的当前扫描行添加到记录集中
(4)继续扫描表B的下一行,重复(3),(4),直到扫描完表B的所有记录
(5)继续继续扫描表A的下一行,重复(2),(5),直到扫描完表A的所有记录
select * from B,A则先扫描表B
结果
1 甲
1 乙
2 甲
2 乙
3 甲
3 乙
(1)扫描B表第一行得到1
(2)对于B中KK=1扫描依次扫描A中的所有记录得到
1 甲
1 乙
(3)再扫描B的下一行,针对下一行再扫面A所有记录
...
按照我上面写的自己多琢磨琢磨就懂了,很简单的
1 甲
1 乙
2 甲
2 乙
3 甲
3 乙 我觉得 select * from B,A 为
1 甲
2 乙
3 甲
1 乙
2 甲
3 乙
才对.
究竟 select * from B,A 他们发生了什么情况呢? 应该先B表查出1然后连接A表所有字段 甲乙 然后在查2然后甲乙 所以你看到的是1 甲
1 乙
2 甲
2 乙
3 甲
3 乙
text KK
甲 1
乙 2
3
(1)扫描A表第一行得到'甲'
(2)对于A中text = '甲',依次扫描B中的所有记录得到
甲 1
甲 2
甲 3
(3)再扫描A的下一行,针对下一行再扫面B所有记录
.....