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'),

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.yz,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.yz,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.yz,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.yz,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.yz,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.yz,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.yz,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.yz,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.yz,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.yz,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语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net)

作者:码农有道

如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!

oracle 连多表查询语句,Oracle join多表查询相关推荐

  1. oracle查询100到200数据,100分数据库查询语句(ORACLE 11g)

    100分求一个数据库查询语句(ORACLE 11g) 一张表tabl1 如下: epqname             createtime                             e ...

  2. 关于oracle查询语句中like '%中文的%' 查询不到数据的问题

    关于oracle查询语句中like '%中文的%' 查询不到数据的问题 问题描述: 关于oracle查询语句中like '%中文的%' 查询不到数据的问题解决 起因: 在Windows10 系统环境下 ...

  3. java oracle分页查询语句_oracle分页查询语句,java得到分页查询语句的方法

    oracle分页查询语句 select * from ( select a.*, rownum rn from (select * from table_name) a where rownum &l ...

  4. JAVA中oracle分页语句,oracle分页查询语句,java得到分页查询语句的方法

    oracle分页查询语句 select * from ( select a.*, rownum rn from (select * from table_name) a where rownum &l ...

  5. mysql两张表联查更新语句_sql联合查询语句(两张表)

    展开全部 sql联合查询语句(两张e69da5e6ba9062616964757a686964616f31333365643662表)是: select A.ID,A.VALUE,A.TYPE,A.N ...

  6. mysql 伪表查询语句_MySQL数据库之select查询语句

    select查询语句 语法 select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制] ...

  7. mysql数据库查询语句过程_mysql(一) SQL查询语句执行过程

    mysql基础架构 示意图 首先 mysql  大概分为 server层 和 存储引擎层 两个部分, 引擎的架构模式是插件形式的,mysql支持多种引擎如 InnoDB.MyISAM.Memory 等 ...

  8. mysql 查询语句_SQL语言mysql基础查询语句

    单表查询.条件查询.查询并排序.限制结果查询.查询并排名.分组聚合查询.······ -- DQL操作,数据基本查询语言使用-------------------------------------- ...

  9. mysql分组查询和子查询语句_6.MySQL分组聚合查询,子查询

    自己的MySQL阅读笔记,持续更新,直到看书结束. 数据库技术可以有效帮助一个组织或者企业科学.有效的管理数据,也是现在很多企业招聘数据分析师的必备要求之一. 大家如果看过MySQL的书,也可以看我的 ...

  10. mysql 查询语句超时_解决SQL查询总是 超时已过期

    1.由于数据库设计问题造成SQL数据库新增数据时超时 症状: Microsoft OLE DB Provider for SQL Server 错误 '80040e31' ([ODBC SQL Ser ...

最新文章

  1. 很旧的航海手游java,10年经典!《黎明之海》手游开启航海回忆
  2. scrum in agile development
  3. 关于集体生活和个人生活的思考
  4. android微信朋友圈视频无法播放,微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?...
  5. Image inpainting 图像修补最新综述
  6. 精美商业计划书PPT模版大合集(共107份,900M)
  7. 【Python脚本进阶】2.4、conficker蠕虫(上):Metasploit攻击Windows SMB服务
  8. 手写NMS和魔改(Pytorch版本)
  9. msvcr71.dll丢失的解决方法,如何快速进行丢失修复?
  10. mysql start until_mysql 利用新建从库 使用 start slave until 恢复方法
  11. 第一章-问题求解策略-LA4234-Binary Clock
  12. (水)noj2029节奏大师
  13. python:兔子繁殖问题
  14. K8S集群中Pod挂载Storageclass存储卷异常排查思路
  15. ios input 无法自动聚焦拉起手机键盘
  16. ORACLE违反协议异常
  17. 不做ui了 转行做什么_ui设计师是做什么的 想转行可以吗
  18. 钱文品 | 《Redis在海量数据和高并发下的优化实践》主题分享
  19. 计算机专业海报加文字,巧用字体做海报之——字图穿插
  20. time gmtime localtime strftime 时间函数

热门文章

  1. idea下mapreduce的wordcount
  2. leetcode 743. Network Delay Time | 743. 网络延迟时间(邻接矩阵,Dijkstra 算法)
  3. 虚无主义还是怀疑论?
  4. PostProcessor
  5. 大话ConcurrentHashMap的put,get过程
  6. Web前端开发笔记——第二章 HTML语言 第八节 表单标签
  7. signature=8cc1e8491a741a9dc954b549013b75e5,基于小波的SAR影像纹理分析
  8. feign 序列化_Spring Cloud Feign 配置 FastJson
  9. 深入理解linux文件系统( 理解inode与block,理解硬链接软链接,掌握恢复误删文件及其分析方法,掌握用户日志及其查询命令 )
  10. Invalid config event received: {version=0, server