Join是关系型数据库系统的重要操作之一,SQL常用Join:内联接、外联接和交叉联接等。

这里讨论一下这常用的三种连接。

测试环境:db2 v10.1, linux

表定义:

 --用户
CREATE TABLE USER
(
USERID INTEGER NOT NULL,
COMPANYID INTEGER,
TELNO VARCHAR(12)
); --公司
CREATE TABLE COMPANY
(
COMPANYID INTEGER NOT NULL,
TELNO VARCHAR(12)
);

数据:

--USER

USERID      COMPANYID   TELNO
----------- ----------- ------------
11 2 777777
22 3 123456
33 4 567890 --COMPANY COMPANYID TELNO
----------- ------------
2 888888

1. inner join

[db2inst1@win ~]$ db2 "select * from user inner join company on user.companyid=company.companyid"

USERID      COMPANYID   TELNO        COMPANYID   TELNO
----------- ----------- ------------ ----------- ------------
11 2 777777 2 888888 1 record(s) selected.

注意:内联接(Inner join)满足交换律:“A inner join B” 和 “B inner join A” 是相等的。

查看访问计划:

Optimized Statement:
-------------------
SELECT
Q2.USERID AS "USERID",
Q2.COMPANYID AS "COMPANYID",
Q2.TELNO AS "TELNO",
Q1.COMPANYID AS "COMPANYID",
Q1.TELNO AS "TELNO"
FROM
DB2INST1.COMPANY AS Q1,
DB2INST1.USER AS Q2
WHERE
(Q2.COMPANYID = Q1.COMPANYID) Access Plan:
-----------
Total Cost: 13.5566
Query Degree: 1 Rows
RETURN
( 1)
Cost
I/O
|
1
HSJOIN
( 2)
13.5566
2
/-----+------\
3 1
TBSCAN TBSCAN
( 3) ( 4)
6.77858 6.77776
1 1
| |
3 1
TABLE: DB2INST1 TABLE: DB2INST1
USER COMPANY
Q2 Q1

用HSJOIN的方式进行,DB2对此进行了重写。

2. outer join

外部联接保存一个或两个输入表的所有行,即使无法找到匹配联接谓词的行。

[db2inst1@win ~]$ db2 "select * from user left outer join company on user.companyid=company.companyid"

USERID      COMPANYID   TELNO        COMPANYID   TELNO
----------- ----------- ------------ ----------- ------------
11 2 777777 2 888888
33 4 567890 - -
22 3 123456 - - 3 record(s) selected.
[db2inst1@win ~]$ db2 "select * from user right outer join company on user.companyid=company.companyid"

USERID      COMPANYID   TELNO        COMPANYID   TELNO
----------- ----------- ------------ ----------- ------------
11 2 777777 2 888888 1 record(s) selected.

查看访问计划:

Optimized Statement:
-------------------
SELECT
Q2.USERID AS "USERID",
Q2.COMPANYID AS "COMPANYID",
Q2.TELNO AS "TELNO",
Q1.COMPANYID AS "COMPANYID",
Q1.TELNO AS "TELNO"
FROM
DB2INST1.COMPANY AS Q1
LEFT OUTER JOIN DB2INST1.USER AS Q2
ON (Q2.COMPANYID = Q1.COMPANYID) Access Plan:
-----------
Total Cost: 13.5566
Query Degree: 1 Rows
RETURN
( 1)
Cost
I/O
|
1
HSJOIN<
( 2)
13.5566
2
/-----+------\
3 1
TBSCAN TBSCAN
( 3) ( 4)
6.77858 6.77776
1 1
| |
3 1
TABLE: DB2INST1 TABLE: DB2INST1
USER COMPANY
Q2 Q1

这里也是用的HSJOIN。

3. cross join

交叉联接(cross join)执行两个表的笛卡尔积(就是把表A和表B的数据进行一个N*M的组合)。也就是说,它匹配一个表与另一个表中的每一行;我们不能通过使用ON子句在交叉联接指定谓词,虽然我们可以使用WHERE子句来实现相同的结果,这是交叉联接基本上是作为一个内部联接了。

[db2inst1@win ~]$ db2 "select * from user cross join company"

USERID      COMPANYID   TELNO        COMPANYID   TELNO
----------- ----------- ------------ ----------- ------------
11 2 777777 2 888888
22 3 123456 2 888888
33 4 567890 2 888888 3 record(s) selected.

查看访问计划:

Optimized Statement:
-------------------
SELECT
Q2.USERID AS "USERID",
Q2.COMPANYID AS "COMPANYID",
Q2.TELNO AS "TELNO",
Q1.COMPANYID AS "COMPANYID",
Q1.TELNO AS "TELNO"
FROM
DB2INST1.COMPANY AS Q1,
DB2INST1.USER AS Q2 Access Plan:
-----------
Total Cost: 13.5563
Query Degree: 1 Rows
RETURN
( 1)
Cost
I/O
|
3
NLJOIN
( 2)
13.5563
2
/-----+------\
1 3
TBSCAN TBSCAN
( 3) ( 4)
6.77776 6.77858
1 1
| |
1 3
TABLE: DB2INST1 TABLE: DB2INST1
COMPANY USER
Q1 Q2

看到这里使用的是NLJOIN。

SQL 三种基本Join的更多相关文章

  1. Linq to Sql : 三种事务处理方式

    原文:Linq to Sql : 三种事务处理方式 Linq to SQL支持三种事务处理模型:显式本地事务.显式可分发事务.隐式事务.(from  MSDN: 事务 (LINQ to SQL)).M ...

  2. spark三种连接Join

    本文主要介绍spark join相关操作. 讲述spark连接相关的三个方法join,left-outer-join,right-outer-join,在这之前,我们用hiveSQL先跑出了结果以方便 ...

  3. [转]SQL三种获取自增长的ID方法

     最新更新请访问: http://denghejun.github.io   SQL SERVER中的三种获得自增长ID的方法  这个功能比较常用,所以记下来以防自己忘掉. SCOPE_IDENTIT ...

  4. Sql三种分页方法

    --分页三种方法--第一种 ROW_NUMBER() OVER( ORDER BY OrgID) AS indexs 大于pagesize*pageindex,少于等于pagesize*(pagein ...

  5. 递归算法+sql三种分页

    using Maticsoft.Common; using System; using System.Collections.Generic; using System.Data; using Sys ...

  6. Oracle三种循环例题:打印九九乘法表

    数据库SQL三种循环语句(For.While.Loop) --如果要将执行结果输出,需要先执行 setserveroutput on 命令,在窗口里显示服务器输出信息 set serveroutput ...

  7. SQL Server的三种物理连接之Loop Join(一)

    Sql Server有三种物理连接Loop Join,Merge Join,Hash Join, 当表之间连接的时候会选择其中之一,不同的连接产生的性能不同,理解这三种物理连接对性能调优有很大帮助. ...

  8. 浅谈SQL Server中的三种物理连接操作(HASH JOIN MERGE JOIN NESTED LOOP)

    简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...

  9. Spark SQL join的三种实现方式

    引言 join是SQL中的常用操作,良好的表结构能够将数据分散到不同的表中,使其符合某种规范(mysql三大范式),可以最大程度的减少数据冗余,更新容错等,而建立表和表之间关系的最佳方式就是join操 ...

随机推荐

  1. 简单总结一下 XSS

    你听说过XSS吗? XSS(Cross-site scripting, 跨站脚本)是一种网站应用程序的安全漏洞攻击,是代码注入的一种. 研究表明,最近几年 XSS 已经超过 "缓冲区溢出&q ...

  2. [图形学] 计算机图形学 with OpenGL开篇

    <计算机图形学>(第四版)正在学习中,学习目的是为了在Unity中使用shader实现不同的渲染效果. 希望在这里能把学习过程中学到的知识和遇到的问题记录下来. 工作环境是:Xcode 8 ...

  3. IE过滤器

    1.  _ 下划线属性过滤器  语法:_选择符{属性:属性值}   2. *通配符属性过滤器 语法:*选择符{属性:属性值}   3.  \9: IE版本识别:其他浏览器都不识别 语法:选择符{属性: ...

  4. (转)ManyToMany注解

    @ManyToMany  注释:表示此类是多对多关系的一边,mappedBy 属性定义了此类为双向关系的维护端,注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Student类中有 ...

  5. MongoDB数据库索引

    前面的话 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查 ...

  6. elasticsearch REST API方式批量插入数据

    elasticsearch REST API方式批量插入数据 1:ES的服务地址  http://127.0.0.1:9600/_bulk 2:请求的数据体,注意数据的最后一行记得加换行 { &quo ...

  7. zookeeper的集群介绍、搭建、环境、安装

    zookeeper是本身是一种分布式协调服务(英文意思动物园园长因为Hadoop就是一个动物园,storm.hadoop.kafkaka.hbaser都是基于zookeeper开发的) 原理:Zook ...

  8. Java Swing intro

    Java Swing intro 如果有Android app开发经验,快速上手Swing不是问题.UI方面有相似的地方. 简单的几行代码就能抛出一个框框,记录一下操作过程 1.先显示一个框框 Era ...

  9. iOS动画学习-视觉效果

    CALayer不仅仅是iOS动画学习-CALayer中介绍的那些内容,他还有一些其他属性,比如shadowColor,borderWidth,borderColor等等,这些属性我们只需要简单点设置就 ...

  10. JavaScript系统学习小结——变量、作用域和内存问题

    趁着写完小论文还未彻底消散的学习氛围,开始着重巩固自己JavaScript的基础知识,为秋招做最基本的准备. 变量:Js的变量可能保存两种不同数据类型的值:基本类型值和引用类型值. 基本类型包括:Un ...