《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() ...
随机推荐
- 《Jave并发编程的艺术》学习笔记(1-2章)
Jave并发的艺术 并发编程的挑战 上下文切换 CPU通过时间片分配算法来循环执行任务,当前时间片执行完之后会切换到下一个任务.但是,切换会保存上一个任务的状态,一遍下次切换回这个任务时,可以再次加载 ...
- android消息处理源码分析
一.简介消息处理机制主要涉及到这几个类:1.Looper2.MessageQueue3.Message4.Handler 二.源码分析 Looper.class的关键源码: //保存Looper对象, ...
- Install Windows 2016 on VirtualBox
Download ISO file for Windows 2016 (180 days free). https://www.microsoft.com/en-us/evalcenter/eval ...
- Windows 安装 Scoop
Scoop介绍 scoop是Windows下的包管理工具 安装环境要求 1,操作环境:win10 2,确保你的 PowerShell 版本 >= 3. win7或许低于3,得升级.如何确认Pow ...
- 异常:System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms FIPS信息标准限值了MD5加密
最近做的winform项目中,有个功能使用了MD5 加密,本地测试是没有问题的,但是上线后有些用户反馈说提示如下错误 一.问题描述 中文版错误截图 英语版错误截图 具体错误信息: 有关调用实时(JIT ...
- javascript面向对象理解的补充
<html> <head> <title>js inherit demo</title> <meta http-equiv="pragm ...
- Kali Linux 渗透测试手册(1.1)安装虚拟机
翻译来自:掣雷小组 成员信息: thr0cyte, Gr33k, 花花, 小丑, R1ght0us, 7089bAt, 一.配置KALI Linux和渗透测试环境 在这一章,我们将覆盖以下内容: 在W ...
- java8 日期时间之间的关系
Class or Enum Year Month Day Hours Minutes Seconds* Zone Offset Zone ID toString Output Where Discu ...
- 【Python实践-5】使用迭代查找一个list中最小和最大值
# -*- coding: utf-8 -*- #使用迭代查找一个list中最小和最大值,并返回一个tuple #遍历list,找到最小值 def findMinAndMax(L): if L==[] ...
- Redis集群架构
Redis集群概述 集群的核心意义只有一个:保证一个节点出现了问题之后,其他的节点可以继续提供服务使用. Redis基础部分讲解过主从配置:对于主从配置可以有两类:一主二从,层级关系.开发者一主二从是 ...