oracle查询多表连接语句怎么写,Oraclejoin多表查询join(连接)是⼀个查询,它将来⾃两个或多个表、视图的数据组合在⼀起。
我通过⼀些⽰例来向⼤家介绍join的常⽤⽅法。
⼀、⽣成测试数据
1、创建超⼥基本信息历史表(T_GIRL_HIS)create table T_GIRL_HIS
(
id char(4) not null, -- 编号
name varchar2(10) not null, -- 姓名
yz varchar2(10) null, -- 颜值
sc varchar2(10) null, -- ⾝材
weight number(4,1) not null, -- 体重
height number(3) not null, -- ⾝⾼
birthday date not null, -- 出⽣时间
memo varchar2(1000) null, -- 备注
primary key(id)
);
insert into T_GIRL_HIS(id,name,yz,birthday,sc,weight,height,memo)
values('0101','西施_H','漂亮',to_date('2000-01-01 01:12:35','yyyy-mm-dd hh24:mi:ss'),
'⽕辣',48.5,170,'这是⼀个⾮常漂亮姑娘,⽼公是夫差,男朋友是范蠡。');
insert into T_GIRL_HIS(id,name,yz,birthday,sc,weight,height,memo)
values('0102','貂禅_H','漂亮',to_date('1997-08-02 12:20:38','yyyy-mm-dd hh24:mi:ss'),
'苗条',45.2,168,'王允真不是男⼈,⼲不过董卓就把美⼈往⽕坑⾥推,千古罪⼈啊。');
insert into T_GIRL_HIS(id,name,yz,birthday,sc,weight,height,memo)
values('0103','妲已_H','漂亮',to_date('1998-03-03 10:50:33','yyyy-mm-dd hh24:mi:ss'),
'⽕辣',53.6,172,'如果商真的因我⽽亡,您们男⼈做什么去了?');
insert into T_GIRL_HIS(id,name,yz,birthday,sc,weight,height,memo)
values('0104','芙蓉_H','猪扒',to_date('1980-05-05 10:11:55','yyyy-mm-dd hh24:mi:ss'),
'膘肥体壮',85.8,166,'如果不努⼒学习技术,将来就会娶个芙蓉,哼哼。');
2、创建超⼥基本信息表(T_GIRL)create table T_GIRL
(
id char(4) not null, -- 编号
name varchar2(10) not null, -- 姓名
yz varchar2(10) null, -- 颜值
sc varchar2(10) null, -- ⾝材
weight number(4,1) not null, -- 体重
height number(3) not null, -- ⾝⾼
birthday date not null, -- 出⽣时间
memo varchar2(1000) null, -- 备注
primary key(id)
);
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0103','妲已','漂亮',to_date('1998-03-03 10:50:33','yyyy-mm-dd hh24:mi:ss'),
'⽕辣',53.6,172,'如果商真的因我⽽亡,您们男⼈做什么去了?');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0104','芙蓉','猪扒',to_date('1980-05-05 10:11:55','yyyy-mm-dd hh24:mi:ss'),
'膘肥体壮',85.8,166,'如果不努⼒学习技术,将来就会娶个芙蓉,哼哼。');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0105','神密猫⼥',null,to_date('1989-12-08 12:10:35','yyyy-mm-dd hh24:mi:ss'),sql left join 多表连接
null,48.5,171,'不知道是什么⼈,她脸上有⼀个%符号,很神密。');
3、测试数据说明
超⼥基本信息历史表(T_GIRL_HIS)中有4条记录,为了⽅便测试,每条记录的姓名后⾯加了_H的标志,超⼥基本信息表(T_GIRL)中有3条记录,姓名后没有加_H。
T_GIRL_HIS和T_GIRL通过id列关联起来,两个表中有相交的记录('0103'、'0104')。
⼆、join⽰例
连接(join)分为五种,内连接(inner join),左连接(left join),右连接(right join)、全连接(full join)和笛卡⼉乘积(cross join),常⽤的是内连接和左连接,其它的极少使⽤。
1、内连接(inner join)
列出多个表或记录连接字段的匹配记录,即A表和B表的交集。
内连接有三种写法,这三种写法的效果相同。
1)标准的写法。select T_GIRL.id,T_GIRL.name,T_GIRL.sc,,T_GIRL_HIS.id,T_GIRL_HIS.name
from T_GIRL inner join T_GIRL_HIS on T_GIRL.id=T_GIRL_HIS.id;
2)省略inner,和第1)种写法相⽐,只是省略了⼀个单词⽽已,没什么特别。
select T_GIRL.id,T_GIRL.name,T_GIRL.sc,,T_GIRL_HIS.id,T_GIRL_HIS.name
from T_GIRL join T_GIRL_HIS on T_GIRL.id=T_GIRL_HIS.id;
3)还有⼀种写法。select T_GIRL.id,T_GIRL.name,T_GIRL.sc,,T_GIRL_HIS.id,T_GIRL_HIS.name from T_GIRL,T_GIRL_HIS where T_GIRL.id=T_GIRL_HIS.id;
2、左连接(left join)
列出左边(A)表全部的,及右边(B)表符合条件的,不符合条件的以空值代替,记录总数为A表的记录数。
左连接有两种写法,这两种写法的效果相同。
1)标准的写法。select T_GIRL.id,T_GIRL.name,T_GIRL.sc,,T_GIRL_HIS.id,T_GIRL_HIS.name from T_GIRL left join T_GIRL_HIS on T_GIRL.id=T_GIRL_HIS.id;
2)采⽤(+),Oracle特有的写法,其它数据库不⽀持,注意(+)的位置,在右边字段后⾯。
select T_GIRL.id,T_GIRL.name,T_GIRL.sc,,T_GIRL_HIS.id,T_GIRL_HIS.name
from T_GIRL,T_GIRL_HIS where T_GIRL.id=T_GIRL_HIS.id(+);
3、右连接(right join)
列出右边(B)表全部的,及左边(A)表符合条件的,不符合条件的以空值代替,记录总数为B表的记录数。
右连接有两种写法,这两种写法的效果相同。
1)标准的写法。select T_GIRL.id,T_GIRL.name,T_GIRL.sc,,T_GIRL_HIS.id,T_GIRL_HIS.name from T_GIRL right join T_GIRL_HIS on T_GIRL.id=T_GIRL_HIS.id;
2)采⽤(+),Oracle特有的写法,其它数据库不⽀持,注意(+)的位置,在左边字段后⾯。
select T_GIRL.id,T_GIRL.name,T_GIRL.sc,,T_GIRL_HIS.id,T_GIRL_HIS.name
from T_GIRL,T_GIRL_HIS where T_GIRL.id(+)=T_GIRL_HIS.id;
右连接其实就是把左连接换个顺序书写,和左连接没有任何本质的区别。
4、全连接(full join)
列出右边(B)表全部的,及左边(A)表全部的,不符合条件的以空值代替,记录总数为A表与B表的记录数之和再减相交的记录数。
select T_GIRL.id,T_GIRL.name,T_GIRL.sc,,T_GIRL_HIS.id,T_GIRL_HIS.name
from T_GIRL full join T_GIRL_HIS on T_GIRL.id=T_GIRL_HIS.id;
5、笛卡⼉乘积(cross join)
笛卡⼉乘积连接,不加任何条件,记录总数为两个表相乘。
笛卡⼉乘积连接有两种写法,这两种写法的效果相同。
select T_GIRL.id,T_GIRL.name,T_GIRL.sc,,T_GIRL_HIS.id,T_GIRL_HIS.name
from T_GIRL cross join T_GIRL_HIS;select T_GIRL.id,T_GIRL.name,T_GIRL.sc,,T_GIRL_HIS.id,T_GIRL_HIS.name
from T_GIRL,T_GIRL_HIS;
三、应⽤经验
在实际开发中,内连接(inner join)和左连接(left join)经常使⽤,右连接(right join)和左连接本质上是同⼀回事,全连接(full join)和笛卡⼉乘积(cross join)极少使⽤。
1、尽可能简单化SQL语句
SQL语句⾮常强⼤,强⼤到很容易把⼈搞晕,例如多表操作,有经验的程序员也很难应⽤⾃如。我极⼒反对过于复杂的SQL语句,复杂的SQL语句并不见得能体现程序员的⽔平,更像给⾃⼰和别⼈挖坑,合理的表结构设计不会让查询的SQL太复杂。
2、⼦查询与join
1)join和⼦查询都可以操作多个表,join和⼦查询的区别是:join可以合并多个表的数据,⽽⼦查询的数据只能来⾃⼀个表,⼦查询的结果集⽤于嵌⼊SQL中。
2)有的查询语句既可以使⽤⼦查询,也可以使⽤join。如果使⽤⼦查询,可以将⼀个复杂的查询分解为⼀系列的步骤,条理清晰;但使⽤join有执⾏速度快的优点。
3)⽤join能实现的功能⽤⼦查询都可以实现,但不是所有⼦查询都能⽤join替换,⼦查询⽐较灵活,⽅便,形式多样,⽽join更适合查询多表的数据。
4)如果表的数据量⽐较⼩,建议采⽤⼦查询,如果数据量⽐较⼤,建议采⽤join,但是具体情况具体分析,多尝试⽤PL/SQL Developer软件提供的explain plan分析SQL语句的性能。
四、版权声明
C语⾔技术⽹原创⽂章,转载请说明⽂章的来源、作者和原⽂的链接。
作者:码农有道
如果⽂章有错别字,或者内容有错误,或其他的建议和意见,请您指正,⾮常感谢
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论