数据库Oracle多表链接
多表查询:
当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询。根据不同表中的数据之间的关系查询相关联的数据。

多表链接方式:
内连接:(等值连接,非等值连接,自连接,SQL99有交叉连接(cross join),内连接(inner join),自然连接(natural join))
连接两个表,通过相等或不等判断链接列,称为内连接。在内连接中典型的联接运算有 = 或 <> 之类的比较运算符。包括 等值联接和自然联接。
外连接:(左外链接,右外连接,全外链接)
在两个表之间的连接,返回内连接的结果,同时还返回不匹配行的左(或右)表的连接,称为左(或右)连接。返回内连 接的结果, 同时还返回左和右连接,称为全连接。
子查询:当一个查询是另一个查询的条件时,称之为子查询。
笛卡尔积:
笛卡尔乘积是指在数学中,两个集合 X 和 Y 的笛卡尓积(Cartesian product),又称直积,表示为 X * Y,第一个对象是 X 的成员而第二个对象是 Y 的所有可能有序对的其中一个成员。
注意:由于笛卡尔积在数据库较大的情况下,很容易使数据库崩溃,所以为了防止笛卡尔积的产生,应该在 WHERE 子句中始终包含一个有效的连接条件。
例:链接俩张表:
SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
Whalen Administration
Fay Marketing
Hartstein Marketing
Tobias Purchasing
Colmenares Purchasing
Baida Purchasing
Raphaely Purchasing
Khoo Purchasing
Himuro Purchasing
Mavris Human Resources
Feeney Shipping
Fleaur Shipping
Fripp Shipping
Gates Shipping
Gee Shipping
Geoni Shipping
Grant Shipping
Jones Shipping
Kaufling Shipping
Ladwig Shipping
多表链接的语法:

• 在 WHERE 子句中写连接条件。
• 当多个表中有相同的列名时,将表名或者表的别名作为列名的前缀。
原则:
• 在写一个连接表的 SELECT 语句时,在列名前面用表名或者表别名可以使语义清楚,并且加快数据库访问。
• 为了连接 n 个表在一起,你最少需要 n-1 个连接条件。例如,为了连接 4 个表,最少需要 3 个连接条件。
等值链接:
等值连接也被称为简单连接 (simple joins) 或内连接 (inner joins)。是通过等号来判断连接条件中的数据值是否相匹配。
抉择矩阵思想:
为什么能思路清晰去关联多张表。我们提出抉择矩阵的思想:

实例:查询所有雇员名字以及他们所在的部门名称。
SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
Whalen Administration
Fay Marketing
Hartstein Marketing
Tobias Purchasing
Colmenares Purchasing
Baida Purchasing
Raphaely Purchasing
Khoo Purchasing
Himuro Purchasing
Mavris Human Resources
Feeney Shipping
Fleaur Shipping
Fripp Shipping
Gates Shipping
Gee Shipping
Geoni Shipping
Grant Shipping
Jones Shipping
Kaufling Shipping
Ladwig Shipping
用 使用 AND 操作符附加搜索条件
当我们需要在查询来张表做关联的时候提出要求,我们就需要用我和where子句,条件多了,就需要用and连接。
示例二:显示同一个部门中所有名字为 Taylor 的雇员的名字和部门号。
SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id and e.last_name='Taylor';
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
Taylor Sales
Taylor Shipping
使用表别名原则:
• 表别名最多可以有 30 个字符,但短一些更好。
• 如果在 FROM 子句中表别名被用于指定的表,那么在整个 SELECT 语句中都可以使用表别名。
• 表别名应该是有意义的。
• 表别名只对当前的 SELECT 语句有效
多于两个表的连接:
实例:查询每个雇员的 last name、departmentname 和 city(city 来源于 locations 表)。
SQL> select e.last_name,d.department_name,l.city from employees e,departments d,locations l where e.department_id=d.department_id and d.location_id=l.location_id;
LAST_NAME DEPARTMENT_NAME CITY
------------------------- ------------------------------ ------------------------------
Abel Sales Oxford
Ande Sales Oxford
Atkinson Shipping South San Francisco
Austin IT Southlake
Baer Public Relations Munich
Baida Purchasing Seattle
Banda Sales Oxford
Bates Sales Oxford
Bell Shipping South San Francisco
Bernstein Sales Oxford
Bissot Shipping South San Francisco
Bloom Sales Oxford
Bull Shipping South San Francisco
Cabrio Shipping South San Francisco
Cambrault Sales Oxford
Cambrault Sales Oxford
Chen Finance Seattle
Chung Shipping South San Francisco
Colmenares Purchasing Seattle
Davies Shipping South San Francisco
实例二:查询 Taylor 的雇员 ID、部门名称、和工作的城市
SQL> select e.employee_id,d.department_name,l.city
2 from employees e,departments d,locations l
3 where e.department_id=d.department_id
4 and d.location_id=l.location_id
5 and e.last_name='Taylor';
EMPLOYEE_ID DEPARTMENT_NAME CITY
----------- ------------------------------ ------------------------------
176 Sales Oxford
180 Shipping South San Francisco
非等值链接:
一个非等值连接是一种不使用相等(=)作为连接条件的查询。如!=、>、<、>=、<=、BETWEEN AND 等都是非等值链接的条件判断。
实例:查询所有雇员的薪水级别
SQL> select e.last_name,e.employee_id,e.salary,gra.gra
2 from employees e,job_grades gra
3 where e.salary<gra.highest_sal
4 and e.salary>gra.lowest_sal;
LAST_NAME EMPLOYEE_ID SALARY GRA
------------------------- ----------- ---------- ----------
King 100 24000.00 E
Kochhar 101 17000.00 E
De Haan 102 17000.00 E
Russell 145 14000.00 D
Partners 146 13500.00 D
Hartstein 201 13000.00 D
Greenberg 108 12008.00 D
Higgins 205 12008.00 D
Errazuriz 147 12000.00 D
Ozer 168 11500.00 D
Raphaely 114 11000.00 D
Cambrault 148 11000.00 D
Abel 174 11000.00 D
Zlotkey 149 10500.00 D
Vishney 162 10500.00 D
Fox 170 9600.00 C
Greene 163 9500.00 C
Bernstein 151 9500.00 C
Sully 157 9500.00 C
Hall 152 9000.00 C
自连接:自己连接自己
示例:查询每个雇员的经理的名字以及雇员的名字。
SQL> select worker.last_name,man.last_name
2 from employees worker,employees man
3 where worker.manager_id=man.employee_id;
LAST_NAME LAST_NAME
------------------------- -------------------------
Smith Cambrault
Ozer Cambrault
Kumar Cambrault
Fox Cambrault
Bloom Cambrault
Bates Cambrault
Hunold De Haan
Vishney Errazuriz
Marvins Errazuriz
Lee Errazuriz
Greene Errazuriz
Banda Errazuriz
Ande Errazuriz
Sarchand Fripp
Olson Fripp
Marlow Fripp
Dellinger Fripp
Cabrio Fripp
Bull Fripp
Bissot Fripp
外连接(OUTER JOIN):
外连接是指查询出符合连接条件的数据同时还包含孤儿数据。左外链接包含左表的孤儿数据,右外连接包含右表的孤儿数据,全外连接包含两个表中的孤儿数据。
孤儿数据(Orphan Data):指被连接的列的值为空的数据
外连接类型:
左外(LEFT OUTER JOIN):包含左表的孤儿数据。
右外(RIGHT OUTER JOIN):包含右表的孤儿数据。
全外(FULL OUTER JOIN):包含两个表中的孤儿数据。
SQL99 中的外连接:
用 LEFT OUTER JOIN | RIGHT OUTER JOIN | FULL OUTER JOIN 定义连接类型,用ON 子句创建连接条件。
左外链接(LEFT OUTER JOIN):
例:用左外链接查询雇员名字以及他们所在的部门名称,包含那些没有部门的雇员。
SQL> select e.last_name,d.department_id
2 from employees e left outer join departments d
3 on e.department_id=d.department_id;
LAST_NAME DEPARTMENT_ID
------------------------- -------------
King 90
Kochhar 90
De Haan 90
Hunold 60
Ernst 60
Hutton 80
Taylor 80
Livingston 80
Grant
Johnson 80
Taylor 50
Fleaur 50
右外链接(RIGHT OUTER JOIN)
例:用右外链接查询雇员名字以及他们所在的部门名称,包含那些没有雇员的部门。
SQL> select e.last_name,d.department_name
2 from employees e right outer join departments d
3 on e.department_id=d.department_id;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
Whalen Administration
Fay Marketing
Hartstein Marketing
Tobias Purchasing
Colmenares Purchasing
Baida Purchasing
Gietz Accounting
Higgins Accounting
Treasury
Corporate Tax
Control And Credit
Shareholder Services
Benefits
Manufacturing
Construction
Contracting
Operations
IT Support
NOC
IT Helpdesk
Government Sales
Retail Sales
Recruiting
Payroll
全外链接(FULL OUTER JOIN)
例:查询所有雇员和部门,包含那些没有雇员的部门以及没有部门的雇员。
SQL> select e.last_name,d.department_name
2 from employees e full outer join departments d
3 on e.department_id=d.department_id;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
King Executive
Kochhar Executive
De Haan Executive
Hunold IT
Abel Sales
Hutton Sales
Taylor Sales
Livingston Sales
Grant
Johnson Sales
aer Public Relations
Higgins Accounting
Gietz Accounting
NOC
Manufacturing
Government Sales
IT Support
Benefits
Shareholder Services
Retail Sales
Control And Credit
Recruiting
Operations
Treasury
Payroll
Corporate Tax
Construction
Contracting
IT Helpdesk
Oracle 扩展的外连接
在 Oracle 数据库中对外连接中的左外与右外连接做了扩展,可以简化外连接的语法通过在连接条件的后侧使用(+)来表示是否显示孤儿数据,有(+)表示不显示孤儿数据而另一侧则显示孤儿数据。 但是该种写法仅能在 Oracle
例:查询雇员名字以及他们所在的部门名称,包含那些没有雇员的部门
SQL> select e.last_name,d.department_name
2 from employees e , departments d
3 where e.department_id(+)=d.department_id;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
Gietz Accounting
Higgins Accounting
Treasury
Corporate Tax
Control And Credit
Shareholder Services
Benefits
Manufacturing
Construction
Contracting
Operations
IT Support
NOC
IT Helpdesk
Government Sales
Retail Sales
Recruiting
Payroll
数据库Oracle多表链接的更多相关文章
- 【c# 数据库】 多表链接
1.inner join string sql = "select * from studentsinfo inner join teacher on teacher.姓名 = studen ...
- oracle 数据库下所有表结构、数据量及缺失值统计
表结构 SELECT t1.TABLE_NAME, t1.COLUMN_NAME, t1.DATA_TYPE || '(' || t1.DATA_LENGTH || ')', t2.COMMENTS ...
- PowerDesigner生成Oracle数据库时,表名会带引号问题
使用PowerDesigner生成数据库建表SQL脚本时,尤其是Oracle数据库时,表名一般会带引号.其实加引号是PL/SQL的规范,数据库会严格按照""中的名称建表,如果没有& ...
- 实例讲解Oracle数据库设置默认表空间问题
实例讲解Oracle数据库设置默认表空间问题 实例讲解Oracle数据库设置默认表空间问题,阅读实例讲解Oracle数据库设置默认表空间问题,DBA们经常会遇到一个这样令人头疼的问题:不知道谁在O ...
- MySQL的链接,查看数据库,使用数据库,查看表
MySQL的链接,查看数据库,使用数据库,查看表 mysql> show databases; +--------------------+ | Database | +------------ ...
- Oracle 数据库(oracle Database)Select 多表关联查询方式
Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...
- Oracle数据库之创建表结构
Oracle数据库之创建表结构 主键与外键 主键:关系型数据库中的一条记录中有若干个属性,若其中的某一个属性组(可以是一个属性,也可以是多个)能唯一标识一条记录,那么该属性组就是主键. 外键:关系型数 ...
- Oracle数据库之创建表空间与用户
Oracle数据库之创建表空间与用户 一.创建表空间 基本语法表述: CREATE TABLESPACE tablespace_name [DATAFILE datafile_spec1 [,data ...
- ORACLE查询数据库的锁表情况
查询数据库的锁表情况语句如下: SELECT p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_na ...
随机推荐
- node.js评论列表和添加购物车数据库表创建
2.1:评论列表--发表评论 用户点击新闻列表某一条新闻,看到新闻详细发表评论 -用户输入评论内容 -发表评论 [将用户评论内容保存数据库 xz_comment] 2.2:评论列表--发表评论-开发评 ...
- 对学习Python自然语言处理的一点儿感悟
研究生阶段,如果一开始找不到知识点,那就结合导师的研究课题以及这个课题设计到的知识领域,扎好基础知识能力.以我研究的自然语言处理领域为例,如果一开始不知道研究点,且又要安排学习计划,那么我会在选择: ...
- 说一说,“NetWork Wall”所用到技术
2010年1月17日,Google在其官方网站上发布了一篇名为<A new approach to China>的博文,在博文中,Google官方透露,将停止过滤搜索结果.在国内市场上停止 ...
- Dubbo的应用
导语:Dubbo是阿里巴巴的一个分布式服务的开源框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000 ...
- .net画二叉树
代码下载地址: 链接: https://pan.baidu.com/s/1bpHayoJ 密码: k6su 接下来看主要代码 1.先构建二叉树的类 public class Node { public ...
- Apache Hudi 介绍与应用
Apache Hudi Apache Hudi 在基于 HDFS/S3 数据存储之上,提供了两种流原语: 插入更新 增量拉取 一般来说,我们会将大量数据存储到HDFS/S3,新数据增量写入,而旧数据鲜 ...
- java版单例模式
单例模式可以说是最常用的设计模式之一,其主要作用就是保证一个类只有一个实例,并且提供一个访问它的全局访问点,严格的控制用户的访问方式. 单例模式又分为懒汉模式和饿汉模式,首先说一下饿汉模式: 饿汉模式 ...
- Nethunter开启ssh服务
### 本节用来纪念我和我的Nethunter SSH服务的血泪史 刚安装好Nethunter后,手机的各种功能也是令我眼花缭乱,对手机是爱不释手,可是,手机开启ssh服务之后,电脑无法连接,这就很尴 ...
- Android、IOS的Fiddler证书安装教程
通过手机连接fiddler实现代理访问,其中必须得安装证书才能生效,那么针对不同的手机连接方式也不一样,分为两类:Android.iOS: Android-Fiddler证书安装: 直接在任意浏览器中 ...
- ansible on aws linux 2
1. 安装epel yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 2. 安 ...