shanzm



1 内连接(inner join)

内连接又称为等值连接(equal join),他是基于两个表之间的某列相等来做连接。

内连接有隐式的连接和显式的连接,二者是一样的,只不过写法不一样。

1.1 隐式的内连接

使用where 子句

select e.ename,d.loc
from EMP as e,DEPT as d
where e.deptno=d.deptno

结果:


EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAME LOC
----------- ---------- --------- ----------- ----------------------- ----------- ----------- ----------- ----------- -------------- -------------
7369 SMITH CLERK 7902 1980-12-17 00:00:00.000 800 NULL 20 20 RESEARCH DALLAS
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00.000 1600 300 30 30 SALES CHICAGO
7521 WARD SALESMAN 7698 1981-02-22 00:00:00.000 1250 500 30 30 SALES CHICAGO
7566 JONES MANAGER 7839 1981-04-02 00:00:00.000 2975 NULL 20 20 RESEARCH DALLAS
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00.000 1250 1400 30 30 SALES CHICAGO
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00.000 2850 NULL 30 30 SALES CHICAGO
7782 CLARK MANAGER 7839 1981-06-09 00:00:00.000 2450 NULL 10 10 ACCOUNTING NEW YORK
7788 SCOTT ANALYST 7566 1982-12-09 00:00:00.000 3000 NULL 20 20 RESEARCH DALLAS
7839 KING PRESIDENT NULL 1981-11-17 00:00:00.000 5000 NULL 10 10 ACCOUNTING NEW YORK
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00.000 1500 0 30 30 SALES CHICAGO
7876 ADAMS CLERK 7788 1983-01-12 00:00:00.000 1100 NULL 20 20 RESEARCH DALLAS
7900 JAMES CLERK 7698 1981-12-03 00:00:00.000 950 NULL 30 30 SALES CHICAGO
7902 FORD ANALYST 7566 1981-12-03 00:00:00.000 3000 NULL 20 20 RESEARCH DALLAS
7934 MILLER CLERK 7782 1982-01-23 00:00:00.000 1300 NULL 10 10 ACCOUNTING NEW YORK (14 行受影响)

1.2 显式的内连接

显示的内连接使用inner join连接两个表,使用on子句做连接条件。

select e.ename,d.loc
from EMP as e inner join DEPT as d
on e.deptno=d.deptno

结果如上,和隐式的内连接是一样的。



2 外连接(outer join)

外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。

2.1 左连接(left outer join)

左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

例如:

select d.*,e.*
from dept d left outer join emp e
on (d.deptno = e.deptno)

结果将返回左侧表dept的所有行

结果:

DEPTNO      DNAME          LOC           EMPNO       ENAME      JOB       MGR         HIREDATE                SAL         COMM        DEPTNO
----------- -------------- ------------- ----------- ---------- --------- ----------- ----------------------- ----------- ----------- -----------
10 ACCOUNTING NEW YORK 7782 CLARK MANAGER 7839 1981-06-09 00:00:00.000 2450 NULL 10
10 ACCOUNTING NEW YORK 7839 KING PRESIDENT NULL 1981-11-17 00:00:00.000 5000 NULL 10
10 ACCOUNTING NEW YORK 7934 MILLER CLERK 7782 1982-01-23 00:00:00.000 1300 NULL 10
20 RESEARCH DALLAS 7369 SMITH CLERK 7902 1980-12-17 00:00:00.000 800 NULL 20
20 RESEARCH DALLAS 7566 JONES MANAGER 7839 1981-04-02 00:00:00.000 2975 NULL 20
20 RESEARCH DALLAS 7788 SCOTT ANALYST 7566 1982-12-09 00:00:00.000 3000 NULL 20
20 RESEARCH DALLAS 7876 ADAMS CLERK 7788 1983-01-12 00:00:00.000 1100 NULL 20
20 RESEARCH DALLAS 7902 FORD ANALYST 7566 1981-12-03 00:00:00.000 3000 NULL 20
30 SALES CHICAGO 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00.000 1600 300 30
30 SALES CHICAGO 7521 WARD SALESMAN 7698 1981-02-22 00:00:00.000 1250 500 30
30 SALES CHICAGO 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00.000 1250 1400 30
30 SALES CHICAGO 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00.000 2850 NULL 30
30 SALES CHICAGO 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00.000 1500 0 30
30 SALES CHICAGO 7900 JAMES CLERK 7698 1981-12-03 00:00:00.000 950 NULL 30
40 OPERATIONS BOSTON NULL NULL NULL NULL NULL NULL NULL NULL (15 行受影响)

2.2 右连接(right outer join)

右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

例如:

select e.*,d.*
from emp e right outer join dept d
on e.deptno= d.deptno

结果将返回右侧表dept的所有行

结果:

EMPNO       ENAME      JOB       MGR         HIREDATE                SAL         COMM        DEPTNO      DEPTNO      DNAME          LOC
----------- ---------- --------- ----------- ----------------------- ----------- ----------- ----------- ----------- -------------- -------------
7782 CLARK MANAGER 7839 1981-06-09 00:00:00.000 2450 NULL 10 10 ACCOUNTING NEW YORK
7839 KING PRESIDENT NULL 1981-11-17 00:00:00.000 5000 NULL 10 10 ACCOUNTING NEW YORK
7934 MILLER CLERK 7782 1982-01-23 00:00:00.000 1300 NULL 10 10 ACCOUNTING NEW YORK
7369 SMITH CLERK 7902 1980-12-17 00:00:00.000 800 NULL 20 20 RESEARCH DALLAS
7566 JONES MANAGER 7839 1981-04-02 00:00:00.000 2975 NULL 20 20 RESEARCH DALLAS
7788 SCOTT ANALYST 7566 1982-12-09 00:00:00.000 3000 NULL 20 20 RESEARCH DALLAS
7876 ADAMS CLERK 7788 1983-01-12 00:00:00.000 1100 NULL 20 20 RESEARCH DALLAS
7902 FORD ANALYST 7566 1981-12-03 00:00:00.000 3000 NULL 20 20 RESEARCH DALLAS
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00.000 1600 300 30 30 SALES CHICAGO
7521 WARD SALESMAN 7698 1981-02-22 00:00:00.000 1250 500 30 30 SALES CHICAGO
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00.000 1250 1400 30 30 SALES CHICAGO
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00.000 2850 NULL 30 30 SALES CHICAGO
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00.000 1500 0 30 30 SALES CHICAGO
7900 JAMES CLERK 7698 1981-12-03 00:00:00.000 950 NULL 30 30 SALES CHICAGO
NULL NULL NULL NULL NULL NULL NULL NULL 40 OPERATIONS BOSTON

2.3 全外连接(full outer join)

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

例如:

select d.* ,e.*
from emp e full outer join dept d
on e.deptno= d.deptno

结果:

DEPTNO      DNAME          LOC           EMPNO       ENAME      JOB       MGR         HIREDATE                SAL         COMM        DEPTNO
----------- -------------- ------------- ----------- ---------- --------- ----------- ----------------------- ----------- ----------- -----------
20 RESEARCH DALLAS 7369 SMITH CLERK 7902 1980-12-17 00:00:00.000 800 NULL 20
30 SALES CHICAGO 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00.000 1600 300 30
30 SALES CHICAGO 7521 WARD SALESMAN 7698 1981-02-22 00:00:00.000 1250 500 30
20 RESEARCH DALLAS 7566 JONES MANAGER 7839 1981-04-02 00:00:00.000 2975 NULL 20
30 SALES CHICAGO 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00.000 1250 1400 30
30 SALES CHICAGO 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00.000 2850 NULL 30
10 ACCOUNTING NEW YORK 7782 CLARK MANAGER 7839 1981-06-09 00:00:00.000 2450 NULL 10
20 RESEARCH DALLAS 7788 SCOTT ANALYST 7566 1982-12-09 00:00:00.000 3000 NULL 20
10 ACCOUNTING NEW YORK 7839 KING PRESIDENT NULL 1981-11-17 00:00:00.000 5000 NULL 10
30 SALES CHICAGO 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00.000 1500 0 30
20 RESEARCH DALLAS 7876 ADAMS CLERK 7788 1983-01-12 00:00:00.000 1100 NULL 20
30 SALES CHICAGO 7900 JAMES CLERK 7698 1981-12-03 00:00:00.000 950 NULL 30
20 RESEARCH DALLAS 7902 FORD ANALYST 7566 1981-12-03 00:00:00.000 3000 NULL 20
10 ACCOUNTING NEW YORK 7934 MILLER CLERK 7782 1982-01-23 00:00:00.000 1300 NULL 10
40 OPERATIONS BOSTON NULL NULL NULL NULL NULL NULL NULL NULL (15 行受影响)



3 自连接(self-join)

自连接是连接的一种用法,但并不是连接的一种类型,因为他的本质是把一张表当成两张表来使用。

使用自连接就伴随着使用表的别名,可以给同一张表起不同的别名,所以一张表可以当作几张表来用。

自连接的一个重要作用就是可以代替对一张表的多次查询(嵌套子查询)。

举一个简单的例子:

有一张顾客表Customers,三列,分别是订货公司的标号,名字,和联系人

其中有一个订货公司3有两个联系人,分别是小红和小亮

Customers表

cust_no cust_name cust_contact
001 公司1 小明
002 公司2 小亮
003 公司3 小红
004 公司3 小军

先在要找到小红公司的所有联系人

select cust_contact
from Cumstomers
where cust_name=
(
select cust_name
from Customers
where cust_contact='小红'
)

结果:

cust_name
小红
小亮

我们其实可以使用自查询

select c1.cust_contact
from Cumstomers c1,Cumstomers c2
where c1.cust_name=c2.cust_name
and c2.cust_contact='小红'

结果:

cust_name
小红
小亮

注意上面的SQL语句是查询的c1表中的列

注意c1和c2在中表的顺序(和直觉是不一样的)

其中中间表是

cust_no cust_name cust_contact cust_no cust_name cust_contact
001 公司1 小明 001 公司1 小明
002 公司2 小亮 002 公司2 小亮
003 公司3 小红 003 公司3 小红
004 公司3 小军 003 公司3 小红
003 公司3 小红 004 公司3 小军
004 公司3 小军 004 公司3 小军



4 自然连接(natural join)

无论何时对表进行联结,应该至少有一列不止出现在一个表中(被联结的列)。标准的联结(内联结)返回所有数据,相同的列甚至多次出现。自然联结排除相同列的多次出现,使每一列只返回一次。



5 交叉连接

交叉连接是不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积



《SQL CookBook 》笔记-第三章-多表查询-连接查询的更多相关文章

  1. 《SQL CookBook 》笔记-第三章-多表查询

    目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...

  2. sql学习笔记(三)—— 联表查询

    上篇写了一些sql查询的知识,这篇接着写一下有关联表查询的知识. 既然是联表查询,那肯定得多个表啊,所以,我们先创建一个教师表,表名为 teacher,并且向表中插入数据. 准备工作: 创建表语句: ...

  3. [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设

    [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设 敲黑板!! <q>元素添加短引用,<blockquote>添加长引用 在段落里添加引用就使用< ...

  4. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  5. Android群英传笔记——第三章:Android控件架构与自定义控件讲解

    Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...

  6. 《DOM Scripting》学习笔记-——第三章 DOM

    <Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...

  7. 《Linux内核设计与分析》第六周读书笔记——第三章

    <Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...

  8. spring boot 笔记--第三章

    spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...

  9. The Road to learn React书籍学习笔记(第三章)

    The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...

随机推荐

  1. HTML5将footer置于页面最底部的方法(CSS+JS)

    JavaScript: <script type="text/javascript"> $(function(){ function footerPosition(){ ...

  2. geoserver发布mysql表数据

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.环境部署 Geoserver中并不自带mysql数据发布功能,需要下 ...

  3. Android Studio 受不了了

    今天遇到一个问题,受不了了,来吐槽一下: Android Studio 里面创建两个工程:app, baselib.一个是App 一个是库.编译不过去. targetSdkVersion 26 imp ...

  4. 20190429 - 如何访问 macOS 的 httpd、mysql 等服务

    问题:在局域网,通过其它机器访问 macOS 上的服务时,提示拒绝. 解决:将 macOS 防火墙 80.3306 端口打开. macOS 内置防火墙,也许开启了防火墙.Icefloor 是一个老牌的 ...

  5. centos7 ambari2.6.1.5+hdp2.6.4.0 大数据集群安装部署

    前言 本文是讲如何在centos7(64位) 安装ambari+hdp,如果在装有原生hadoop等集群的机器上安装,需要先将集群服务停掉,然后将不需要的环境变量注释掉即可,如果不注释掉,后面虽然可以 ...

  6. 最短路问题之Dijkstra算法

    题目: 在上一篇博客的基础上,这是另一种方法求最短路径的问题. Dijkstra(迪杰斯特拉)算法:找到最短距离已经确定的点,从它出发更新相邻顶点的最短距离.此后不再关心前面已经确定的“最短距离已经确 ...

  7. Vue(day8)

    继续上一篇文章的内容,本文主要内容为项目中新闻资讯模块的实现. 新闻资讯页面主要是当我们点击这个按钮时跳转到新闻列表界面. 一.新闻资讯的路由设计 将新闻资讯的标签改为路由:(a标签改为router- ...

  8. Python基础(random模块)

    random 常用的方法: #Author : Kelvin #Date : 2019/1/6 15:33 import random print(random.random()) #产生0-1之间的 ...

  9. 虎牙直播张波:掘金Nginx日志

    大家好!我是来自虎牙直播技术保障部的张波.今天主要会从数据挖掘层面跟大家探讨一下 Nginx 的价值.OpenResty 在虎牙的应用场景主要 WAF 和流控等方面,我今天主要分享的是“ Nginx ...

  10. Java 插入附件到PDF文档

    在文档中插入附件,可以起到与源文档配套使用的目的,以一种更简便的方式对文档起到补充说明的作用.下面将介绍通过Java编程插入附件到PDF文档中的方法.这里插入的文档可以是常见的文档类型,如Word.E ...