我正在尝试学习SQL。我有一个表(称为likes
),如下所示:
|---------|---------------|
| name | color |
|---------|---------------|
| Jane | Red |
| Talia | Red |
| Jane | Black |
| Loui | Black |
| John | Black |
| Jane | Green |
| John | Green |
|---------|---------------|
查询为Names who like only Black
。我这样试过:
SELECT L1.name FROM likes L1 WHERE L1.color = 'Black'
AND NOT EXISTS (SELECT L2.name FROM likes L2 WHERE L1.name = L2.name);
这将返回空,因为Loui
子查询中Loui
最终将等于NOT EXISTS
。但是,我不知道要将其更改为什么,因此它只返回Loui
。
我可以使用UNION
以及上面查询中看到的所有内容,但没有别的。
任何帮助将不胜感激!
答案 0 :(得分:2)
我会使用group by
和having
执行此操作:
select name
from likes
group by name
having max(color) = min(color) and max(color) = 'Black';
您也可以使用您的方法。您需要子查询中的颜色:
SELECT L1.name
FROM likes L1
WHERE L1.color = 'Black' AND
NOT EXISTS (SELECT L2.name
FROM likes L2
WHERE L1.name = L2.name AND
L2.color <> 'Black'
);
答案 1 :(得分:1)
您可以进行反加入。
SELECT L1.name
FROM likes L1
LEFT JOIN likes L2 ON (L1.name = L1.name AND L1.color != L2.color)
WHERE L2.name IS NULL
AND L1.color = 'Black'
这可以通过返回具有不同颜色的相同名称的行来实现。如果没有其他颜色,您将获得NULL
,满足条件。
答案 2 :(得分:1)
如果您想要的是找到只喜欢某种特定颜色的人,那么您可以使用分组来做这样的事情:
localhost
您将获得人物颜色关联的分组结果集。然后你过滤那个集合,只返回只有一个你所选颜色的关联的人。
答案 3 :(得分:1)
您可以使用返回只有一种颜色的名称的子选择,然后按颜色黑色过滤
select name fro likes
where name in ( select name
FROM likes
Group by name
HAVING count(*) = 1 )
and color = 'Black' ;