《SQL CookBook 》笔记-第三章-多表查询-连接查询
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 》笔记-第三章-多表查询-连接查询的更多相关文章
- 《SQL CookBook 》笔记-第三章-多表查询
目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...
- sql学习笔记(三)—— 联表查询
上篇写了一些sql查询的知识,这篇接着写一下有关联表查询的知识. 既然是联表查询,那肯定得多个表啊,所以,我们先创建一个教师表,表名为 teacher,并且向表中插入数据. 准备工作: 创建表语句: ...
- [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设
[HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设 敲黑板!! <q>元素添加短引用,<blockquote>添加长引用 在段落里添加引用就使用< ...
- JVM学习笔记-第三章-垃圾收集器与内存分配策略
JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...
- Android群英传笔记——第三章:Android控件架构与自定义控件讲解
Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...
- 《DOM Scripting》学习笔记-——第三章 DOM
<Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...
- 《Linux内核设计与分析》第六周读书笔记——第三章
<Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...
- spring boot 笔记--第三章
spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...
- The Road to learn React书籍学习笔记(第三章)
The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...
随机推荐
- HTML5将footer置于页面最底部的方法(CSS+JS)
JavaScript: <script type="text/javascript"> $(function(){ function footerPosition(){ ...
- geoserver发布mysql表数据
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.环境部署 Geoserver中并不自带mysql数据发布功能,需要下 ...
- Android Studio 受不了了
今天遇到一个问题,受不了了,来吐槽一下: Android Studio 里面创建两个工程:app, baselib.一个是App 一个是库.编译不过去. targetSdkVersion 26 imp ...
- 20190429 - 如何访问 macOS 的 httpd、mysql 等服务
问题:在局域网,通过其它机器访问 macOS 上的服务时,提示拒绝. 解决:将 macOS 防火墙 80.3306 端口打开. macOS 内置防火墙,也许开启了防火墙.Icefloor 是一个老牌的 ...
- centos7 ambari2.6.1.5+hdp2.6.4.0 大数据集群安装部署
前言 本文是讲如何在centos7(64位) 安装ambari+hdp,如果在装有原生hadoop等集群的机器上安装,需要先将集群服务停掉,然后将不需要的环境变量注释掉即可,如果不注释掉,后面虽然可以 ...
- 最短路问题之Dijkstra算法
题目: 在上一篇博客的基础上,这是另一种方法求最短路径的问题. Dijkstra(迪杰斯特拉)算法:找到最短距离已经确定的点,从它出发更新相邻顶点的最短距离.此后不再关心前面已经确定的“最短距离已经确 ...
- Vue(day8)
继续上一篇文章的内容,本文主要内容为项目中新闻资讯模块的实现. 新闻资讯页面主要是当我们点击这个按钮时跳转到新闻列表界面. 一.新闻资讯的路由设计 将新闻资讯的标签改为路由:(a标签改为router- ...
- Python基础(random模块)
random 常用的方法: #Author : Kelvin #Date : 2019/1/6 15:33 import random print(random.random()) #产生0-1之间的 ...
- 虎牙直播张波:掘金Nginx日志
大家好!我是来自虎牙直播技术保障部的张波.今天主要会从数据挖掘层面跟大家探讨一下 Nginx 的价值.OpenResty 在虎牙的应用场景主要 WAF 和流控等方面,我今天主要分享的是“ Nginx ...
- Java 插入附件到PDF文档
在文档中插入附件,可以起到与源文档配套使用的目的,以一种更简便的方式对文档起到补充说明的作用.下面将介绍通过Java编程插入附件到PDF文档中的方法.这里插入的文档可以是常见的文档类型,如Word.E ...