MySQL:使用 IN 的嵌套 SQL

标签 mysql sql database

我有一个如下所示的 SQL:

SELECT * FROM foo WHERE foo.bar IN (SELECT foobar.bar FROM foobar)

这样不好吧?嵌套的 SELECT 会导致事情变慢吗?我应该如何查询这样的东西?

最佳答案

IN 子句是完全有效的 SQL,但它并不总是首选方式。我经常发现 MySQL 在它们上的性能很差,即使 foo.bar 被索引也是如此。

如果改成join,如果第二张表有多行与第一张表的每一行的join条件匹配,就要小心了,因为join会产生多个结果行。如果可能,连接应该是:

SELECT f.*
FROM foo f
INNER JOIN (SELECT DISTINCT bar FROM foobar) fb USING (bar);

最终的答案是您应该使用 EXPLAIN 来查看不同形式的查询将如何执行。但是,如果您一开始没有遇到性能问题,请不要担心。

如果您想要 f.bar 存在于 foobar 中的所有行,NOT IN 是通常是最简洁的写法。但它也可以使用 LEFT OUTER JOIN 编写:

SELECT f.*
FROM foo f
LEFT OUTER JOIN foobar fb USING (bar)
WHERE fb.bar IS NULL

在这种情况下您不需要子查询,因为您只报告不匹配的行,因此结果中显然不能有多个匹配项。

关于MySQL:使用 IN 的嵌套 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13168329/

相关文章:

mysql - 1条sql语句中的多重计数

mysql - 如何以更优化的方式从数据库中获取随机行

php - 如何使用 MySQL Query 和 PHP 分配排名

sql - MS Access 插入多行

java - 由于外键约束,数据库插入失败

sql - 为什么这个 mysql 表在日期时间字段中产生 NULL?

mysql - 多列连接 : Getting additional rows

Mysql Coalesce 返回 0 而不是实际值

php - 使用MySql数据库用php登录

sql-server - SQL Server 2008 R2(.Net 2.0 应用程序)中的死锁问题