【问题标题】:SQL Query Problems (Correctness check)SQL 查询问题(正确性检查)
【发布时间】:2017-02-10 07:54:46
【问题描述】:

表格:

– 啤酒(名称、制造商)
– 酒吧(名称、地址、执照)
– 销售(酒吧、啤酒、价格)
– 饮酒者(姓名、地址、电话)
– 喜欢(饮酒者、啤酒)
– 常客(饮酒者、酒吧)
– 朋友(饮酒者 1、饮酒者 2)

任务:

  1. 查找两个或更多饮酒者喜欢的所有啤酒
  2. 查找三个或更多饮酒者喜欢的所有啤酒
  3. 查找 Anna 的朋友喜欢的所有啤酒
  4. 查找所有出售比“99 瓶”酒吧出售的所有啤酒都便宜的啤酒的酒吧

查询 #1:

SELECT x name  
FROM Beers x, Drinkers y, Likes s    
WHERE y.name=s.drinker and s.beer=x.name
GROUP BY x.name    
HAVING COUNT(s.drinker) >= 2;  

查询 #2:

和上一个一样

查询 #3。

SELECT x name
FROM Beers x, Friends y, Drinkers z, Likes p  
WHERE z.name = "Anna" 
  AND z.name = y.drinker1   
  AND y.drinker2 = p.drinker 
  AND p.beer = x.name;

查询 #4:

SELECT x.name
FROM Bars x, Sells y
WHERE x.name = y.bar 
  AND SOME(SELECT y.price) < ALL(SELECT t.price
                                 FROM Sells t
                                 WHERE t.bar = "99 bottles");

我对最后一个有点犹豫。我可以以这种方式使用 SOME 吗?我可以通过在 select 子句中使用外部变量来创建子查询吗?

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 年前),不鼓励使用它
  • 是的,每个人都告诉我,我一踩到SQL就一直这么说,但那是我老师用的。他告诉我们,我们将在课程的稍后部分了解该语法。

标签: sql


【解决方案1】:

3.查找 Anna 的朋友喜欢的所有啤酒:

您的回答有两个主要问题:

  • 在某些情况下,查询可能会多次返回相同的啤酒名称
  • 您会错过某些情况,因为“Anna”可能会出现在 Friends 表的 drinker1drinker2 列中

这是一个使用显式 JOIN 的示例解决方案:

SELECT x.name
FROM Beers
WHERE b.name IN (
    SELECT l.beer
    FROM Likes l
        INNER JOIN Friends f
            ON l.drinker = f.drinker1
    WHERE f.drinker2 = "Anna"

    UNION

    SELECT l.beer
    FROM Likes l
        INNER JOIN Friends f
            ON l.drinker = f.drinker2
    WHERE f.drinker1 = "Anna"
)

4.查找所有销售比“99 瓶”酒吧销售的所有啤酒便宜的啤酒的酒吧:

您错误地使用了 SOME 和 ALL;

  • 我们从不在比较运算符的两边上使用这些关键字
  • SOMEALL 内的表达式必须是完整的子查询(SELECT y.price 不是有效的表达式)

这是使用IN AND MIN 的示例解决方案:

SELECT b.name
FROM Bars b
WHERE b.name IN (

    SELECT s.bar
    FROM Sells s
    WHERE s.price <
    (
        SELECT MIN(price)
        FROM Sells
        WHERE bar = "99 bottles"
    )

)

【讨论】:

  • 您好 Serge,非常感谢您的回答;但是,我的老师使用的语法是不同的。我知道这已经过时了,但中期是基于该语法的。他告诉我们,最终他会教我们你正在使用的语法。你能对我的工作提供反馈吗?
猜你喜欢
  • 2013-02-18
  • 2010-10-08
  • 2019-11-05
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2010-12-20
相关资源
最近更新 更多