MySQL EXISTS或JOIN

时间:2017-10-16 22:54:17

标签: mysql sql

我的表cities包含列idnameregion_id和表orders,其中列为idcity_id

我需要从orders中选择所需的所有行region_id

使用EXISTS

SELECT `o`.`id`
FROM `orders` as `o`        
WHERE EXISTS (SELECT `id` 
              FROM `cities` 
              WHERE `id` = `o`.`city_id` AND `region_id` = ".$region_id.")

使用JOIN

SELECT `o`.`id`
FROM `orders` as `o` 
LEFT JOIN `cities` as `c` ON `o`.`city_id` = `c`.`id`
WHERE `c`.`region_id` = ".$region_id."

在这种情况下哪情况更好?

2 个答案:

答案 0 :(得分:0)

我认为JOIN因可读性而更好。很公平,很容易理解Exit一个,但快速看一下,重复次数更少,更容易阅读。

如果您从性能角度出发,我会建议您在自己的系统上进行基准测试。

如果您正在处理用户输入,我还建议您利用PDO。

答案 1 :(得分:0)

您应该学会使用参数,这样就不会破坏查询字符串。将参数值填充到查询字符串中可能会导致意外的语法错误和SQL注入漏洞。

LEFT JOIN是多余的。您的WHERE子句将外连接转换为内连接:

SELECT o.id
FROM orders o JOIN
     cities c
     ON o.city_id = c.id
WHERE c.region_id = ".$region_id."

(我删除了反引号。它们是不必要的,因此它们只会使查询混乱。)

哪个更好,两者可以做不同的事情。如果JOIN具有相同cities的多行,则id版本可以为给定订单返回多行。不可否认,对于名为id的列,这不太可能,但语义略微支持EXISTS。注意:这只是因为您没有从c中选择任何其他列。如果是这样,那么JOIN就不费吹灰之力了。

在大多数情况下,选择是品味问题。您可能希望运行这两个版本,检查执行计划,并查看哪些版本的数据更快。