[原] SQLITE 上 INNER JOIN,CROSS JOIN,FULL JOIN 的写法.

华芸智森 2011-10-27 02:08:47
加精

/*SQLITE 的各种连接的写法*/
/*SQLITE只提供一个 LEFT JOIN ,但有时有些特殊的情况,我们的确要用到 INNER JOIN,CROSS JOIN,FULL JOIN 等语句,怎么办?*/
/*其实,只要变通一下,SQLITE也可以写出这些连接的.看下面的例子:*/
/* */
/*不能按 F5 一起运行,要一段一段括起来运行,下面的 GO 只是个人习惯.*/

GO

/*定义两个测试表*/
CREATE TABLE test1(
intid int not null,
varname varchar(32) not null,
PRIMARY KEY (intid));

GO

CREATE TABLE test2(
intid int not null,
varname varchar(32) not null,
varremark varchar(64) null,
PRIMARY KEY (intid));

GO

/*在测试表中插入数据*/
insert into test1 values(1,'aaaa1');
insert into test1 values(2,'bbbb1');
insert into test1 values(3,'cccc1');

insert into test2 values(1,'aaaa2','2a');
insert into test2 values(2,'bbbb2','2b');
insert into test2 values(3,'cccc2','2c');
insert into test2 values(4,'dddd2','2d');
insert into test2 values(5,'eeee2','2e');
insert into test2 values(6,'ffff3','2f');

go


/*左连接和右连接可以互换*/
select t1.*,t2.* from test1 as t1 left join test2 as t2 on t2.[intid]=t1.intid;

/*执行结果*/
RecNo intid varname intid_1 varname_1 varremark
----- ----- ------- ------- --------- ---------
1 1 aaaa1 1 aaaa2 2a
2 2 bbbb1 2 bbbb2 2b
3 3 cccc1 3 cccc2 2c

go

/*相当于一个 INNER JOIN */
select t1.*,t2.* from test1 as t1 left join test2 as t2 on t2.[intid]=t1.intid where not t2.[intid] is null;

/*执行结果*/
RecNo intid varname intid_1 varname_1 varremark
----- ----- ------- ------- --------- ---------
1 1 aaaa1 1 aaaa2 2a
2 2 bbbb1 2 bbbb2 2b
3 3 cccc1 3 cccc2 2c

go

/*相当于交叉连接 cross join*/
SELECT T1.*,T2.* FROM TEST1 AS T1,TEST2 AS T2;

/*执行结果*/
RecNo intid varname intid_1 varname_1 varremark
----- ----- ------- ------- --------- ---------
1 1 aaaa1 1 aaaa2 2a
2 1 aaaa1 2 bbbb2 2b
3 1 aaaa1 3 cccc2 2c
4 1 aaaa1 4 dddd2 2d
5 1 aaaa1 5 eeee2 2e
6 1 aaaa1 6 ffff3 2f
7 2 bbbb1 1 aaaa2 2a
8 2 bbbb1 2 bbbb2 2b
9 2 bbbb1 3 cccc2 2c
10 2 bbbb1 4 dddd2 2d
11 2 bbbb1 5 eeee2 2e
12 2 bbbb1 6 ffff3 2f
13 3 cccc1 1 aaaa2 2a
14 3 cccc1 2 bbbb2 2b
15 3 cccc1 3 cccc2 2c
16 3 cccc1 4 dddd2 2d
17 3 cccc1 5 eeee2 2e
18 3 cccc1 6 ffff3 2f

go

/*相当于全连接 .full join */
select t1.*,t2.* from test1 as t1 left OUTER JOIN test2 as t2 on t2.[intid]=t1.intid
UNION ALL
select t1.*,t2.* from test2 as t2 left join test1 as t1 on t2.[intid]=t1.intid and t2.intid is null;

/*执行结果*/
RecNo intid varname intid_1 varname_1 varremark
----- ------ ------- ------- --------- ---------
1 1 aaaa1 1 aaaa2 2a
2 2 bbbb1 2 bbbb2 2b
3 3 cccc1 3 cccc2 2c
4 (null) (null) 1 aaaa2 2a
5 (null) (null) 2 bbbb2 2b
6 (null) (null) 3 cccc2 2c
7 (null) (null) 4 dddd2 2d
8 (null) (null) 5 eeee2 2e
9 (null) (null) 6 ffff3 2f
...全文
6280 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjlcao 2013-01-15
  • 打赏
  • 举报
回复
学习一下,谢谢
izard999 2011-10-31
  • 打赏
  • 举报
回复
学习,SQLITE还有很多需要完善的地方
gggkcb 2011-10-30
  • 打赏
  • 举报
回复
学习了,谢谢楼主
YHL27 2011-10-30
  • 打赏
  • 举报
回复
值得学习啊,sql
Sududdao 2011-10-29
  • 打赏
  • 举报
回复
谢谢,太有用了
zhtgzhtg 2011-10-29
  • 打赏
  • 举报
回复
学习,SQLITE还有很多需要完善的地方 谢谢
萧炎 2011-10-28
  • 打赏
  • 举报
回复
northcan 2011-10-28
  • 打赏
  • 举报
回复
正在WinCE嵌入式系统上的应用项目中使用Sqlite
非常小巧精美的数据库
感谢楼主分享
法尔我给他 2011-10-28
  • 打赏
  • 举报
回复
sqlite加密是我最关心的,不知道楼主有没有加密函数的实现?
yangyongaiwmm 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 mstop 的回复:]
/*SQLITE 的各种连接的写法*/
/*SQLITE只提供一个 LEFT JOIN ,但有时有些特殊的情况,我们的确要用到 INNER JOIN,CROSS JOIN,FULL JOIN 等语句,怎么办?*/
/*其实,只要变通一下,SQLITE也可以写出这些连接的.看下面的例子:*/
/* */
/*不能按 F5 一起运行,要一段一段括起来运行,下面的 GO 只是个人习……
[/Quote]

hj
dd4979590 2011-10-27
  • 打赏
  • 举报
回复
学习了,谢谢楼主
咿呀大河马 2011-10-27
  • 打赏
  • 举报
回复
床上等您 2011-10-27
  • 打赏
  • 举报
回复
gaogaogzw 2011-10-27
  • 打赏
  • 举报
回复
学习~~~
memoryshy 2011-10-27
  • 打赏
  • 举报
回复
我之前做过的项目中,full join 和cross join用的比较少喔,其他的连接查询,像left join,right join,inner join用的倒是挺多的~~~理解了,就能在适当的场合运用最适用的sql了,谢谢楼主分享
wwwwb 2011-10-27
  • 打赏
  • 举报
回复
学习,SQLITE还有很多需要完善的地方
ACMAIN_CHM 2011-10-27
  • 打赏
  • 举报
回复

2,209

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 其他数据库
社区管理员
  • 其他数据库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧