数据库内外连接

简单介绍

1.内连接:只返回两个表中连接字段相等的行。inner join(等值连接) 只返回两个表中联结字段相等的数据

image

2.左外连接(也称左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。以左表为基表,在from子句中使用关键字left outer join”或关键字“left join”来连接两张表。

image

3.右外连接(也称右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。以右表为基表,在from子句中使用关键字“right outer join”或关键字“right join”来连接两张表。

image

4.全外连接:返回左右表中所有的记录和左右表中连接字段相等的记录。在from子句中使用关键字“full outer join”或关键字“full join”来连接两张表。

image

5.交叉连接(笛卡尔积):返回被连接的两个表所有数据行的笛卡尔积。返回结果集合中的数据行数等于第一个表中复合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

操作实战

image
需求:如图上是一个文章评论表,其中包含文章评论(parent_id为-1)和子评论(parent_id为某个评论的id),当前需要查询某个文章下的所有评论,且评论中包含子评论,最大层级为2
思路:通过自关联实现文章评论输出,将表分为c和c1,关联条件为c.id=c1.parent_id

  1. 对于如上两表,如果使用内关联,即只取满足关联条件的行,只有一个结果输出
select
       c.id id,c.op_time,c.content,c.from_name,c.to_name, c.parent_id, c.article_id,c1.id sub_id, c1.op_time sub_op_time,c1.content sub_content,c1.from_name sub_from_name,c1.to_name sub_to_name, c1.parent_id sub_parent_id, c1.article_id sub_article_id
from
        rb_comment c
inner JOIN
        rb_comment c1
on
        c.id=c1.parent_id

image
2. 如果使用左外连接或右外连接,由于是自关联查询,结果一样,都为5条(包含全部条数,符合关联条件和不符合关联条件的)

select
       c.id id,c.op_time,c.content,c.from_name,c.to_name, c.parent_id, c.article_id,c1.id sub_id, c1.op_time sub_op_time,c1.content sub_content,c1.from_name sub_from_name,c1.to_name sub_to_name, c1.parent_id sub_parent_id, c1.article_id sub_article_id
from
        rb_comment c
left JOIN
        rb_comment c1
on
        c.id=c1.parent_id

image
3. 如果要满足需求,首先需要进行左外连接,得到全部评论,评论中部分包含子评论(关联条件)。拿到数据后在进行过滤,过滤条件为文章id和parent_id

select
            id, op_time,content,from_name,to_name,parent_id,article_id,sub_id, sub_op_time,sub_content,sub_from_name,sub_to_name,sub_parent_id,sub_article_id
        from
            (select
                 c.id id,c.op_time,c.content,c.from_name,c.to_name, c.parent_id, c.article_id,c1.id sub_id, c1.op_time sub_op_time,c1.content sub_content,c1.from_name sub_from_name,c1.to_name sub_to_name, c1.parent_id sub_parent_id, c1.article_id sub_article_id
             from
                 rb_comment c
                     LEFT OUTER JOIN
                     rb_comment c1
                     on
                         c.id=c1.parent_id) c
        where
            c.parent_id='-1'
            and
            c.article_id=#{article_id}
        order by
            id desc

如果排除文章id的条件,取到的数据为所有主评论,子评论已经通过关联关联到了主评论中

posted @ 2023-05-24 15:34  热心邻居老王  阅读(12)  评论(0编辑  收藏  举报