文章目录

  • 一、生成测试数据
    • 1、创建超女基本信息历史表(T_GIRL_HIS)
    • 2、创建超女基本信息表(T_GIRL)
    • 3、测试数据说明
  • 二、join示例
    • 1、内连接(inner join)
    • 2、左连接(left join)
    • 3、右连接(right join)
    • 4、全连接(full join)
    • 5、笛卡儿乘积(cross join)
  • 三、应用经验
    • 1、尽可能简单化SQL语句
    • 2、子查询与join
  • 四、版权声明

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.namefrom 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.namefrom 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.namefrom 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.namefrom 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.namefrom 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.namefrom 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.namefrom 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.namefrom 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.namefrom 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.namefrom 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 join多表查询相关推荐

  1. oracle 连多表查询语句,Oracle join多表查询

    join(连接)是一个查询,它将来自两个或多个表.视图的数据组合在一起. 我通过一些示例来向大家介绍join的常用方法. 一.生成测试数据 1.创建超女基本信息历史表(T_GIRL_HIS) crea ...

  2. oracle查询多表连接语句怎么写,Oracle join多表查询

    join(连接)是一个查询,它将来自两个或多个表.视图的数据组合在一起. 我通过一些示例来向大家介绍join的常用方法. 一.生成测试数据 1.创建超女基本信息历史表(T_GIRL_HIS)creat ...

  3. Oracle SQL多表查询

    曾经一段时间我对oracle的多表查询搞的云里雾里,究其原因:oracle自己的语法和SQL国际标准语法混用.此文章仅适合oracle 菜鸟,老鸟直接飞过- 多表连接类型(SQL 1999标准) • ...

  4. Oracle数据库—— 多表查询

    Oracle数据库-- 多表查询 (一)笛卡尔问题 1.笛卡尔积会在下面条件下产生: 省略连接条件 连接条件无效 所有表中的所有行互相连接 2.为了避免笛卡尔积,可以在WHERE加入有效的连接条件 ( ...

  5. Oracle(四)多表查询

    Oracle(四)多表查询 ---oracle中专用外连接 select * from emp e,dept d where e.deptno(+) = d.deptno--查询出员工姓名,员工领导姓 ...

  6. oracle把所有表查询权限赋与另一用户

    oracle把所有表查询权限赋与另一用户. 2008-02-01 9:07 昨天有一同事问如何把oracle里一个用户所有表查询权限赋与另一用户,在网上查了好像没有现成的一劳永逸的语句,只能手了一个批 ...

  7. Oracle EBS 常用表 查询语句

    ORACLE EBS常用表查询语句 1.  OU.库存组织 SELECT hou.organization_id ou_org_id,           --org_id   hou.name ou ...

  8. Oracle中多表查询再按时间倒序

    我在工作中在Oracle中多表查询再按时间倒序时,用order by 表名.datatime desc 总是实现不了. 不过最后问杨鹃最后和我说可以把我们查询的总个sql语句做为一个表来排序: sel ...

  9. 用php进行联查,Thinkphp使用join联表查询的方法

    本篇文章介绍了Thinkphp使用join联表查询的方法,具有一定的参考价值,希望对各位学习thinkphp的朋友有帮助! Thinkphp使用join联表查询的方法 多表联查:$user = M(' ...

最新文章

  1. 知乎2w人关注,没有工程开发经验的人是怎么找到工作的?
  2. diy直立双足机器人_速看!近期国内外机器人资讯大汇总
  3. oracle监听错误与hosts文件配置
  4. 转载:为什么使用ibatis而不用spring jdbcTemplate
  5. Python条件判断和循环,range()函数
  6. Oracle11g EM界面乱码解决方法
  7. 谷歌地球API相关网页翻译
  8. SQL语句删除重复记录
  9. 在idea中把项目上传到GitHub库中
  10. 回归_英国酒精和香烟关系
  11. 【校招面试 之 C/C++】第12题 C++ 重载、重写和重定义
  12. 第一个Appium脚本
  13. 【二维差分】Monitor
  14. 职场英语口语100句 (转载)
  15. centos5.5安装ntfs-3g,并遇到mount failed: 设备或资源忙的解决方案
  16. Codeforces 1163A - Eating Soup
  17. php中mysql数据库异步查询实现
  18. 基于51单片机的keli安装方法
  19. 铁血战士之异形大战铁血战士2 观感
  20. 关键字:c++builder(BCB) C# WebService EAccessViolation

热门文章

  1. Python+socket完美实现TCP长连接保持存活
  2. 微课|玩转Python轻松过二级:第1章课后习题解答
  3. python标准库math用法精要
  4. 象棋名手手机版2019最新版_天天象棋2019版下载
  5. cup first world_LOONCUP – The world's first SMART menstrual cup.
  6. java获取异常信息_Python中获取异常(Exception)信息
  7. r语言在线编译器w3c,R语言运算符知识点总结
  8. guid主分区表损坏_固态硬盘用mbr还是guid
  9. 小企鹅输入法+v4.0+linux,Ubuntu 11.10中安装fcitx 4.0.1版本小企鹅输入法
  10. 线序及模式配置Linux,[CCNA图文笔记]-1-水晶头线序及设备互联法则