MySQL语句学习之LEFT JOIN(2)

本文详细介绍了MySQL中的LEFT JOIN操作,以及如何利用LEFT JOIN解决一对多的问题。对比了GROUP BY和DISTINCT在处理一对多时的差异,并讨论了SQL查询的基本原理,包括单表查询、两表链接查询及多表连接查询的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义

left join(左联接) 返回包括左表中的所有记录和右表与关联键相等字段的记录 。
right join(右联接) 返回包括右表中的所有记录和左表与关联键相等字段的记录。
inner join(等值连接) 只返回两个表中同一关联键相等的行

2. 如何解决一对多

在这里插入图片描述
以上是一对多问题

2.1 解决一对多问题

  1. group by

把一对多的问题转化成聚合查询
在这里插入图片描述
2.使用distinct解决一对多的问题
在这里插入图片描述
2.2 group by 和distinct的比较
(1)group by和distinct的区别
distinct:需要将col列中的全部内容存储在一个内存中,hash结构,key为col的值,最后计算hash结构中有多少个key即可得到结果,因此需要将所有的结果存储起来,内存消耗肯能较大。
group by:先将col进行排序
(2)两个极端
数据列的所有数据都一样,即去重计数的结果为1时,用distinct最佳。
如果数据列唯一,没有相同数值,用group 最好。

2.3 distinct
(1)distinct可以作用于单列,也可以作用于多列

SELECT DISTINCT 列 FROM 表;		-- 单列去重

(2)distinct可以作用于多列

select distinct name, age from A  #根据name和age两个字段来去重的

(3)进行count统计

select count(distinct name) from A;	  #表中name去重后的数目

count不能统计多个字段,如果要统计多个字段,可以使用嵌套查询
select count(*) from (select distinct name, age from A) AS B;

(4)distinct必须放在开头

3.SQL语句查询原理
3.1 单表查询
(1)根据where条件过滤表中的记录,形成中间表(中间表对用户不可见)
(2)然后根据select选择相应的列返回最终结果

3.2 两表链接查询
(1)对两表求积(笛卡尔积)并用ON条件和连接类型进行过滤形成中间表
(2)然后用where条件过滤中间表记录
(3)根据select指定的列返回查询结果

3.3 多表连接查询
(1)先对第一个表和第二个表按照两表做连接查询,然后用查询结果和第三个表做连接查询,依次类推直到所有的表都连接上为止,最终形成一个中间的结果表
(2)根据where条件过滤中间表记录
(3)根据Selelct指定的列返回最终查询结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸宁七s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值