数据库的连接查询
数据库的连接查询包括两大类:
外连接和内连接。
一、外连接
- 左连接
以左边表为主,左表有的记录全部检索出来,符合条件的右表的记录才会检索出来;右表不对应左表的数据不在结果集中显示;而右表没有和左表对应的数据时,结果集中右表部分以空值代替。
代码实例如下:
select * from user left join account on user.user_id=account.user_id;
左连接的重点在于使用左连接之后,左表中的数据会全部显示出来,而右表中的数据只有符合where条件的数据才会显示,而左表没有和右表对应上的数据就会使用null来占位,因为左表数据必须全部显示出来,结果集中又必须同时显示两张表的属性,所以只能用null来代替。 - 右连接
以右边表为主,右表有的记录全部检索出来,符合条件的左表的记录才会检索出来;左表不对应右表的数据不在结果集中显示;而左表没有和右表对应的数据时,结果集中左表部分以空值代替。
右连接的实例如下:select * from user right join account on user.user_id=account.user_id;
仔细观察这两张结果表,就会发现左右连接的不同之处。
提示:观察user_name的位置(不变)
- 全连接
返回符合条件的所有表的记录,没有与之匹配的,用null表示(结果是左连接和右连接的并集)。
二、内连接
比较官方的定义:内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
比较简单的定义:内连接是左右连接结果集中删除包含null的记录,并把删除后的结果集进行合并,再进行distinct。
内连接的一个实例:
select * from user inner join account on user.user_id=account.user_id;
内连接的另一个实例:
select * from account inner join user on user.user_id=account.user_id;
为什么会贴出来两个实例呢?
仔细观察两张结果集表,不难发现,两张表的数据顺序不一致,再看SQL语句,我们发现user表和account表的顺序不一样。
两张结果集顺序不一致的原因,我想不用我多言了吧?类比左右连接的结果集顺序。
其实这个在实际开发中并没有太大的意义,顺序不一致不影响我们去结果集中取数据,所以不必纠结谁先谁后。
三、内外连接的不同
- 空值不一样:
- 左连接是右表部分为空;右表没有和左表对应的数据时,结果集中右表部分以空值代替。
- 右连接是左表部分为空;左表没有和右表对应的数据时,结果集中左表部分以空值代替。
- 内连接不会出现空值情况。
- 主表不一样:
- 左连接是以左表为主表,去对应匹配右表,匹配不上的用空值填补占位;
- 右连接是以右表为主表,去对应匹配左表,匹配不上的用空值填补占位;
- 内连接是以关键词左边的表为主表显示数据,但左右表必须对应。
好啦,数据库内外连接的浅析就到这里啦,小编要继续去码代码啦。
拜拜~~~
user表
account表
SQL语句就不帖啦。