一.概念:

1.多表连接有以下几种分法:

(1)内连接           vs          外连接 (左、右、满)

(2)等值连接        vs         不等值连接

(3)非自连接        vs         自连接

2.笛卡尔集:  所有表中的所有行互相连接

产生条件:(1)多表查询没有连接条件

(2)连接条件无效

3. 内连接   :  结果集中不包含一个表与另一个表不匹配的行

外连接   :  两个表在连接过程中除了返回满足连接条件的行以外(这里的数据是内连接查询到的),还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接

满外连接: 返回左表中和右表中不满足条件的行

4.注意:      当列名为多个表共有时,列名必须被限制。

二.1999 语法连接

语法:

FROM    table1
[ CROSS JOIN table2 ] |
[ NATURAL JOIN table2 ] |
[ JOIN table2 USING (column_name) ] | [ JOIN table2
ON (table1.column_name = table2.column_name) ] | [ LEFT | RIGHT | FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)];

1.join  ...  on...    (推荐使用)

自然连接中是以具有相同名字的列为连接条件的,而 JOIN...ON ...子句并不要求两张表含有相同名字的列。

ON 子句使语句具有更高的易读性。

select  字段...

from  表1   join  表2

on    表1和表2的连接条件
join 表3
on 表1(或表2)和表3的连接条件

(1)两张表的等值连接

select  last_name, department_name
from employees e join departments d
on e.department_id = d.department_id;

(2)使用 join.. on..创建多表连接:三张表的等值连接

select last_name,e.department_id,department_name,city
from employees e join departments d
on e.department_id = d.department_id
join locations l
on d.location_id = l.location_id;

2.CROSS   JOIN        ( 不推荐 )

使用 CROSS   JOIN  会产生叉集,叉集与笛卡尔集相同。

SELECT last_name, department_name
FROM employees
CROSS JOIN departments ;

3.  natural    join   (不推荐)

自然连接:   NATURAL  JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。

注:  如果只是列名相同而数据类型不同,则会产生错误。

employees表 和 departments表 有两个相同字段。使用NATURAL  JOIN ,会自动以这两个字段作为连接条件。

select last_name,department_name
from employees natural join departments;

以上代码与下面代码相同:

select last_name,department_name
from employees e,departments d
where e.department_id = d.department_id and e.manager_id = d.manager_id;

4.join .. using ...    (不推荐)

背景:由 NATURAL JOIN 子句创建等值连接,会将这些相同列都作为连接条件。而有时我们只需要其中某些列,这是就可以使用using子句指定等值连接中需要用到的列。

作用:在有多个列满足条件时,可以使用 USING 子句 指定等值连接中需要用到的列。

局限:按照指定的列作为连接条件。但是要求指定的列,在两个表中列名相同。

注:
       不要给选中的列中加上表名前缀或别名。
       JOIN 和 USING 子句经常同时使用。

以上都是内连接

三.外连接

1.左外连接

左外连接:除了查询到满足条件的行之外,返回左表中不满足条件的行。主要有两种实现方式:

(1) left  outer  join... on...

select last_name ,department_name
from employees e left outer join departments d
on e.department_id = d.department_id;

(2) +

select e.employee_id,e.department_id,d.department_name
from employees e,departments d
where e.department_id = d.department_id(+); --左边有,右边没,故右加

2.右外连接

右外连接:返回右表中不满足条件的行。主要有两种实现方式:

(1) right  outer  join... on...

select employee_id,last_name,e.department_id,department_name
from employees e right outer join departments d
on e.department_id = d.department_id;

(2) +

select employee_id,e.department_id,department_name
from employees e,departments d
where e.department_id(+) = d.department_id;

3.满外连接

满外连接:同时返回左表和右表中不满足条件的行

select employee_id,last_name,e.department_id,department_name
from employees e full outer join departments d
on e.department_id = d.department_id;

四.补充

1.自连接

select emp.employee_id,emp.last_name,mgr.last_name
from employees emp,employees mgr
where emp.manager_id = mgr.employee_id;

Oracle学习笔记_04_多表查询的更多相关文章

  1. oracle系列笔记(2)---多表查询

    多表查询     这篇文章主要讲四点: (1)oracle多表查询    (2)SQL99标准的连接查询   (3)子查询     (4)分级查询 oracle多表查询有两种方式,一种是oracle所 ...

  2. Mybatis学习笔记之---多表查询(1)

    Mybatis多表查询(1) (一)举例(用户和账户) 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) (二)步骤 1.建立两张表:用户表,账户表,让用户表和账户表之 ...

  3. MySQL学习笔记8——多表查询

    多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...

  4. Mybatis学习笔记之---多表查询(2)

    Mybatis多表查询(2) (一)举例 用户和角色 一个用户可以有多个角色,一个角色可以赋予多个用户 (二)步骤 1.建立两张表:用户表,角色表,让用户表和角色表具有多对多的关系.需要使用中间表,中 ...

  5. MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  6. MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)

    mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...

  7. Oracle学习(五):多表查询

    1.知识点:能够对比以下的录屏进行阅读 SQL> --等值连接 SQL> --查询员工信息: 员工号 姓名 月薪 部门名称 SQL> select empno,ename,sal,d ...

  8. mysql学习笔记--数据库多表查询

    一.内连接[inner join] 1. 语法一:select 列名 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 2. 语法二:select 列名 from 表1 ...

  9. mysql学习笔记--数据库单表查询

    一.查询语句 1.  select [选项] 列名 [from 表名]  [where 条件]  [order by 排序]  [group by 分组]  [having 条件]  [limit 限 ...

随机推荐

  1. java面试的那些事

    跳槽面临的第一个难关那就是面试吧.面试的好坏直接关乎着你年薪的多少.如何顺利完成面试的那些难题,今天我们就从java中复习一下.看看经常面试的知识点,为什么面试这些知识点, 如果你是初级的或刚毕业的j ...

  2. Lua string文件类型判断和内容解析

    [1]文件名称类型判断和解析 local fileName = "shanxi201904npsdr1_200000.zip" print("len : " . ...

  3. php编译参数选项 具体参数含义可以用./configure --help来查看

    php编译参数选项  PHP_INSTALL_PATH=/data/web/php MYSQL_INSTALL_PATH=/data/web/mysql ./configure --prefix=${ ...

  4. EL 表达式 函数 操作 字符串

    <%@tablib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> ${fn ...

  5. [原创]aaencode等类似js加密方案破解方法

    受http://tieba.baidu.com/p/4104806767 2L启发,不过他说的方法,我没有尝试成功,自己摸索出了一个新方法,在这里分享下. 首先拿aaencode官网的加密字符串作为例 ...

  6. cocoapods最新使用

    1.首先用淘宝的Ruby镜像来访问CocoaPods,打开终端输入以下命令: (1)gem sources --remove http://ruby.gems.org/   (移除现有Ruby默认源) ...

  7. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之开发游戏界面(二)

    连连看的游戏界面十分简单,大致可以分为两个区域: 游戏主界面区 控制按钮和数据显示区 1.开发界面布局 本程序使用一个RelativeLayout作为整体的界面布局元素,界面布局上面是一个自定义组件, ...

  8. ubuntu编译内核模块报错:Required key not available 的解决

    系统为ubuntu18.04, 在编译内核模块insmod helloworld.ko的时候提示如下错误. 出现此问题的原因是,Ubuntu Kernel 使用 EFI_SECURE_BOOT_SIG ...

  9. Write 语句

    ABAP Write 语句 转载▼http://blog.sina.com.cn/s/blog_5ccd375b0100ghhi.html   1.Write 叙述 ABAP/4 用来在屏幕上输出数据 ...

  10. R中常用数据挖掘算法包

    数据挖掘主要分为4类,即预测.分类.聚类和关联,根据不同的挖掘目的选择相应的算法.下面对R语言中常用的数据挖掘包做一个汇总: 连续因变量的预测: stats包 lm函数,实现多元线性回归 stats包 ...