1、内连接

两个表的公共部分用Inner join,Inner join是交集的部分。

Select * from TableA A inner join TableB B on A.key=B.key

 

2、左外连接

A表和B表的共有,加上A的独有,简称全A。

Select * from TableA A left join TableB B on A.key=B.key

红色部分是两表的公有部分,此时8号记录是A表的独有,右边的部门表并没有满足的就用null补齐

3、右外连接

A表和B表的共有,加上B的独有,简称全B。

Select * from TableA A right join TableB B on A.key=B.key

红色部分是两表的公有部分,右表全部查出来,左表没有满足的就用null补齐。

不管是左连接还是右连接,连接之后表格的高度要一样,不匹配的表全部用null对齐。

4、左连接

A的独有,把公有的去掉,A独占就没B什么事了。

On是join条件。

Select * from TabelA A left join TableB B on A.key=B.key where B.key is null

A表的独占,即B表的Id必定等于null

5、右连接

B的独有,把公有的去掉,B独占就没A什么事了。

Select * from TableA A right join TableB B on A.key=B.key where A.key is null

B表的独占,即A表的id肯定为null、

6、全连接

Full outer join是全连接。

 

 

Mysql不支持这种语法,但是oracle支持。

但是!MySQL中并不支持这种写法,所以只能通过别的方法。A、B的所有也就是A的独有、B的独有 和A、B的共同拥有的数据,Mysql中可以使用:

select * from Table A left join Table B on A.Key = B.Key  (找出A的所有)

 union  (去重)

 select * from Table A right join Table B on A.Key = B.Key(找出B的所有)

7、全外连接(Mysql中不支持下图写法)

左右表的共有数据之外的数据查询 。各自独有之和,偏偏没有中间部分。

筛选出对于A表而言B为空,对于B表而言A为空的。MySQL中也不支持这种写法,所以只能通过别的方法。其实全外连接也就是A的独有+B的独有。

Mysql语法:

select * from Table A left join Table B on A.Key = B.Key  where B.Key is null  (找出A的独有)

 union (去重)

select * from Table A right join Table B on A.Key = B.Key where A.Key is null (找出B的独有)

8、交叉连接cross join

1. 笛卡尔积

 数学概念:两个集合X和Y的笛卡尔积是所有可能有序对(x,y)的集合

 数据库应用:两个表的每一行都与另一个表的每一行组合

2. 交叉连接特点

(1)、返回左表与右表的完全组合

(2)、不使用任何连接条件

 结果集行数 = 表1行数 × 表2行数

3、语法格式

标准语法

SELECT 字段列表 FROM 表1 CROSS JOIN 表2;

传统语法(不推荐)

SELECT 字段列表 FROM 表1, 表2;

实际应用示例

示例1:基本交叉连接

学生表(10行)与课程表(5行)的笛卡尔积

SELECT * FROM students CROSS JOIN courses;  --结果:50行数据(10×5)

项目应用:

insert into b_material_line_data(unit_index_code,CREATE_TIME,COMPANY,LONGITUDE,LATITUDE,is_completed)

SELECT
      t1.index_code,now(), t2.company,t2.ATTRIB_FOUR,t2.ATTRIB_FIVE,0
    FROM
      ( SELECT INDEX_CODE FROM pub_item_unit_info WHERE type_code = '1002' AND IS_VALID_DATA = 1 UNION ALL SELECT INDEX_CODE FROM pub_item_unit_info WHERE type_code = '1004' AND IS_VALID_DATA = 1 ) t1 CROSS JOIN
      (
        SELECT
          company,
          ATTRIB_FOUR,
          ATTRIB_FIVE 
        FROM
          pub_item_unit_info 
        WHERE
          type_code = '1007' 
          AND COMPANY IS NOT NULL 
          AND ATTRIB_FOUR IS NOT NULL 
          AND ATTRIB_FIVE IS NOT NULL 
        GROUP BY
          company 
      ) t2

 

posted on 2021-02-09 17:48  周文豪  阅读(3449)  评论(0)    收藏  举报