sql连接类型

sql连接类型

sql连接类型有:内连接,外连接(左外,右外),全连接(交集),交叉连接(笛卡尔积)和自然连接

内连接(INNER JOIN)

内连接:内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。

内连接你可以看做是取两个表的交集 其中只有两条互相对应着的数据才能被存入结果表中

SELECT * FROM test1 a INNER JOIN test2 b ON a.id = b.id;

在这里插入图片描述
内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

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

例子:

select * from T_student s,T_class c where s.classId = c.classId

等价于

select  *  from T_student s inner join T_class c on s.classId = c.classId

2、不等连接
概念:在连接条件中使用除等于号之外运算符(>、<、<>、>=、<=、!>和!<)

select * from T_student s inner join T_class c on s.classId <> c.classId

外连接

外连接可以看做是取两个表的并集 ,和内连接是相反的,如果一张表的数据在另一张表中没有找到,但是并不影响他在结果集出现。

外连接包括左外连接和右外连接

左外连接(LEFT JOIN)
将返回右表的所有行。如果左表的某行在右表中没有匹配行,则将为右表返回空值左连接;以左表为主表,右表没数据为null。

select * from Student  LEFT JOIN Score ON Student.s_id=Score.s_id;

在这里插入图片描述
右外连接(RIGHT JOIN)
将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值;以右表为主表,左表中没数据的为null。

select *from Student right JOIN Score ON Student.s_id=Score.s_id

在这里插入图片描述

全外连接(FULL JOIN 或 FULL OUTER JOIN)

MySQL目前不支持此种方式,可以用其他方式替代解决。

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

select *from Student full JOIN Score ON Student.s_id=Score.s_id

select *from Student full outer JOIN Score ON Student.s_id=Score.s_id

在这里插入图片描述

交叉连接(笛卡尔积,CROSS JOIN)

交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。

交叉连接即笛卡尔积,结果为A×B
在这里插入图片描述
不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如:T_student和T_class,返回4*4=16条记录),如果带where,返回或显示的是匹配的行数。

1、不带where

   select *from T_student cross join T_class    //cross join 可以省略不写
  等于
   select *from T_student, T_class

在这里插入图片描述
总结:相当与笛卡尔积,左表和右表组合。

2、有where子句
往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择。

select * from T_student s cross join T_class c where s.classId = c.classId   
   (:cross join后加条件只能用where,不能用on)  

查询结果跟等值连接的查询结果是一样。

自然连接(NATURAL JOIN)

自然连接是一种特殊的等值连接,要求两个关系表中进行比较的必须是相同的属性列,无须添加连接条件,并且在结果中消除重复的属性列。要求是两个这两个关系中参与比较的属性列必须是同名、同属性。如果两个关系中有多组这样的属性,默认是全部比较的。
在这里插入图片描述在这里插入图片描述
自然连接不用指定连接列,也不能使用ON语句,它默认比较两张表里相同的列

 `SELECT * FROM student NATURAL JOIN score;`

显示结果如下:
在这里插入图片描述

MySQL如何执行关联查询

MySQL认为任何一个查询都是一次“关联”,并不仅仅是一个查询需要到两个表匹配才叫关联,所以在MySQL中,每一个查询,每一个片段(包括子查询,甚至基於单表查询)都可以是一次关联。
当前MySQL关联执行的策略很简单:MySQL对任何关联都执行嵌套循环关联操作,即MySQL先在一个表中循环取出单条数据,然后在嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。请看下面的例子中的简单的查询:

查询语句:select tbl1.col1, tbl2.col2 from tbl1 inner join tbl2 using(col3) where tbl1.col1 in (5, 6);
假设MySQL按照查询中的表顺序进行关联操作,我们则可以用下面的伪代码表示MySQL将如何完成这个查询:

outer_iter = iterator over tbl1 where col1 in (5, 6)
outer_row = outer_iter.next
while outer_row
    inner_iter = iterator over tbl2 where col3 = outer_row.col3
    inner_row = inner_iter.next
    while inner_row
        output [ outer_row.col1, inner_row.col2]
        inner_row = inner_iter.next
    end
    outer_row = outer_iter.next
end

上面的执行计划对於单表查询和多表关联查询都适用,如果是一个单表查询,那么只需要上面外层的基本操作。对于外连接,上面的执行过程仍然适用。例如,我们将上面的查询语句修改如下:
select tbl1.col1, tbl2.col2 from tbl1 left outer join tbl2 using(col3) where tbl1.col1 in (5, 6);
那么,对应的伪代码如下:

outer_iter = iterator over tbl1 where col1 in (5, 6)
outer_row = outer_iter.next
while outer_row
    inner_iter = iterator over tbl2 where col3 = outer_row.col3
    inner_row = inner_iter.next
    if inner_row
        while inner_row
            output [ outer_row.col1, inner_row.col2]
            inner_row = inner_iter.next
        end
    else
        output [ outer_row.col1, null]
    end
        outer_row = outer_iter.next
end

参考文章:
数据库内连接 外连接左右连接
图解MySQL 内连接、外连接、左连接、右连接、全连接
数据库左连接,右连接,内连接,外连接
sql中的左右关联、全关联、自关联
SQL的连接分为三种:内连接、外连接、交叉连接
数据库——自然连接、内连接、外连接(左外连接、右外连接、全外连接)、交叉连接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章