JOIN中的外连接(external join)
外连接:
---外连接并不要求连接的两表的每一条记录在对方表中都有一条匹配记录.要保留所有记录(甚至这条记录没有匹配的记录也要保留)的表成为保留表.外连接可以一句连接表保
留左表,右表和全部表的行二进一步分为左外连接、右外连接、全连接.
(在这种情况下left<左>和right<右>表示Join关键字的两边.)
在标准的SQL语言中,外连接没有隐式的连接符号.
外部连接即包含ON子句又包含WHERE子句时,应当只把表之间的连接条件写在ON子句中,对表中数据的筛选必须写在WHERE子句中.
而内部连接的各条件表达式既可以放在ON子句又可以放在WHERE子句中.
这是因为对外部连接,保留表中被ON子句筛除掉的行要被添加回来,在此操作之后才会用WHERE子句取筛选连接结果中的各行.
左外连接
做外连接(left outer join),简称为左连接(left join) RRREWEQW QEQWQw QWe qWEqwEQWEQWEqweQ jjjkkk

- 左外连接会返回左表的所有记录和右表中匹配记录的组合;
- 如果右表中无匹配记录,来自于右表的所有列的值设置NULL;
- 如果左表的一行在右表中存在多个匹配行,那么左表的行会复制和右表匹配行一样的数量,并进行组合生成连接结果.
eg:
SELECT *
FROM employee
LEFT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID;
右外连接

SELECT *
FROM employee
RIGHT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID
显示的右连接很少使用,一般替换成左连接(换换表的位置就可以了),功能相同
SELECT *
FROM department
LEFT OUTER JOIN employee
ON employee.DepartmentID = department.DepartmentID
全连接
全连接是左右外连接的交集.连接表包含被连接的表的所有记录,如果缺少匹配的记录,即以NULL填充.

SELECT *
FROM employee
FULL OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID
Mysql数据库不支持全连接,但可以通过左右外连接的并集(union)来模拟实现.
SELECT *
FROM employee
LEFT JOIN department
ON employee.DepartmentID = department.DepartmentID
UNION
SELECT *
FROM employee
RIGHT JOIN department
ON employee.DepartmentID = department.DepartmentID
WHERE employee.DepartmentID IS NULL
自连接
自连接就是和自身连接
eg:构建一个查询,它试图找到这样的记录:每条记录包含两个雇员,他们来自同一个国家.如果你有两张雇员表(Employee),那么只要第一张表的雇员和第二张表的雇员在同样的国家就行了.你可以用一个铜像的连接(相等连接)操作去得到这个表.不过,这里所有雇员信息都在一张单独的达标例.
| employeeID | LastName | City | DepartmentID |
|---|---|---|---|
| 111 | 小紫 | 上海 | 31 |
| 222 | 小白 | 上海 | 33 |
| 333 | 小蓝 | 上海 | 33 |
| 444 | 小黑 | 广州 | 34 |
| 555 | 小灰 | 北京 | 34 |
| 666 | 小红 | 北京 | NULL |
查询所用SQL:
SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country
FROM Employee F, Employee S
WHERE F.City = S.City
AND F.EmployeeID < S.EmployeeID
ORDER BY F.EmployeeID, S.EmployeeID;
通过City自连接后的雇员表(Employee)
| EmployeeID | LastName | EmployeeID | LastName | City |
|---|---|---|---|---|
| 111 | 小紫 | 222 | 小白 | 上海 |
| 111 | 小紫 | 333 | 小蓝 | 上海 |
| 222 | 小白 | 333 | 小蓝 | 上海 |
| 555 | 小灰 | 666 | 小红 | 北京 |
Notes:
F和S是雇员表的第一个和第二个拷贝的别名条件
F.City = S.City排除了在不同城市的雇员的组合.本实例仅仅期望得到在相同国家的雇员的组合.条件
F.EmployeeID < S.EmployeeID排除了雇员号(EmployeeID)相同的组合.F.EmployeeID < S.EmployeeID排除了重复的组合.没有这个条件,会生成类似下表的无用数据(以北京为例)EmployeeID LastName EmployeeID LastName City 555 小灰 555 小灰 北京 555 小灰 666 小红 北京 666 小红 555 小灰 北京 666 小红 666 小红 北京 只有中间两行满足初始问题的要求(重复的组合),第一行和最后一项对本例无用,但是在
相同的组合的例子中有用
替代方式
外连接查询得到的结果也可以通过关联子查询得到.
eg:
SELECT employee.LastName, employee.DepartmentID,
department.DepartmentName
FROM employee LEFT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID
or:
SELECT employee.LastName, employee.DepartmentID,
(SELECT department.DepartmentName
FROM department
WHERE employee.DepartmentID = department.DepartmentID )
FROM employee
JOIN中的外连接(external join)的更多相关文章
- oracle 内连接(inner join)、外连接(outer join)、全连接(full join)
转自:https://premier9527.iteye.com/blog/1659689 建表语句: create table EMPLOYEE(EID NUMBER,DEPTID NUMBER,E ...
- 外连接OUTER JOIN(三十五)
外连接OUTER JOIN LEFT [OUTER] JOIN,左外连接 显示左表的全部记录及右表符合连接条件的记录 下面我们来演示一下,操作命令及部分结果如下: SELECT goods_id, ...
- python中列表元素连接方法join用法实例
python中列表元素连接方法join用法实例 这篇文章主要介绍了python中列表元素连接方法join用法,实例分析了Python中join方法的使用技巧,非常具有实用价值,分享给大家供大家参考. ...
- Hibernate中用left join(左外连接)查询映射中没有关联关系的两个表记录问题
一.问题背景 分账表split_summary结构如下: create table SPLIT_SUMMARY ( uuid VARCHAR2(32) not null, star_tdate VAR ...
- 数据库中的左连接(left join)和右连接(right join)区别
Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...
- EF Linq中的左连接Left Join查询
linq中的join是inner join内连接,就是当两个表中有一个表对应的数据没有的时候那个关联就不成立. 比如表A B的数据如下 from a in A join b in B on a.BId ...
- 清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问题:找不到SCOTT员工了,只有13条数据,这显然不合理:这就是内连接的缺 ...
- 【SQL】多表查询中的 外连接 ,on,where
先简单粗暴给个结论,多表连结查询中,on比where更早起作用,系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行匹配过滤,where后语句为真,则能查询出来,而通过外连接 ...
- SQL Server中的完全连接(full join)
一.建库和建表 create database scort use scort create table emp ( empno int primary key, ename ), sal int, ...
随机推荐
- 基于socketsever下实现的FTP
# ### 客户端client import socket import json import struct import os sk = socket.socket() sk.connect( ( ...
- express 将 Router 实例模块化
为了更好的组织代码,将 Router 实例进行模块化,将 get / post 等快捷方式放在Router上,而不是 App 上,然后将该 Router 作为中间件,use 到 server.js 上 ...
- [C1W2] Neural Networks and Deep Learning - Basics of Neural Network programming
第二周:神经网络的编程基础(Basics of Neural Network programming) 二分类(Binary Classification) 这周我们将学习神经网络的基础知识,其中需要 ...
- zz高精地图和定位在自动驾驶的应用
本次分享聚焦于高精地图在自动驾驶中的应用,主要分为以下两部分: 1. 高精地图 High Definition Map 拓扑地图 Topological Map / Road Graph 3D栅格地图 ...
- 剑指Offer-5.用两个栈实现队列(C++/Java)
题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析: 栈的特点是先进后出,队列的特点则是先进先出. 题目要求我们用两个栈来实现一个队列,栈和队列都有入栈 ...
- FLOPS
FLOPS FLOPS(Float Operations Per Second):每秒浮点运算量,是衡量吞吐率的一个单位,通过折算到具体的浮点操作数量上. 所谓,吞吐率——就如同水管,每秒可以流出多少 ...
- version_compare ()
version_compare() ----对比两个「PHP 规范化」的版本数字字符串 version_compare ( string $version1 , string $version2 [, ...
- linux jdk1.8 64位下载永久地址,ubuntu,centos,java
https://pan.baidu.com/s/1A4cl3vUWCtiHxJ9eHK2ApQ 密码:j8dg
- 奥展项目笔记06--js弹出框、对话框、提示框、弹窗总结
JS的三种最常见的对话框: //====================== JS最常用三种弹出对话框 ======================== //弹出对话框并输出一段提示信息 functi ...
- java架构之路-(JVM优化与原理)JVM的运行时内存模型
还是我们上次的图,我们上次大概讲解了类加载子系统的执行过程,验证,准备,解析,初始化四个过程.还有我们的双亲委派机制. 我们这次来说一下运行时内存模型.上一段小代码. public class Mai ...