场景
- 在我的订单表中,我存了每一位用户成功下完订单后的对应信息,但是对于用户表中其他没有下订单的用户,在这种简单连表查询的情况下就无法看到对应的元组记录。
- 实际应用需求中,我希望将所有用户都能列举出来,即便对应用户没有下过订单。
- 如何查看到所有用户名和对应用户的订单信息呢?
问题:连接查询时,如何在保留主表的指定字段的情况下,对副表进行条件筛选 ?
解决:利用数据库提供的“外连接查询”方法:
select u.uname,b.bill_id,b.bill_time,b.bill_price
from user u left join bill b on u.uname=b.bill_uname;
外链接分三种情况:
-
左外联:表1 left join 表2 … on 连接条件
-
右外联:表1 right join 表2 … on 连接条件
-
全连接:表1 full join 表2 … on 连接条件
注:
1、 连接差异:
左外联
:把表1作为主表去从表2找满足条件的值和主表1拼在一起作为一条结果;
右外联
:把表2作为主表去从表1找满足条件的值和主表2拼在一起作为一条结果;
全连接:mysql不支持full join。
注: 外联查询的实现思路:
把 user表 作主表
,bill表 作从表
,
按两表相同用户名的连接条件,
-
从user表中的第一条数据,用户名为“jjj”开始,从上到下,依次去bill表从头到尾一条一条看,看有没有bill_uname=“jjj”的元组数据,若每存在一个,就依次把 bill表中的这条数据 和 user表中的第一条数据”按select关键字后的查询字段顺序“ 拼起来,然后作为一条新的元组数据放到查询结果表里。直到查完bill表所有数据。若bill表里一条bill_uname=“jjj”的元组数据都没有,则按”select关键字后的查询字段顺序都赋为NULL“,然后作为一条新的元组数据放到查询结果表里。接着,
-
到user表中的第二条数据,用户名为“jqh”,再从上到下,依次去bill表从头到尾一条一条看,看有没有bill_uname=“jqh”的元组数据,若每存在一个,就依次把 bill表中的这条数据 和 user表中的第二条数据”按select关键字后的查询字段顺序“ 拼起来,然后作为一条新的元组数据放到查询结果表里。直到查完bill表所有数据。若bill表里一条bill_uname=“jqh”的元组数据都没有,则按”select关键字后的查询字段顺序都赋为NULL“,然后作为一条新的元组数据放到查询结果表里。
-
依次,都看完user表的每一条元组数据。得到查询结果表。
-
重复,直到查完所有user表的所有元组数据。