外连接:

---外连接并不要求连接的两表的每一条记录在对方表中都有一条匹配记录.要保留所有记录(甚至这条记录没有匹配的记录也要保留)的表成为保留表.外连接可以一句连接表保
留左表,右表和全部表的行二进一步分为左外连接、右外连接、全连接.

(在这种情况下left<左>和right<右>表示Join关键字的两边.)

在标准的SQL语言中,外连接没有隐式的连接符号.

外部连接即包含ON子句又包含WHERE子句时,应当只把表之间的连接条件写在ON子句中,对表中数据的筛选必须写在WHERE子句中.

而内部连接的各条件表达式既可以放在ON子句又可以放在WHERE子句中.

这是因为对外部连接,保留表中被ON子句筛除掉的行要被添加回来,在此操作之后才会用WHERE子句取筛选连接结果中的各行.

左外连接

做外连接(left outer join),简称为左连接(left join) RRREWEQW QEQWQw QWe qWEqwEQWEQWEqweQ jjjkkk

  1. 左外连接会返回左表的所有记录和右表中匹配记录的组合;
  2. 如果右表中无匹配记录,来自于右表的所有列的值设置NULL;
  3. 如果左表的一行在右表中存在多个匹配行,那么左表的行会复制和右表匹配行一样的数量,并进行组合生成连接结果.

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:

  • FS是雇员表的第一个和第二个拷贝的别名

  • 条件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)的更多相关文章

  1. oracle 内连接(inner join)、外连接(outer join)、全连接(full join)

    转自:https://premier9527.iteye.com/blog/1659689 建表语句: create table EMPLOYEE(EID NUMBER,DEPTID NUMBER,E ...

  2. 外连接OUTER JOIN(三十五)

    外连接OUTER JOIN   LEFT [OUTER] JOIN,左外连接 显示左表的全部记录及右表符合连接条件的记录 下面我们来演示一下,操作命令及部分结果如下: SELECT goods_id, ...

  3. python中列表元素连接方法join用法实例

    python中列表元素连接方法join用法实例 这篇文章主要介绍了python中列表元素连接方法join用法,实例分析了Python中join方法的使用技巧,非常具有实用价值,分享给大家供大家参考. ...

  4. Hibernate中用left join(左外连接)查询映射中没有关联关系的两个表记录问题

    一.问题背景 分账表split_summary结构如下: create table SPLIT_SUMMARY ( uuid VARCHAR2(32) not null, star_tdate VAR ...

  5. 数据库中的左连接(left join)和右连接(right join)区别

    Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...

  6. EF Linq中的左连接Left Join查询

    linq中的join是inner join内连接,就是当两个表中有一个表对应的数据没有的时候那个关联就不成立. 比如表A B的数据如下 from a in A join b in B on a.BId ...

  7. 清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

    直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问题:找不到SCOTT员工了,只有13条数据,这显然不合理:这就是内连接的缺 ...

  8. 【SQL】多表查询中的 外连接 ,on,where

    先简单粗暴给个结论,多表连结查询中,on比where更早起作用,系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行匹配过滤,where后语句为真,则能查询出来,而通过外连接 ...

  9. SQL Server中的完全连接(full join)

    一.建库和建表 create database scort use scort create table emp ( empno int primary key, ename ), sal int, ...

随机推荐

  1. AtCoder - 2565(思维+暴力)

    题意 https://vjudge.net/problem/AtCoder-2565 将一个H*W的矩形切成三份,每一次只能水平或者垂直切,问最大块的面积-最小快的面积 的最小值是多少. 思路 先枚举 ...

  2. C学习笔记(1)---数据类型,变量,储存类

    1.常用基本数据类型占用空间(64位机器为例): char : 1个字节 -- int :4个字节 -- float:4个字节 -- double:8个字节 2.书写类型: A.整数: a. 默认为1 ...

  3. 201271050130-滕江南-《面向对象程序设计(java)》第十六周学习总结

    201271050130-滕江南-<面向对象程序设计(java)>第十六周学习总结 博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.c ...

  4. TeamyinyinFish-> 测试报告

    测试人员 1. 姓名:鱼嘤嘤 2. 年龄: 21 3. 职业: 大三学生 4. 感情状况: 单身 用户故事 软件工程课上,老师想要他们组实现一个小组项目,鱼嘤嘤原本想摸鱼,但是转念一想觉得 还是需要好 ...

  5. VMWare虚拟机提示:另一个程序已锁定文件的一部分,打不开磁盘...模块"Disk"启动失败的解决办法

    重启了电脑之后,打开VMware就发现出现了“锁定文件失败,打不开磁盘......模块"Disk"启动失败.”这些文字 为什么会出现这种问题: 这是因为虚拟机在运行的时候,会锁定文 ...

  6. vue 使用watch监听实现类似百度搜索功能

    watch监听方法,watch可以监听多个变量,具体使用方法看代码: HTML: <!doctype html> <html lang="en"> < ...

  7. LuaFramework 学习

    LuaFramework_UGUI_V2 https://github.com/jarjin/LuaFramework_UGUI_V2 using UnityEngine; using LuaInte ...

  8. 如何在Console下面生成一个WIN32窗口

    一个小挑战? VS2017里面,新建一个控制台工程,输入名字(你不需要也成,有默认的),得到一个控制台工程. 好了,生成的代码,如下: // Win32InConsole.cpp : This fil ...

  9. 解决office365无法登录以及同步的问题

    解决office365无法登录以及同步的问题 You better need to test them one by one. You better need to test them one by ...

  10. Javal连载4-注释&class与public class区别

    一.Java注释 1.作用:不会编译倒.class文件之中:增强可读性 2.分类: (1)单行注释(只注释当前行):// (2)多行注释: /* 注释 注释 注释 */ (3)javadoc注释 /* ...