IN()内的MySQL子查询

时间:2015-03-22 06:49:54

标签: mysql sql

这是我的第一篇文章,我是SQL的初学者,所以真的希望你们能帮我解决这个问题。

当我想在IN()中编写子查询时,我只能编写一个子查询。如果我再加一个就会出错。我无法弄清楚原因。希望有人可以提供帮助

这很好用:

SELECT name, continent
FROM world
WHERE continent IN (SELECT continent FROM world WHERE name ='belize')

但是每当我再添加一个子查询时,就会出现错误。

SELECT name, continent
FROM world
WHERE continent IN (SELECT continent FROM world WHERE name ='belize',
                    SELECT continent FROM world WHERE name ='belgium')

真的很感激,如果有人可以帮助我。非常感谢。

4 个答案:

答案 0 :(得分:2)

因为,您是SELECT来自同一个表,您可以使用OR条件组合这两个语句。

SELECT name, continent FROM world 
WHERE continent IN 
(
SELECT continent FROM world 
WHERE name = 'belize' 
OR name = 'belgium'
);

答案 1 :(得分:1)

只需使用OR来判断两者是否存在。

SELECT name, continent 
FROM world 
WHERE continent IN (
   SELECT continent 
   FROM world 
   WHERE name ='belize' OR name ='belgium'
)

答案 2 :(得分:0)

这是一个没有使用子查询的答案(根据我的经验)几乎总是更有效:

SELECT DISTINCT name, continent 
    FROM world
    JOIN world world2 ON world.continent = world2.continent
    WHERE world2.name IN('belize' , 'belgium')

现在我看到这一点,我意识到DISTINCT子句的必要性(如果你指定了同一个大陆的2个国家,防止重复行 - 在你的具体例子中不是问题,但我认为可能是未来边缘条件的一部分)可能会降低效率。最好坚持使用子查询。

答案 3 :(得分:0)

(  SELECT continent FROM world WHERE name ='belize'
 , SELECT continent FROM world WHERE name ='belgium' )

看来您已假定列表中的每个值都需要子查询。即从2个子查询得到的结果:

('Europe', 'Europe')

但这不是SQL处理子查询IN的方式(此处

一旦使用子查询,它就会将该子查询视为生成潜在值的COLUMN。因此,不要尝试一次构建一个“in list”,只需通过一列即可。

考虑这个简单的查询:

SELECT DISTINCT continent FROM world

它会产生一系列结果

Africa
Antarctica
Asia
Australia
Europe
North America
South America

如果我们使用那个简单的查询IN(这里),就像这样:

SELECT country, continent FROM world
WHERE continent IN ( SELECT DISTINCT continent FROM world )

它会正常工作,并列出来自各大洲的所有国家/地区。它确实不是一个非常明智的查询,但关键是单个子查询可以返回许多行,并且每行的值都会被评估。

具有讽刺意味的是,你可以通过这样做UNIONUNION ALL来使用你的子查询:

SELECT name, continent
FROM world
WHERE continent IN (SELECT continent FROM world WHERE name ='belize'
                    UNION ALL
                    SELECT continent FROM world WHERE name ='belgium')

这浪费了资源,但它是有效的语法,因为它正在建立一个允许的结果列。