【数据库】浅显易懂地理解左、右连接

之前一直对数据库里面的外连接有些疑惑,理解的不是很透彻,今天总算自己建了个表,详细地对照了几种写法,总算彻底搞清楚了。

基本概念

左连接、右连接就是数据库里面的关键字  left join 和 right join, 当然在oracle里面也可以在某个字段的后面加上(+)来表示外连接

左连接保留出现在left join左边的关系中的元组,也就是允许右边关系中为空;通俗一点:Left join 会从左表中返回所有的行,即便在右表中没有找到匹配的项。

同理右连接保留出现在right join右边的关系中的元组,也就是允许左边关系中为空;Right join会总右表中返回所有的行,即便在左表中没有找到匹配的项。

在Oracle中

select * from a left join b on a.xxx=b.xxx

select * from a, b where  a.xxx = b.xxx(+)

是等价的。

举例说明

再难理解的知识点放到实际中去操作一下,立刻就能理解地透彻很多。

我们假设现在有两张表 a1 和a2

a1:

a2:

这两个表中有共同的字段id表示相同的含义,bcde字段可以看做不同的4列;

可以看到这两个表中有一个相同的id  1;那如果不做任何选择,a1和a2的笛卡尔积是什么样子呢?

试着执行下列语句:

select * from a1, a2

你会得到如下的结果:

笛卡尔积是个全乘积,但是单单得到笛卡尔积是没有什么用的,因为这个集合很大,而且很多行并没有什么实际意义,这时候就需要加上where语句来选择出真正有用的列

试着执行下列语句:

select a.id, b, c, d, e from a,b where  a.id=b.id;

注意,如果笛卡尔积中的字段是唯一的,可以不用在select的时候标明,也就是说不用写  select a.c , b.d, b.e 等。

这时候得到的结果一定是只有1行的,也就是

这个很容易理解,也是我们最常使用的,那如果我们想得到a1表中的所有id,而无论他在不在a2中呢,改如何做呢?

试试下列语句中的任意一条:

select a.id,b,c,d,e from a,b where a.id=b.id(+);
select a.id,b,c,d,e from a left join b on a.id = b.id;

你会得到什么结果呢?

是的,你会发现我们把a1表中所有的id都选择了出来,如果这个id没有在a2表中出现,那么这一行就会留空。

看到这里,一个更通俗易懂的理解外连接的诀窍就是:+号出现的那一侧允许出现NULL

当然,我们可以通过在d和e字段加上nvl(d,0)语句来把相应的null值改成我们想要的数据。

目的:

到了这里,相信我们已经对外连接有个清晰的认识了,不过为什么我们需要外连接呢??

举个简单的例子,假如a1表是学生信息表,a2表示学生选课表

由于某种特殊原因,学号为201400002的那位女同学就是没有选一门课,不管她是休学1年还是已经修满学分了,就是任性,一门课也不修,那如果我们想统计学生的姓名,年龄,选课信息等等,如果不使用外连接,很容易地就把这位女同学漏掉了,而一个a.id=b.id(+)就足以规避这种特殊情况带来的错误了!

时间: 2024-12-23 02:23:29

【数据库】浅显易懂地理解左、右连接的相关文章

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

Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID 左连接后的检索结果是显示tbl1的所有数据和tbl2中满足where 条件的数据. 简言之 Left Join影响到的是右边的表 Right Join select * from tbl1 Rig

mysql数据库中实现内连接、左连接、右连接

原文:http://www.cnblogs.com/xwdreamer/archive/2010/12/15/2297058.html 内连接:把两个表中数据对应的数据查出来 外连接:以某个表为基础把对应数据查出来 首先创建数据库中的表,数据库代码如下: /* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50150 Source Host : localhost:3306 S

【转】mysql数据库中实现内连接、左连接、右连接

[转]mysql数据库中实现内连接.左连接.右连接 内连接:把两个表中数据对应的数据查出来 外连接:以某个表为基础把对应数据查出来 首先创建数据库中的表,数据库代码如下: /* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50150 Source Host : localhost:3306 Source Database : store Target Server Type

数据库的左连接,右连接,内链接:

先建立数据库,代码如下: create database if not exists "emp"; use emp; drop table if exists "dept"; create table dept( `depid` varchar(50) NOT NULL,    `deptname` varchar(100) default NULL,  PRIMARY KEY  (`depid`) ) engine=innodb default charset=u

数据库中的左连接和右连接的区别

数据库中的左连接和右连接的区别     今天,别人问我一个问题:数据库中的左连接和右连接有什么区别?如果有A,B两张表,A表有3条数据,B表有4条数据,通过左连接和右连接,查询出的数据条数最少是多少条?最多是多少条?     我被这个问题问住了,后来我去问了数据库开发人员,结果结果各种各样:     a 最大12  最小0     b 最大12  最小未知     c 最大未知 最小为3     d 最大12   最小为3     e 不清楚 1.说明 (1)左连接:只要左边表中有记录,数据就能

数据库中内连接和左连接和右连接的区别

假设有两张表: A表有四行四列数据;B表有两行两列数据;它们之间通过ID关联;假设它们之间的ID有两个相同; 则: select * from A a left (outer)  join B  b  on a.bid=b.id; 显示为:A表的四行四列全部显示,而B表满足条件的两条数据则全部显示; A. 1                A.2                      A.3                 A.4                 B.1          

数据库表连接(内连接,外连接【左连接、右连接、全连接】交叉连接)

左连接和右连接: 左连接:以左表为基准进行查询,左表数据全部进行显示,右表中显示与左表匹配的全部数据,不匹配的则显示为null 右连接(与左连接完全相反):以右表为基准进行查询,右表数据全部显示出来,左表中与右表匹配的数据全部显示出来,不匹配的则显示为null 全连接(左连接与右连接的结合体):先以左表为基准进行查询显示,再以右表为基准进行查询显示 基准:以某张表的限制条件查询为准! book表 bookID bookName studentID 1 <红楼梦> 0003 2 <水浒传&

深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转载)

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.     2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEFT

sql 内连接 外连接 左连接 右连接

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEF