概述
我们首先回顾一下外键的概念:
在表中使用一个列保存关联表的唯一约束列(主键)的值,一方面减少数据冗余,另一方面让数据库更好维护。
外键表示的是数据之间的关系,而关联查询就是把这种关系作为条件,同时查询多个表,然后返回多个表中有“关系”的数据。
基础关联
这种方式就是把关联字段作为条件放在 where 子句里面,即:
select * from 表1 a, 表2 b where a.xx = b.xx
以用户表和角色表为例,在查询出用户信息的同时,也需要查询每个用户的角色,就可以这样写:
select
a.id 编号,
a.username 用户名,
a.password 密码,
a.create_time 创建时间,
a.role_id 用户角色编号,
b.role_name 用户角色
from t_user a, t_role b where
a.role_id = b.id
order by a.create_time
只有用户表的 字段和角色表的id字段相等的数据才可以被查询出来,以下两点:
1) 当某个用户的 字段为 时,这样的数据不会出现
2) 当某个角色没有被用户表使用时,这样的数据不会出现
所以在查询出的结果集里面没有出现用户名为 “admin21”、“admin30” 和角色名为 “角色管理员” 的数据。
但是有时候我们还是需要把用户名为 “admin21”、“admin30” 的数据也查找出来。在介绍 时会解决这个问题。
inner join
即内连接,其中 关键字可以省略
这种关联语法与上面的“基础关联”效果一样,即只有在关联字段的值存在且可以关联出数据时,数据才会出现在结果集中
select * from t_user a join t_role b on a.role_id = b.id;
/* 或者使用下面的方式
select * from t_user a inner join t_role b on a.role_id = b.id;
*/
如上图,还是没有出现用户名为 “admin21”、“admin30” 和角色名为 “角色管理员” 的数据。
outer join
即外连接,分为左外连接( 或 )和右外连接( 或 )。
左外连接查询出来的数据会包含“左表”的全部数据,不论关联字段是否有值、是否能够关联出“右表”的数据。
右外连接同理。
以上面的例子,有时候我们还需要把用户名为 “admin21”、“admin30” 的数据也查找出来,这样的需求使用前面两种方式就不好实现了。
此时我们可以使用左外连接( )来查询。即用户表的数据会全部查询出来,当关联字段的值为 时,角色表的全部字段会使用 来填充。
select * from t_user a left join t_role b on a.role_id = b.id;
/* 或者使用下面的方式
select * from t_user a left outer join t_role b on a.role_id = b.id;
*/
如上图,查询出了 “admin21”、“admin30” 的数据。
领取专属 10元无门槛券
私享最新 技术干货