• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

mysql 关联表查询 inner join 和 left join 和 right join 整理

刚学习mysql 可能会对这几个 join 晕头转向。下面用大白话整理一下吧。

join.png

inner join

较常用,也就是join的表中都存在才返回

LEFT JOIN

返回左表所有数据,右边匹配的返回,没有匹配的返回 null

MySQL left join 语句格式为:left join 是以A表为基础,A表即左表,B表即右表。

左表(A)的记录会全部显示,而右表(B)只会显示符合条件表达式的记录,如果在右表(B)中没有符合条件的记录,则记录不足的地方为NULL。

使用left join, A表与B表所显示的记录数为 1:1 或 1:0,

A表的所有记录都会显示,B表只显示符合条件的记录。但如果B表符合条件的记录数大于1条,就会出现1:n的情况,这样left join后的结果,记录数会多于A表的记录数。

RIGHT JOIN

返回右表所有数据,左边匹配的返回,没有匹配的返回 null

FULL JOIN

返回左,右表中所有的数据集。

JOIN中 1对多的问题

方法一:使用 group by 聚合掉重复的

SELECT
	o.`order_id`,
	o.`sale_amount`,
	l.`logistics_company_name` 
FROM
	t_order o
	LEFT JOIN t_logistics l ON o.`order_id` = l.`order_id` 
GROUP BY
	o.`order_id`;

方法二:使用 DISTINCT 去重

SELECT DISTINCT
	o.`order_id`,
	o.`sale_amount`,
	l.`logistics_company_name` 
FROM
	t_order o
	LEFT JOIN t_logistics l ON o.`order_id` = l.`order_id`;

Join语句中的 ON 和 AND

FROM
	t_driver_work_data tv
	INNER JOIN t_vehicle tcu ON tcu.CAR_NUMBER = tv.CAR_NUMBER and tcu.taxi_city !=''

上面语句中,

ON:  就是两行表关联的字段,要有索引。

AND: t_vehicle 表中先过滤掉 tcu.taxi_city !='' 然后再和表 tv 做 join 操作。

也就是 and 其实是相当于一个 where 了。

注意事项

ON 的字段最好不要有 空值,且有索引。


0
0
下一篇:Go语言:解决编译后文件体积过大解决方案

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。