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. javaWeb第一天

    //第一个JavaWeb项目package com.chy.action; import java.io.IOException; import javax.servlet.ServletExcept ...

  2. pandas教程1:pandas数据结构入门

    pandas是一个用于进行python科学计算的常用库,包含高级的数据结构和精巧的工具,使得在Python中处理数据非常快速和简单.pandas建造在NumPy之上,它使得以NumPy为中心的应用很容 ...

  3. Echarts展示百分比的问题

    22.echarts 想要自定义tooltip 的百分比的时候,可以在formatter中console.log(params); 当鼠标移动到y轴的时候会触发输出;

  4. 移动端Touch事件基础

    1.三个常用的移动端事件 ontouchstart 手指按下时触发 ontouchmove 手指移动时触发 ontouchend 手动抬起时触发 注意:这些事件当作事件属性使用时,不兼容谷歌浏览器. ...

  5. jsonp的原理和实现

    什么是JSONP? javascript高级程序设计中是这样介绍jsonp的: jsonp是JSON with padding(填充式JSON或参数式JSON )的简写,是应用JSON的一种新方法,在 ...

  6. JavaScript一个whenReady函数,监听及注册事件

    /** * 传递函数给whenReady(),当文档解析完成且为操作准备就绪时, * 函数将作为文档对象的方法调用 * DOMContentLoaded.readystatechange或load事件 ...

  7. React 实践项目 (三)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行 ...

  8. oracle分组-神奇的cube和rollup

    先看代码: 表结构如下: emp表 EMPNO                                     NOT NULL NUMBER(4) ENAME                 ...

  9. CloseHandle 函数--关闭一个句柄

    CloseHandle函数 来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx 作用 ...

  10. struts2.0的工作原理?

    struts2并不是一个陌生的web框架,它是以Webwork的设计思想为核心,吸收struts1的优点,可以说 struts2是struts1和Webwork结合的产物. struts2 的工作原理 ...