SQL 三种基本Join
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的更多相关文章
- Linq to Sql : 三种事务处理方式
原文:Linq to Sql : 三种事务处理方式 Linq to SQL支持三种事务处理模型:显式本地事务.显式可分发事务.隐式事务.(from MSDN: 事务 (LINQ to SQL)).M ...
- spark三种连接Join
本文主要介绍spark join相关操作. 讲述spark连接相关的三个方法join,left-outer-join,right-outer-join,在这之前,我们用hiveSQL先跑出了结果以方便 ...
- [转]SQL三种获取自增长的ID方法
最新更新请访问: http://denghejun.github.io SQL SERVER中的三种获得自增长ID的方法 这个功能比较常用,所以记下来以防自己忘掉. SCOPE_IDENTIT ...
- Sql三种分页方法
--分页三种方法--第一种 ROW_NUMBER() OVER( ORDER BY OrgID) AS indexs 大于pagesize*pageindex,少于等于pagesize*(pagein ...
- 递归算法+sql三种分页
using Maticsoft.Common; using System; using System.Collections.Generic; using System.Data; using Sys ...
- Oracle三种循环例题:打印九九乘法表
数据库SQL三种循环语句(For.While.Loop) --如果要将执行结果输出,需要先执行 setserveroutput on 命令,在窗口里显示服务器输出信息 set serveroutput ...
- SQL Server的三种物理连接之Loop Join(一)
Sql Server有三种物理连接Loop Join,Merge Join,Hash Join, 当表之间连接的时候会选择其中之一,不同的连接产生的性能不同,理解这三种物理连接对性能调优有很大帮助. ...
- 浅谈SQL Server中的三种物理连接操作(HASH JOIN MERGE JOIN NESTED LOOP)
简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...
- Spark SQL join的三种实现方式
引言 join是SQL中的常用操作,良好的表结构能够将数据分散到不同的表中,使其符合某种规范(mysql三大范式),可以最大程度的减少数据冗余,更新容错等,而建立表和表之间关系的最佳方式就是join操 ...
随机推荐
- call, apply,bind 方法解析
call(), apply(),bind() 三者皆为Function的方法 call(),apply()的作用是调用方法,并改变函数运行时的context(作用上下文) bind() 的作用是引用方 ...
- Idea调试显示切换数据源的设置
使用IDEA调试时,如果遇到相同方法会在编辑器上提示切换到哪个项目,因为手滑点了Disable,所以导致后来就不提示了,记录下设置方法.
- CSS三种引入方式:内联、页级、外联
1.内联CSS 内联CSS也可称为行内CSS或者行级CSS,它直接在标签内部引入,显著的优点是十分的便捷.高效:但是同时也造成了不能够重用样式的缺点,如果代码行数到达一定长度不建议采用.通常内联CSS ...
- tp框架---验证码详解
很多注册登录界面都会验证码,用tp如何实现验证码的功能呢? 在tp中:Think\Verify类可以支持验证码的生成和验证功能. 首先,看一下逻辑: (1)如何生成?------ 先做Yanzheng ...
- voa 2015 / 4 / 18
Words in This Story gerund - n. an English noun formed from a verb by adding -ing infinitive - n. th ...
- CISCO2960配置vlan
一.VTP配置 1.VLAN database 2.(VLAN)#vtp domain wx 3.(VLAN)#vtp server 二.VLAN配置 1.VLAN database 2.(VLAN) ...
- 使用joda-time工具类 计算时间相差多少 天,小时,分钟,秒
下面程序使用了两种方法计算两个时间相差 天,小时,分钟,秒 package jodotest; import java.text.ParseException; import java.text.Si ...
- Dapper.Rainbow 简单使用
一. Dapper 简介 一个效率比较高的微型ORM. 二 . Dapper.Rainbow Dapper的扩展,在这个扩展里面实现了 Dynamic 的 插入和更新 ...
- Android - FEATURE_NO_TITLE
Android设置无标题的方法 在onCreate()中写入: requestWindowFeature(Window.FEATURE_NO_TITLE); 例如: protected void on ...
- 修改tomcat编码方式
打开server.xml <Connector URIEncoding="UTF-8" connectionTimeout="20000" port=&q ...