数据库查询中的表连接(一)

1          概述

数据库中的表,是一个二维对象,由行和列构成;列是表的元数据,行是表的数据;所以,表与表之间做连接操作,无非是表的行和列与其他表的行和列之间的关系。

数据库中常有交叉连接、内连接、外连接、半连接、反半连接、自然连接等概念,这些连接方式,代表了不同的含义。

其中,交叉连接、内连接、外连接可以归属为一类;自然连接是内连接的一种。

半连接、反半连接,是子查询中的内容,可以归属为一类。

 

我们以两个表为列,来说明不同类型的连接之间的关系。

X表,有nm列;Y表,有ks列。

X和表Y之间的关系,可能的情况是:

数据库查询中的表连接(一) - 那海蓝蓝 - 那海蓝蓝的博客
 

 

2          表之间的连接

假设表X和表Y结构与数据如下:

Xnm

Yks

num | name

-----+------

   1 | a

   2 | b

   3 | c

num | value

-----+-------

   1 | xxx

   3 | yyy

   5 | zzz

 

如果表X和表Y之间的连接,可能的情况有三种:

连接

名称

连接结果

说明

示例

交叉连接

cross join

笛卡尔集

 

n*k

m+s

列出数据行之间的乘积和列之间的加和;连接语句不带有连接条件

 

SELECT * FROM X CROSS JOIN Y;

连接结果,3*3=9行,2+2=4列:

 num | name | num | value

-----+------+-----+-------

   1 | a    |   1 | xxx

   1 | a    |   3 | yyy

   1 | a    |   5 | zzz

   2 | b    |   1 | xxx

   2 | b    |   3 | yyy

   2 | b    |   5 | zzz

   3 | c    |   1 | xxx

   3 | c    |   3 | yyy

   3 | c    |   5 | zzz

内连接

 

inner join

又称

simple join

n*k中满足条件的行

 

m+s或去除重复的列

列出与连接条件匹配的数据行

分类:

根据连接条件符号:

等值连接[1]

不等值连接[2]

重复列去除,称为自然连接[3]

SELECT * FROM X INNER JOIN Y

ON X.num = Y.num;

连接结果:

 num | name | num | value

-----+------+-----+-------

   1 | a    |   1 | xxx

   3 | c    |   3 | yyy

內连接有重复的num

 

SELECT * FROM X NATURAL INNER JOIN Y;

连接结果:

 num | name | value

-----+------+-------

   1 | a    |  xxx

   3 | c    |  yyy

自然连接没有重复的num

外连接

outer join

不满足连接条件的行+內连接方式得到的行

取决于“查询列”和“using”子句

返回到查询结果集合中的不止包含符合连接条件的行,而且还包括左表(左外连接[4])、右表(右外连接[5])或两个边接表(全外连接[6])中的所有数据行

SELECT * FROM X LEFT JOIN Y USING (num);

 num | name | value

-----+------+-------

   1 | a    | xxx

   2 | b    |

   3 | c    | yyy

多出第二行,不满足连接条件,但在X表中

USING子句消除了num重复列

 

SELECT * FROM X RIGHT JOIN Y ON X.num = Y.num;

 num | name | num | value

-----+------+-----+-------

   1 | a    |   1 | xxx

   3 | c    |   3 | yyy

     |      |   5 | zzz

多出第三行,不满足连接条件,但在Y表中

 

SELECT * FROM X FULL JOIN Y ON X.num = Y.num;

 num | name | num | value

-----+------+-----+-------

   1 | a    |   1 | xxx

   2 | b    |     |

   3 | c    |   3 | yyy

     |      |   5 | zzz

多出第二行,不满足连接条件,但在X表中

多出第四行,不满足连接条件,但在Y表中

 



[1]在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列

[2] 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>>=<=<!>!<<>

[3] 在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列

[4] 结果集中,行比內连接多出左表中不满足连接条件的行,称为左外连接;右外连接与此对称,正好相反

[5] 结果集中,行比內连接多出右表中不满足连接条件的行,称为右外连接

[6] 结果集中,行比內连接多出左表、右表中不满足连接条件的行,称为全外连接


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值