如果一个查询同时涉及两个以上的表,则称之为链接查询,链接查询是关系数据库中最主要的查询,主要包括等值链接查询、非等值链接查询、自身链接查询、外链接查询和复合条件链接查询。 
这篇博文我们来对多表链接进行学习。

Outline

Notes

## 链接的基本概念

  • 链接是在多个表之间通过一定的链接条件,使表之间发生关联,进而能从多个表之间获取数据。
  • 语法为
    SELECT    table1.column, table2.column
    FROM table1, table2
    WHERE table1.column1 = table2.column2;
  • 在 WHERE子句中书写链接条件。N个表相连时,至少需要N-1个链接条件。
  • 如果在多个表中出现相同的列名,则需要使用表名作为来自该表的列名的前缀。

【链接的分类】

  一个用户查询请求涉及到多个表的时候,链接两个表的条件为=时,就是等值链接查询;其他的运算符链接的就是非等值查询。 注意:链接条件中的各链接字段类型必须是可比的,但不必是相同的,整型和实型是可比的,但是字符型和整型就不可比。

  内连接,也被称为自然连接,只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中所有相匹配的数据,舍弃了不匹配的数据。

  外连接不仅包含符合连接条件的行,还包含左表(左连接时)、右表(右连接时)或两个边接表(全外连接)中的所有数据行。

## Oracle自有的连接方法(select from语句)

【等值连接】

链接两个表的条件为=时,就是等值链接查询

SQL> SELECT     emp.empno,   emp.ename, emp.deptno, dept.deptno, dept.loc
2 FROM emp, dep
3 WHERE emp.deptno=dept.deptno;

注意:我们还可以使用And运算符添加其他查询条件,如:

注意:我们还可以用列别名提高性能和限制歧义列名

  • 在用到多个表时可以使用表名作前缀来限定列;
  • 通过使用表前缀可以提高性能;
  • 通过使用列的别名可以区分来自不同表但是名字相同的列;

如:

【非等值连接】

SQL>    SELECT  e.ename, e.sal, s.grade
2 FROM emp e, salgrade s
3 WHERE e.sal
4 BETWEEN s.losal AND s.hisal;

【自身连接】

   一个表与自己进行连接,这种连接称为表的自身连接查询。 
  具体实现的时候,我们可以把自己的表起两个别名,一个是first, 一个是second.在设计的时候可以把这两个表想成是完全两个一样的表,但是各自的字段我们都可以只有调用访问。

SQL> SELECT worker.ename||' leader is '||manager.ename
2 FROM emp worker, emp manager
3 WHERE worker.mgr = manager.empno;

## SQL标准语法连接方法

【交叉连接】

  • 交叉连接会产生连个表的交叉乘积,和两个表之间的笛卡尔积是一样的;
  • 交叉连接使用 CROSS JOIN 子句完成。
  • 笛卡尔积: 第一个表中的所有行和第二个表中的所有行都发生连接。
  • 笛卡尔积在下列情况产生:
    • 连接条件被省略
    • 连接条件是无效的
  • 为了避免笛卡尔积的产生,通常需要在WHERE子句中包含一个有效的连接条件。
<--笛卡尔积写法-->
SQL> SELECT emp.empno, emp.ename, emp.deptno,dept.deptno, dept.loc
FROM emp, dept; <--交叉连接写法-->
SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.loc
FROM emp
CROSS JOIN dept;

【自然连接】

  • 自然连接是对两个表之间相同名字和数据类型的列进行的等值连接;
  • 如果两个表之间相同名称的列的数据类型不同,则会产生错误;
  • 使用NATURAL JOIN子句来完成。如:
    SELECT  empno,ename,sal,deptno,loc
    FROM emp
    NATURAL JOIN dept;

【Using和On语句】

自然连接是使用所有名称和数据类型相匹配的列作为连接条件,而USING子句可以指定用某个或某几个相同名字和数据类型的列作为连接条件,如:

SELECT     e.ename,e.ename,e.sal,deptno,d.loc
FROM emp e JOIN dept d USING (deptno)
WHERE deptno = 20 ;
  • 使用USING子句创建连接时,应注意以下几点:

    • 如果如果有若干个列名称相同但数据类型不同,自然连接子句可以用USING子句来替换,以指定产生等值连接的列
    • 有多于一个列都匹配的情况,使用USING子句只能指定其中的一列
    • USING子句中的用到的列不能使用表名和别名作为前缀
    • NATURAL JOIN子句和USING子句是相互排斥的,不能同时使用
  • On语句:
    • 自然连接条件基本上是具有相同列名的表之间的等值连接;
    • 如果要指定任意连接条件,或指定要连接的列,则可以使用ON子句;
    • 用ON将连接条件和其它检索条件分隔开,其它检索条件写在WHERE子句
    • ON子句可以提高代码的可读性
SELECT     e.empno, e.ename, d.loc,m.ename
FROM emp e
JOIN dept d
ON e.deptno = d.deptno
JOIN emp m
ON e.mgr = m.empno;

【左外连接、右外连接、全连接】

  • 外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
  • 三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:
    • 左外连接(⟕)还返回左表中不符合连接条件单符合查询条件的数据行。
    • 右外连接(⋉)还返回右表中不符合连接条件单符合查询条件的数据行。
    • 全外连接()还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。
  • 说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。在三种类型的外连接中,OUTER 关键字是可省略的。
<--左外连接-->
SELECT e.ename,e.deptno,d.loc
FROM emp e
LEFT OUTER JOIN dept d
ON (e.deptno = d.deptno);

<--右外连接-->
SELECT e.ename,e.deptno,d.loc
FROM emp e
RIGHT OUTER JOIN dept d
ON (e.deptno = d.deptno);

<--全连接-->
SELECT e.ename,e.deptno,d.loc
FROM emp e
FULL OUTER JOIN dept d
ON (e.deptno = d.deptno);

【东软实训】SQL多表链接的更多相关文章

  1. 逆袭之旅DAY14.东软实训.Oracle.多表连接、分组函数、子查询

    2018-07-10 08:29:55 思考应用场景 异常数据的测试 6.显示能挣得奖金的雇员的姓名.工资.奖金,并以工资和奖金降序排列.select ename,sal,commfrom empWH ...

  2. 【东软实训】SQL函数

    SQL函数 SQL是用于访问和处理数据库的标准的计算机语言,我们所使用的的是Oracle SQL 一个数据库通常包含一个或多个表,每个表有一个名字表示,下图即为一个名为“emp”的表,接下来的操作都将 ...

  3. 【东软实训】SQLselect及其相关操作

    SQL select 及相关操作 SQL是用于访问和处理数据库的标准的计算机语言,我们所使用的的是Oracle SQL 一个数据库通常包含一个或多个表,每个表有一个名字表示,下图即为一个名为“emp” ...

  4. 东软实训4-JDBC连接数据库

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

  5. 东软实训3-servlet基础

    Java Servlet技术的核心就是在服务端创建能响应用户请求的对象,被创建的对象习惯上称为一个Servlet对象. 编写一个创建servlet对象的类就是编写一个特殊类的子类,这个特殊的类就是ja ...

  6. 逆袭之旅DAY17.东软实训.Oracle.PLSQL.过程,函数,包,练习

    2018-07-13 14:54:46 --1.创建一个包,包含一个为雇员加薪的过程,一个为雇员减薪的过程 CREATE OR REPLACE PACKAGE pac_test1 IS PROCEDU ...

  7. 逆袭之旅DAY16.东软实训.Oracle.匿名块

    2018-07-1216:41:19 六.匿名块 .定义匿名块: declare 定义部分: ---可选部分 begin 执行部分: ---必选部分 exception 异常处理部分: ---可选部分 ...

  8. 逆袭之旅DAY16.东软实训.Oracle.索引

    2018-07-12 14:44:27 四.索引1.创建索引手动创建:create index 索引名 on 表名(列名,[列名,...])create table employee(pno numb ...

  9. 逆袭之旅DAY16.东软实训.Oracle.序列

    2018-07-12 14:07:44 序列 序列1.创建序列create sequence 序列名 [increment by n] ---步长 [start with n] ---序列的起始值 序 ...

随机推荐

  1. 关于ArcGis for javascript的使用

    1.引用ArcGis for javascript核心类库的两种方式: 1.1.下载js包,解压缩放入项目中 1.1.1.下载核心类库压缩文件, 下载地址: https://developers.ar ...

  2. 关于JAVA通过REST接口对arcGis Server数据进行增删改查

    一: 添加要素 public void create(BoxVo boxVo) throws Exception { // 创建HTTP客户端 CloseableHttpClient httpclie ...

  3. vi常用设置

    vi不能使用退格键和上下左右键 因为ubuntu默认安装的是vim-tiny,所以需要安装完整版本 apt-get install vim 安装完再使用就可以了 vi本身是不带颜色的,vim带颜色,使 ...

  4. bzoj P1979 华容道【bfs+spfa】

    调死我了-- 首先观察移动方式,需要移动的格子每次移动到相邻格子,一定是先把空白格子挪过去,所以我们得到一种做法,就是bfs预处理出每一个格子的四联通格子之间的空白格子移动距离建边,注意这个移动是不能 ...

  5. hdu 5201 The Monkey King【容斥原理+组合数学】

    原来我一开始以为的\( O(n^2) \)是调和级数\( O(nlog_2n) \)的! 首先枚举猴王的桃子个数\( x \),然后使用容斥原理,枚举有至少\( k \)个不满足的条件,那么这\( k ...

  6. app 后台程序设计

    限制客户端一分钟之内访问接口的次数 1.设备的唯一标识获取这个实际上IOS7后会存在问题,权限已经收回了,android可以2.唯一标识可以通过生成一个token区分3.每分钟的频率可以这样设置 ke ...

  7. java中WGS84坐标(ios)转换BD-09坐标(百度坐标)

    iPhone的GPS定位(CLLocationManager)获得的经纬坐标是基于WGS-84坐标系(世界标准),Google地图使用的是GCJ-02坐标系(中国特色的火星坐标系),百度的经纬坐标在G ...

  8. SpringBoot项目docker化

    前言 有很多种方案构建Docker镜像,包括Dockerfile构建.maven插件构建,这里我使用了最简单的Dockerfile构建的. 一.安装Docker 我的虚拟机系统是CentOS7,需要是 ...

  9. 操作JavaScript的Alert弹框

    @Testpublic void testHandleAlert(){ WebElement button =driver.findElement(By.xpath("input" ...

  10. LD_LIBRARY_PATH与-L的关系以及延伸

    最近跟同学讨论c++在编译时g++ -L.. 和LD_LIBRARY_PATH的问题,今天在做一个东西的时候发现,我对这两个东西的理解是错误的,经过一番研究,写下我对这些东西的想法,如果有不对的地方, ...