SQL运算符不存在



假设您有一组这样的表:

博物馆(M_NAME,州)艺术家(a_name,国家)艺术品(id,title,m_name*,a_name*)

我想在加利福尼亚州获得所有没有Da-vinci艺术品的博物馆的名字。

关于如何做的任何解释都会对我有很大帮助!

我到目前为止所做的是:

   选择m_name    来自博物馆,艺术品    where artwork.m_name*=博物馆.m_name    状态="加利福尼亚"

,但后来我被困在排除包含特定作者艺术品的博物馆。上一行之后,有些人建议这样的事情:

   和a_name不存在(选择a_name                           来自艺术品                           其中a_name =" da-vinci")

我确实了解该命令的存在是什么返回0/1,并取决于子要求结果,但我无法想象为什么在这种情况下它会起作用...

尝试此方法,它使用不存在:

SELECT DISTINCT m.name, m.town
FROM Museum m
WHERE State = 'California'
AND NOT EXISTS (SELECT * FROM Artwork aw WHERE m.M_name  = aw.M__name AND   A_name = 'Da-vinci')

da vinci

没有艺术品
SELECT M_name
FROM Artwork
WHERE LOWER(A_Name) NOT IN ('da vinci')

您没有说如何找出博物馆的位置。(现在我看到你的示例)

加入博物馆桌子以获取"城镇"

SELECT M_name
FROM Museum
JOIN (
  SELECT M_name
  FROM Artwork
  WHERE LOWER(A_Name) NOT IN ('da vinci')
) AS X ON X.M_name = M_name
WHERE Town='Calafornia'

上面的代码应与不存在()代码相同。实际上,如果您对他们俩进行解释,则应该看起来相同。

您可以使用join,而不是在

select distinct m.name, m.town
from  Artwork aw
inner join Museum m on m.M_name  = aw.M__name
where aw.A_Name not in ( 'da-vinci');

或使用!=

select distinct m.name, m.town
from  Artwork aw
inner join Museum m on m.M_name  = aw.M__name
where aw.A_Name  !=  'da-vinci';

这不存在

  select distinct m.name, m.town
  from  Artwork aw
  inner join Museum m on m.M_name  = aw.M__name
  WHERE   NOT EXISTS
          (
          SELECT  null 
          FROM   Artwork aw
          WHERE  aw.A_Name  = ( 'da-vinci');
          )

实际上,您已经在问题中写了查询:

  • 我想获得博物馆的所有名称
  • 在加利福尼亚
  • 没有艺术品
  • 由da-vinci制作

SELECT m.m_name                         -- I would like to get all the names
FROM museum m                           -- of museums
WHERE m.state = 'Californa'             -- in California
AND NOT EXISTS (                        -- that has no
        SELECT * FROM artwork aw        -- artwork
        WHERE aw.m_name = m.m_name         -- For THIS museum
        AND aw.a_name = 'Da-vinci'      -- made by da-vinci
        );

最新更新