【SQL】表连接 --半连接

简介:

半连接: 当一张表在另一张表找到匹配的记录之后,半连接(semi-jion)返回第一张表中的记录。与条件连接相反,即使在右节点中找到几条匹配的记录,左节点的表也只会返回一条记录。另外,右节点的表一条记录也不会返回。半连接通常使用IN  或 EXISTS 作为连接条件。下面是一个例子:

SQL> set linesize 999
SQL>  select d.deptno,d.dname,d.loc
  2  from scott.dept d
  3  where d.deptno IN  (select e.deptno from scott.emp e);


Execution Plan
----------------------------------------------------------
Plan hash value: 2365756639

----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |     3 |    69 |     6  (17)| 00:00:01 |
|   1 |  MERGE JOIN SEMI             |         |     3 |    69 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    80 |     2   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN           | PK_DEPT |     4 |       |     1   (0)| 00:00:01 |
|*  4 |   SORT UNIQUE                |         |    14 |    42 |     4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL         | EMP     |    14 |    42 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("D"."DEPTNO"="E"."DEPTNO")
       filter("D"."DEPTNO"="E"."DEPTNO")


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         11  consistent gets
          0  physical reads
          0  redo size
        750  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          3  rows processed

-------------------------------------   EXISTS  -----------------


SQL> select d.deptno,d.dname,d.loc
  2  from scott.dept d
  3  where EXISTS (select e.deptno from scott.emp e WHERE e.deptno = d.deptno);


Execution Plan
----------------------------------------------------------
Plan hash value: 2365756639

----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |     3 |    69 |     6  (17)| 00:00:01 |
|   1 |  MERGE JOIN SEMI             |         |     3 |    69 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    80 |     2   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN           | PK_DEPT |     4 |       |     1   (0)| 00:00:01 |
|*  4 |   SORT UNIQUE                |         |    14 |    42 |     4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL         | EMP     |    14 |    42 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("E"."DEPTNO"="D"."DEPTNO")
       filter("E"."DEPTNO"="D"."DEPTNO")


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         11  consistent gets
          0  physical reads
          0  redo size
        750  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          3  rows processed

附上半连接与条件连接的结果:

SQL> select d.deptno,d.dname,d.loc//半连接
  2  from scott.dept d
  3   where EXISTS (select e.deptno from scott.emp e WHERE e.deptno = d.deptno);

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO

SQL> select e.ename ,s.grade//条件连接
  2  from emp e,salgrade s
  3  where e.sal between s.losal and s.hisal;

ENAME           GRADE
---------- ----------
SMITH               1
JAMES               1
ADAMS               1
WARD                2
MARTIN              2
MILLER              2
TURNER              3
ALLEN               3
CLARK               4
BLAKE               4
JONES               4

ENAME           GRADE
---------- ----------
SCOTT               4
FORD                4
KING                5

14 rows selected.

可以看到 grade 有很多的重复值。

相关文章
|
5月前
|
SQL 数据库
SQL Server 连接查询和子查询
SQL Server 连接查询和子查询
95 0
|
2月前
|
SQL
SQL多表查询的几种连接方式
SQL多表查询时,主要使用以下几种连接方式
|
9月前
|
SQL
SQL 连接(内连接,外连接)
现在有两张表,学生表student1,成绩表SC1,两张表的数据如下
75 0
SQL Server外连接、内连接、交叉连接
小编在做组织部维护最后收尾工作的时候,遇到了这样一个问题,需要将定性考核得分查出来、定量考核对应的数据查出来并进行得分计算、附加分查出来,最后将这三部分信息汇总之后得到总成绩,如果其中一项成绩没有进行计算那么是可以得到成绩的。
|
SQL Oracle 关系型数据库
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
326 0
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
|
SQL 程序员 数据库
SQL的几种连接查询
SQL的几种连接查询
139 0
SQL的几种连接查询
|
SQL 数据库
SQL Sever 子查询与嵌套查询
作者主页:https://www.couragesteak.com/
SQL Sever 子查询与嵌套查询
|
SQL Serverless
SQL Sever联接查询
作者主页:https://www.couragesteak.com/
SQL Sever联接查询
SQL92、SQL99中的多表连接查询区别
盘点在SQL92、SQL99中, 多表连接查询区别(非常详细)
|
SQL 关系型数据库 MySQL
SQL 连接(JOIN)专题
SQL 最强大的功能之一就是能在数据检索查询的执行中联结(join)表。联结是利用 SQL 的 SELECT 能执行的最重要的操作,很好地理解联结及其语法是学习SQL的一个极为重要的组成部分。另外聚集函数也可以在联结中进行使用。 SQL 连接(JOIN) 用于把来自两个或多个表的行结合起来。 下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。 在我们继续讲解实例之前,我们先列出您可以使用的不同的 SQL JOIN 类型: INNER JOIN:如果表中有至少一个匹配,则返回行 LEFT JOIN:即使右表中没有匹配,
112 0
SQL 连接(JOIN)专题