深入理解数据库中的各种连接

按照我的理解,我将数据库中的连接分类为广义内连接和外连接,如下图,稍后我将解释我为什么这么分。
在这里插入图片描述

1 广义内连接(交叉连接)

所有的广义内连接的核心和共同点是完全基于笛卡尔积原理的,两个表进行笛卡尔积运算得到的结果表是由第一个表的每一行与第二个表的每一行拼接后形成的表,称为‘笛卡尔积表’,结果表的行数等于两个表的行数之积,接下来介绍的所有广义内连接的结果都能在笛卡尔积表里找到。两个表直接做笛卡尔积运算:

-- 写法1,INNER可省略
SELECT * from1 [INNER] JOIN2-- 写法2
SELECT * from1,表2

注意,这里没有任何限制和条件,这种联结称为交叉连接,得到的结果就是两个表的笛卡尔积,这是所有广义内连接的基础,所有广义内连接在原理上都是通过在笛卡尔积的基础上进行过滤得到的。

1.1 内连接(等值连接)

现在我们要在笛卡尔积的基础上进行过滤了,以选择我们需要的记录(行):

-- 写法1:显式内连接,通过ON进行过滤
SELECT * from1 [INNER] JOIN2 ON 等值条件;
-- 写法2:隐式内连接,通过WHERE进行过滤
SELECT * from1,表2 WHERE 等值条件;

注意这里的条件是等值条件,一般类似 表1.字段1=表2.字段2 这种(字段就是列),所以内连接又称为等值连接。

1.2 自然连接

上面提到内连接是对行进行过滤,那可不可以对列进行过滤哪?当然可以。一般的情况就是当我们对两个表进行交叉连接后,会有重复的列,即此列在两个表里同时存在,自然连接会排除多次出现的列,使每一列只返回一次。怎样完成这项工作呢?答案是,系统不完成这项工作,由你自己完成它。自然连接要求你只能选择那些唯一的列,一般通过对一个表使用通配符(SELECT *),而对其他表的列使用明确的子集来完成:

-- 写法1
SELECT1.*,2.不包含重复列的其他列 from1 [INNER] JOIN2-- 写法2
SELECT1.*,2.不包含重复列的其他列 from1,表2

但一般我们是既对行进行过滤也对列进行过滤,事实上,我们几乎使用的每个内连接都是自然连接,很可能永远都不会用到不是自然连接的内连接,即它们两个是搭配使用的:

-- 写法1
SELECT1.*,2.不包含重复列的其他列 from1 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值