按照我的理解,我将数据库中的连接分类为广义内连接和外连接,如下图,稍后我将解释我为什么这么分。
1 广义内连接(交叉连接)
所有的广义内连接的核心和共同点是完全基于笛卡尔积原理的,两个表进行笛卡尔积运算得到的结果表是由第一个表的每一行与第二个表的每一行拼接后形成的表,称为‘笛卡尔积表’,结果表的行数等于两个表的行数之积,接下来介绍的所有广义内连接的结果都能在笛卡尔积表里找到。两个表直接做笛卡尔积运算:
-- 写法1,INNER可省略
SELECT * from 表1 [INNER] JOIN 表2;
-- 写法2
SELECT * from 表1,表2;
注意,这里没有任何限制和条件,这种联结称为交叉连接,得到的结果就是两个表的笛卡尔积,这是所有广义内连接的基础,所有广义内连接在原理上都是通过在笛卡尔积的基础上进行过滤得到的。
1.1 内连接(等值连接)
现在我们要在笛卡尔积的基础上进行过滤了,以选择我们需要的记录(行):
-- 写法1:显式内连接,通过ON进行过滤
SELECT * from 表1 [INNER] JOIN 表2 ON 等值条件;
-- 写法2:隐式内连接,通过WHERE进行过滤
SELECT * from 表1,表2 WHERE 等值条件;
注意这里的条件是等值条件,一般类似 表1.字段1=表2.字段2 这种(字段就是列),所以内连接又称为等值连接。
1.2 自然连接
上面提到内连接是对行进行过滤,那可不可以对列进行过滤哪?当然可以。一般的情况就是当我们对两个表进行交叉连接后,会有重复的列,即此列在两个表里同时存在,自然连接会排除多次出现的列,使每一列只返回一次。怎样完成这项工作呢?答案是,系统不完成这项工作,由你自己完成它。自然连接要求你只能选择那些唯一的列,一般通过对一个表使用通配符(SELECT *),而对其他表的列使用明确的子集来完成:
-- 写法1
SELECT 表1.*, 表2.不包含重复列的其他列 from 表1 [INNER] JOIN 表2;
-- 写法2
SELECT 表1.*, 表2.不包含重复列的其他列 from 表1,表2;
但一般我们是既对行进行过滤也对列进行过滤,事实上,我们几乎使用的每个内连接都是自然连接,很可能永远都不会用到不是自然连接的内连接,即它们两个是搭配使用的:
-- 写法1
SELECT 表1.*, 表2.不包含重复列的其他列 from 表1