简单的SQL GROUP BY

时间:2011-12-01 21:08:04

标签: sql

我有一个名为foobar的表,列namelocation。我想用SQL来获取前往纽约但未前往旧金山的所有人的姓名。

到目前为止:

  select name 
    from foobar 
   where location = "New York" and location != "San Francisco" 
group by name

3 个答案:

答案 0 :(得分:7)

SELECT f.name
    FROM foobar f
    WHERE f.location = 'New York'
        AND NOT EXISTS(SELECT NULL
                           FROM foobar f2
                           WHERE f2.name = f.name
                               AND f2.location = 'San Francisco')

您也可以使用LEFT JOIN执行此操作:

SELECT f.name
    FROM foobar f
        LEFT JOIN foobar f2
            ON f.name = f2.name
                AND f2.location = 'San Francisco'
    WHERE f.location = 'New York'
        AND f2.name IS NULL

答案 1 :(得分:5)

select name 
from foobar 
where location = "New York"
and name not in (select name 
from foobar 
where location = "San Francisco")

答案 2 :(得分:0)

在这种情况下,SQL"不存在"查询派上用场。看看以下查询:

select f1.name 
from foobar as f1 
where f1.location = "New York" 
and not exists
    (select f2.name 
     from foobar as f2
     where f1.name= f2.name
     and location = "San Francisco")

为了更好地理解,让我们将此查询分解为更小的部分。

部分-1: 让我们说,这是query1

  select f1.name
  from foobar as f1
  where f1.location = "New York"

这个简单的选择查询将显示访问纽约的所有名称。就这么简单!

部分-2: 让我们说,这是query2

  select f2.name
  from foobar as f2
  where f2.location = "San Francisco"

这是另一个简单的选择查询,它将显示访问过旧金山的所有名称。

现在我们需要实现的是,我们想要访问纽约的人的名字,减去访问过旧金山的名字。现在,一个人可能已经访问了纽约和旧金山,因此我们正在消除那些人。我们只想要纽约的访客。所以我们实际上是从query1中丢弃query2的结果,结合如下:

  query1
  and not exists
  (query2 + where f1.name = f2.name)

,或者

 select f1.name
 from foobar as f1
 where f1.location = "New York"
 and not exists
 (select f2.name
  from foobar as f2
  where f1.name = f2.name
  and f2.location = "San Francisco")