SQL之五种JOIN连接及各类型JOIN解析 您所在的位置:网站首页 下列选项中不属于sql查询的是 SQL之五种JOIN连接及各类型JOIN解析

SQL之五种JOIN连接及各类型JOIN解析

2024-07-01 06:15| 来源: 网络整理| 查看: 265

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中,右表为驱动表,左表为被驱动表。

在这里插入图片描述

小手抖一抖,关注走一走

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有