android contentprovider 联合查询 联合查询和连接查询_外连接

 

上图展示了所有的关联可视化的结果。

 

关联的作用:从两张或者多张表中取出有关联的数据

 

关联查询一共有如下几种:

  • 内连接:INNER JOIN, CROSS JOIN
  • 外连接:左连接(LEFT JOIN)  右连接(RIGHT JOIN)  全连接(FULL OUTER JOIN)
  • 自连接:当table1,table2本质上是同一张表,只是用取别名的方式虚拟成两张表代表不同的意义

 

 

说明

  • 连接n个表,至少需要n-1个连接条件
  • 当两个关联查询的表如果有字段名字相同,并且查询中涉及该关联字段,那么需要使用表名前缀加以区分
  • 如果表名比较长时,可以给表取别名,简化SQL语句

 

 

三个关联条件

  • WHERE:适用于所有的关联查询

android contentprovider 联合查询 联合查询和连接查询_右连接_02

 

  • ON:只能和JOIN一起使用,只能写关联条件。虽然关联条件可以并到WHERE中和其他条件一起写,但是分开写可读性更好

android contentprovider 联合查询 联合查询和连接查询_外连接_03

 

  • USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等。

android contentprovider 联合查询 联合查询和连接查询_字段_04

 

--------------------------------------------------------------------------------

 

内连接 INNER JOIN

 

分类

  • 显式

        SELECT  字段名  FROM 表1  INNER JOIN 表2 ON [关联条件] WHERE [其他筛选条件];  

 

  • 隐式

        SELECT  字段名  FROM 表1,表2 where [筛选条件]

        #  这种隐式的连接,由于缺少了on做表的联系,所以需要把on 的条件写进where中

  • 交叉连接

        SELECT 字段名 FROM 表1 CROSS JOIN 表2 ON [关联条件]  WHERE [其他筛选条件];

        这种交叉连接等价于上面的隐式连接,都会返回两个表的笛卡尔积

    

代码实例

 

android contentprovider 联合查询 联合查询和连接查询_右连接_05

 

--------------------------------------------------------------------------------

 

外连接之左连接 LEFT JOIN

 

第一种情况:

    返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表的列值为NULL

    

android contentprovider 联合查询 联合查询和连接查询_右连接_06

 

第二种情况:

        返回左表中行在右表中没有匹配行的记录

 

android contentprovider 联合查询 联合查询和连接查询_右连接_07

-----------------------------------------------------------------------------------------------------------------

 

外连接之右连接 RIGHT JOIN

        右连接和左连接相似,这里不再赘述

android contentprovider 联合查询 联合查询和连接查询_外连接_08

   

    ------------------------------------------------------------------------------------------------------------------------------------------

 

外连接之全连接 FULL OUTER JOIN

 

注意:

    由于mysql不支持FULL JOIN,但是可以用 left join union right join代替,也就是左连接 联合查询 右连接

android contentprovider 联合查询 联合查询和连接查询_字段_09