SQL之五种JOIN连接及各类型JOIN解析---部分连接优化

2025-05-23 06:35:30

JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。 本次展示采用数据库两表,如下图: STUDENTONE_MESSAGE表 STUDENTTWO_MESSAGE表

1.JOIN连接之内连接(INNER JOIN) a.INNER JOIN内连接也叫显性内连接 内连接的图片效果:

select * from studentone_message a

INNER JOIN studenttwo_message b

on a.id=b.id

查询结果如图所示: 总结: INNER JOIN内连接,展示的是两表之间的交集,即获取的是符合查询条件(上面sql语句中a.id=b.id)的信息。

隐形内连接:where连接 有显性内连接,当然也会有隐形内连接。一般的where 连接多个表也属于内连接,在数据库中被称为隐性内链接。如下:

select * from studentone_message a,studenttwo_message b

WHERE a.id=b.id

输出结果和inner join相同,如下图:

2.JOIN连接之左连接/左外连接(LEFT JOIN/LEFT OUTER JOIN) 左连接的图片效果:

select * from studentone_message a

LEFT JOIN studenttwo_message b

on a.id=b.id

查询结果如图所示: 总结: (1).左连接是以LEFT JOIN为基准进行查询,LEFT JOIN左边studentone_message为左表,右边studenttwo_message为右表。左连接查询的就是左表的全部信息和符合查询条件的信息(例如上面的a.id=b.id,即左右两表符合关联查询条件的信息)两部分。 (2).如果左表展示出来的全部信息,右表没有相对应的信息,则右表记录为null。(例如上面图片中,左表的全部信息有3个ID,而右表ID=1003没有,所以会对应显示null)

3.JOIN连接之右连接/右外连接(RIGHT JOIN/RIGHT OUTER JOIN) 右连接的图片效果:

select * from studentone_message a

RIGHT JOIN studenttwo_message b

on a.id=b.id

查询结果如图所示: 总结: (1).从上面看出,右连接与左连接正好相反,以RIGHT JOIN为基准,展示的信息是RIGHT JOIN右边右表的全部信息加上左右两边符合关联查询条件的(即上面的a.id=b.id这个条件)。 (2).如果右表展示出来的全部信息,左表没有相对应的信息,则左表记录为null。(例如上面图片中,右表的全部信息有5个ID,而左表从ID=1004开始便无法跟右表对应,所以会对应显示null)

4.JOIN连接之全连接(FULL JOIN) !!!MySql不支持全连接查询,可以用union代替,UNION联合连接–点击查看详情。 为做全连接演示,所以在Oracle新建两张:

message1 message2 全连接的图片效果:

select * from message1 a

FULL JOIN message2 b

on a.id=b.id

查询结果如图所示: 总结: Full outer join展示的是a表和b表的全部信息(a和b的并集)。但需要注意的是,对于没有匹配的记录(即a.id和b.id没有一一对应的),则会以null做为值。可以使用IFNULL判断。

5.JOIN连接之交叉连接(笛卡尔积)(CROSS JOIN) a.不带where条件子句,它返回的是被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如上表中:message1表的3条数据*message2表的4条数据,最后得到12条数据,就是下面笛卡尔积查询出来的总记录数)。

select * from message1 a

cross JOIN message2 b

查询结果如图所示:

b.如果带where,返回或显示的是匹配条件成立的行数

select * from message1 a

cross JOIN message2 b

where

a.id=b.id

查询结果如图所示: 总结: 1.CROSS JOIN(笛卡尔积)是两个表每一个字段相互匹配, 得出的结果就是笛卡尔积。笛卡尔积也等同于交叉连接。 2.CROSS JOIN(笛卡尔积)带条件查询, 查询结果跟等值连接(内连接)(INNER JOIN连接)、where连接的查询结果是一样,并且后面加条件只能用where,不能用on。

部分JOIN连接简单优化

这里说的是:inner join、left join和right join的优化方法: a.找出驱动表和被驱动表,在被驱动表上建立索引,可提高连接性能。 b.内连接inner join和左连接left join差不多,都需要优化右表。而右连接right join需要优化左表。 比较: 左连接和内连接优于右连接,左连接和内连接的比较取决于需求,单纯看性能是差不多的。 备注: 索引一般为(主键、唯一索引、前缀索引等); 左连接left join中,左表为驱动表,右表为被驱动表;右连接right join中,右表为驱动表,左表为被驱动表。

小手抖一抖,关注走一走

微信公众号搜索程序员有话讲,每一个关注都是对我最好的奖励。

快车 vs专车:乘车体验与快车专车司机压力的对比
迷你世界动物繁殖大全 动物繁殖攻略详解