mysql 关联表查询 inner join 和 left join 和 right join 整理
刚学习mysql 可能会对这几个 join 晕头转向。下面用大白话整理一下吧。
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 条评论