前言:这几天学习oracle,把自己对于关联查询的理解,记录下。如有错误请指正!

交叉连接:

交欢连接又称为“笛卡儿积连接”,是两个或多个表之间的无条件连接。一个表中所有的记录与其它表的所有的记录进行连接。

如果进行连接的表中的数据行数分别为“n1,n2、n3”,那么交叉连接后结果集中有n1xn2xn3条记录。

一、内连接

内连接是种常用的关联查询方式,使用inner join来实现,其中inner是可以省略的语法如下:

内连接的标准语法

select colums_list

from table_name1 [inner] join table_name2

on join_codition

参数说明:

  • colums_list :字段列表
  • table_name1和table_name2:是两个要实现内联接的表名
  • join_condition:实现内连接的条件表达式

内连接语法:Oracle扩展的连接方式

SELECT table1.column,talbe2.column[,…]

FROM table1,table2[,…]

WHERE condition;

例如:

SQL> select e.empno 员工号,e.ename 员工姓名,e.job 职务,d.dname
2 from emp e inner join dept d
3 on e.deptno = d.deptno;
------------------------------------------------或者-------------------------------------------------------------------------------
SQL> select e.empno 员工号,e.ename 员工姓名,e.job 职务,d.dname
2 from emp e ,dept d where e.deptno = d.deptno; 员工号 员工姓名 职务 DNAME
---------- -------------------- ------------------ ----------------------------
7369 SMITH CLERK RESEARCH
7499 ALLEN SALESMAN SALES
7521 WARD SALESMAN SALES
7566 JONES MANAGER RESEARCH
7654 MARTIN SALESMAN SALES
7698 BLAKE MANAGER SALES
7782 CLARK MANAGER ACCOUNTING
7788 SCOTT ANALYST RESEARCH
7839 KING PRESIDENT ACCOUNTING
7844 TURNER SALESMAN SALES
7876 ADAMS CLERK RESEARCH 员工号 员工姓名 职务 DNAME
---------- -------------------- ------------------ ----------------------------
7900 JAMES CLERK SALES
7902 FORD ANALYST RESEARCH
7934 MILLER CLERK ACCOUNTING 已选择14行。

二、外连接

外连接分为:左外连接和右外连接、完全连接

  1. A、左外连接:关键字为left outer join 或者 left join

  2. 语法:

1、标准SQL语句的连接方式

SELECT table1.column, table2.column[,…]

FROM table1 LEFT JOIN table2[,]

ON table1.column <operator> table2.column[,…];

  1. 2、Oracle扩展的连接方式

    SELECT table1.column, table2.column[,…]

    FROM table1, table2[,…]

    WHERE table1.column <operator>

    table2.column(+)[…];

  2. 例如:

  3. SQL> select e.empno,e.ename,e.job,d
    2 .dname
    3 from emp e left join dept d
    4 on e.deptno = d.deptno;
    -----------------------------------------------------------或者----------------------------------------------------------------------------------
    SQL> select e.empno,e.ename,e.job,d.dname
    2 from emp e,dept d
    3 where e.deptno = d.deptno(+); EMPNO ENAME JOB DNAME
    ---------- -------------------- ------------------ ----------------------------
    7934 MILLER CLERK ACCOUNTING
    7839 KING PRESIDENT ACCOUNTING
    7782 CLARK MANAGER ACCOUNTING
    7902 FORD ANALYST RESEARCH
    7876 ADAMS CLERK RESEARCH
    7788 SCOTT ANALYST RESEARCH
    7566 JONES MANAGER RESEARCH
    7369 SMITH CLERK RESEARCH
    7900 JAMES CLERK SALES
    7844 TURNER SALESMAN SALES
    7698 BLAKE MANAGER SALES EMPNO ENAME JOB DNAME
    ---------- -------------------- ------------------ ----------------------------
    7654 MARTIN SALESMAN SALES
    7521 WARD SALESMAN SALES
    7499 ALLEN SALESMAN SALES
    9527 LIKE PRINTER
  4. B、右外连接:关键字为right outer join 或者 right join

  5. 1、标准SQL语句的连接方式

    SELECT table1.column, table2.column[,…]

    FROM table1 RIGHT JOIN table2[,…]

    ON table1.column <operator> table2.column[…];

  6. 例如:

  7. 2、Oracle扩展的连接方式

    语法:

  8. SELECT table1.column, table2.column[,…]

    FROM table1, table2[,…]

    WHERE table1.column (+)<operator>

    table2.column[…];

  9. 例如:

  10. SQL> select e.empno,e.ename,e.job,d
    2 .dname
    3 from emp e left join dept d
    4 on e.deptno = d.deptno;
    -------------------------------------------------------------或者--------------------------------------------------------------------
    SQL> select e.empno,e.ename,e.job,d.dname
    2 from emp e,dept d
    3 where e.deptno (+)= d.deptno; EMPNO ENAME JOB DNAME
    ---------- -------------------- ------------------ ----------------------------
    7369 SMITH CLERK RESEARCH
    7499 ALLEN SALESMAN SALES
    7521 WARD SALESMAN SALES
    7566 JONES MANAGER RESEARCH
    7654 MARTIN SALESMAN SALES
    7698 BLAKE MANAGER SALES
    7782 CLARK MANAGER ACCOUNTING
    7788 SCOTT ANALYST RESEARCH
    7839 KING PRESIDENT ACCOUNTING
    7844 TURNER SALESMAN SALES
    7876 ADAMS CLERK RESEARCH EMPNO ENAME JOB DNAME
    ---------- -------------------- ------------------ ----------------------------
    7900 JAMES CLERK SALES
    7902 FORD ANALYST RESEARCH
    7934 MILLER CLERK ACCOUNTING
    OPERATIONS 已选择15行。
  11. C、完全连接:关键字为full outer join 或者 full join

  12. 在Oracle数据库中,全外连接的表示方式为

    SELECT table1.column, table2.column[,…]

    FROM table1 FULL JOIN table2[,…]

    ON table1.column1 = table2.column2[…];

  13. 例如:

  14. SQL> select e.empno,e.ename,d.deptno,d.dname from emp e full join dept d on d.deptno = e.deptno;
    
         EMPNO ENAME                    DEPTNO DNAME
    ---------- -------------------- ---------- ----------------------------9528 LIKE
    7369 SMITH 20 RESEARCH
    7499 ALLEN 30 SALES
    7521 WARD 30 SALES
    7566 JONES 20 RESEARCH
    7654 MARTIN 30 SALES
    7698 BLAKE 30 SALES
    7782 CLARK 10 ACCOUNTING
    7788 SCOTT 20 RESEARCH
    7839 KING 10 ACCOUNTING EMPNO ENAME DEPTNO DNAME
    ---------- -------------------- ---------- ----------------------------
    7844 TURNER 30 SALES
    7876 ADAMS 20 RESEARCH
    7900 JAMES 30 SALES
    7902 FORD 20 RESEARCH
    7934 MILLER 10 ACCOUNTING
    40 OPERATIONS 已选择17行。
    1. 注:左外连接其实就是:将左边表中的数据全部显示出不无论在其连接表中是否有对应的数据,如果没有与之对应的连接表的值为NULL。
      1. 右外连接是:指在内连接的基础上,将连接操作符右侧表中不符合连接条件的记录加入结果集中,与之对应的连接操作符左侧表列用NULL填充。
      2. 完全连接是:全外连接:指在内连接的基础上,将连接操作符两侧表中不符合连接条件的记录全部加入结果集中。

对于(+)操作符:

  • 当使用(+)操作符执行外连接时,应当将该操作符放在显示较少行(完全满足连接条件行)一端。
  • (+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
  • 当使用(+)操作符执行外连接时,如果在where语句中包含多个条件,则必须在所有的条件中都包含(+)操作符。
  • (+)操作符只能适用于列,而不能适用于表达式。
  • (+)操作符不能与or和in操作符一起使用。
  • (+)操作符只能用于左外连接和右外连接,不能用于实现完全连接。
  • (+)所在位置的另一则为连接方向,而且如果后面有条件都要注意(+)位置

三、自连接

在应用开发中,用户可能拥有“自引用式”的外键,“自引用式”外键是指表中的一个列可以是该表主键的一个外键。

例如:

SQL> select em2.ename 管理者,em1.ename 下属员工
2 from emp em1 left join emp em2
3 on em1.mgr = em2.empno
4 order by em1.mgr; 管理者 下属员工
-------------------- --------------------
JONES FORD
JONES SCOTT
BLAKE JAMES
BLAKE TURNER
BLAKE MARTIN
BLAKE WARD
BLAKE ALLEN
CLARK MILLER
SCOTT ADAMS
KING CLARK
KING BLAKE 管理者 下属员工
-------------------- --------------------
KING JONES
FORD SMITH
KING
LIKE
EAST 已选择16行。

四、交叉连接

交叉连接的执行结果是一个笛卡儿积,那么这种查询结果是非常冗余的,但可以通过where子句来过滤。

QL> select count(*) from emp;

  COUNT(*)
----------
16 SQL> select count(*) from dept; COUNT(*)
----------
4 SQL> select count(*) from emp cross join dept; COUNT(*)
----------
64

多表关联查询(ORACLE版)的更多相关文章

  1. Oracle 数据库(oracle Database)Select 多表关联查询方式

    Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...

  2. oracle 两表关联查询

      oracle 两表关联查询 CreationTime--2018年7月4日17点27分 Author:Marydon 情景描述 查询学生表student,sname,sex,age信息及所在班级c ...

  3. oracle多表关联查询和子查询

    oracle多表关联查询和子查询 一.多表关联查询 例子: SQL> create table student1 ( sid ), sname ), sage )); Table created ...

  4. ORACLE数据库多表关联查询效率问题解决方案

    最近在做项目中遇到多表关联查询排序的效率问题(5张以上40W+数据的表),查询一次大概要20多秒,经过一番苦思冥想,处理方案如下: 1.软件设计初期,需要一对一关联的表应该设计在一张大表里,这样虽然字 ...

  5. Oracle - 查询语句 - 多表关联查询

    /* SQL语句的历史版本 SQL89 比较多 SQL92 SQL99 多表关联查询 笛卡尔积 等值关联查询 非等值关联查询 左外连接 右外连接 全外连接 自连接 */ --------------- ...

  6. 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询

    相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 自APIJSON发布 ...

  7. oracle02--多表关联查询

    1. 多表(关联)查询 多表查询也称之为关联查询.多表关联查询等,主要是指通过多个表的关联来获取数据的一种方式. 1.1. 多表映射关系 一对多:A表的一行数据,对应B表中的多条.如:一个部门可以对应 ...

  8. Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...

  9. MSSQL N张表关联查询

    declare @newTime varchar(50); declare @lasetTime varchar(50); set @newTime= getdate(); set @lasetTim ...

  10. RDIFramework.NET 中多表关联查询分页实例

    RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为 ...

随机推荐

  1. 【转】 NSArray copy 问题

    转自:   http://blog.sina.com.cn/s/blog_6b1e4a060102uz0i.html   好久没写博客了,今天看到同事的代码中用到了 copy 这个 方法,之前也有了解 ...

  2. [转]Delphi 中 image 控件加载bmp、JPG、GIF、PNG等图片的办法

    procedure TForm1.Button1Click(Sender: TObject); var jpg: TJPEGImage; // 要use Jpeg单元 begin // 显示jpg大图 ...

  3. Reverse Interger

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Have you ...

  4. 获取fragment中的控件的写法

    package com.example.baoxiu.fragment;import com.example.baoxiu.R;import com.example.baoxiu.Register;i ...

  5. 打包静默安装参数(nsis,msi,InstallShield,InnoSetup)[转]

    有时我们在安装程序的时候,希望是静默安装的,不显示下一步下一步,这编访问来教大家如何来操作,现在常用的制作安装程序的软件有,  Microsoft Windows Installer  , Windo ...

  6. delphi 创建数据库配置文件(TIniFile)

    一.有必要了解INI文件的结构: ;注释 [小节名] 关键字=值 ... ---- INI文件允许有多个小节,每个小节又允许有多个关键字, “=”后面是该关键字的值. ---- 值的类型有三种:字符串 ...

  7. hdu 4548 第六周H题(美素数)

    第六周H题 - 数论,晒素数 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   De ...

  8. Renting Boats

    Description 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n.游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇.游艇出租站i 到游艇出租站j 之间的租金为r( ...

  9. 重构后的程序:通过rsync命令抓取日志文件

    push.sh #!/bin/bash function push() { local ip=$ local user=$ local password=$ local path=$ local lo ...

  10. GIve Me A Welcome Hug!

    类似于初来乍到,和大家打个招呼,并矫情的希望路人也能回赠我一个welcome hug. 到了这种园子那一定是做CS相关的了,一直以为如果能够坚持写技术博客,那一定会对自己的内力有十足的提升.借用一位前 ...