【问题标题】:Having the relational schema write the following queries让关系模式编写以下查询
【发布时间】:2021-07-23 08:44:03
【问题描述】:

我几周前开始使用数据库,所以我在这方面还很陌生!我们有一些家庭作业要在几天内完成,与编写一些查询有关也许指出错误,以便我纠正它们!所以提前谢谢

练习是这样的:

给定以下关系模式:

用户(SSN、NameU、SurnameU、城市、YearOfBirth、UserType)

电影(CodM、标题、国家、语言、MovieStudio、类型)

评估(SSN、CodM、评估、日期)

用 SQL 语言编写以下查询:

一个。对于每种用户类型,显示对由以下人员制作的电影的平均评价 “漫威”(MovieStudio = “漫威”)。

SELECT  U.USERTYPE , AVG(EVALUATION)

FROM    EVAUATION E,USER U,MOVIE M 

WHERE   E.SSN=U.SSN AND E.CODM=M.CODM AND MOVIESTUDIO='MARVEL' 

GROUP BY USERYPE

b.对于属于“专家”类型的每个用户,他们从未评价过 类型“恐怖”,但至少评估了 3 部类型为“喜剧”的电影,节目名称, 姓氏和对“意大利语”电影的最高评价。

 SELECT USERTYPE,NAME,SURNAME,MAX(EVALUATION)

 FROM   USER U,MOVIE M,EVALUATION E

 WHERE  USERTYPE='EXPERT' AND U.SSN=E.SSN AND M.CODM=E.CODM 

        AND E.SSN NOT IN(SELECT E1.SSN

                         FROM EVALUATION E1, MOVIE M1

                         WHERE E1.CODM=M1.CODM AND GENRE='HORROR')

        AND E.SSN IN   (SELECT E2.SSN

                        FROM  EVALUATION E2, MOVIE M2

                        WHERE E2.CODM=M2.CODM AND GENRE='COMEDY'

                        GROUP BY EVALUATION

                              HAVING COUNT >=3)
         
        AND LANGUAGE='ITALIAN'

GROUP BY USERTYPE

这是我目前能做的最好的!正如我所说,我在这方面还很新,所以我会得到一些帮助!

【问题讨论】:

  • 请改掉使用旧逗号连接的习惯,使用 ANSI 连接。例如:FROM EVAUATION E INNER JOIN USER U ON (E.SSN=U.SSN) INNER JOIN MOVIE M ON (E.CODM=M.CODM) WHERE ...

标签: sql oracle oracle11g


【解决方案1】:

请不要对此答案投票。我不想要基本查询的代表点。我使用答案是因为 cmets 适合帮助发帖者,IMO 在他们的问题中投入了大量工作,值得一个好的答案。

我 100% 同意 @MT0 的观点,即 ANSI 联接更好,但如果您的教授还没有教过他们,您应该坚持使用旧式联接。如果您的教授已经教过 ANSI 联接,请务必改用它们。当您通过编写代码获得报酬时,总是使用 ANSI 连接。

这是旧式和 ANSI 之间的区别:

-- Old style (your way)
SELECT U.USERTYPE, AVG(EVALUATION)
FROM EVALUATION E, USER U, MOVIE M
WHERE E.SSN=U.SSN AND E.CODM=M.CODM AND MOVIESTUDIO='MARVEL'
GROUP BY USERTYPE

-- ANSI (used by true professionals for the past 15-20 years)
SELECT U.USERTYPE, AVG(EVALUATION)
FROM EVALUATION E
JOIN USER U ON E.SSN = U.SSN
JOIN MOVIE M ON E.CODM = M.CODM
WHERE MOVIESTUDIO = 'MARVEL'

ANSI 样式将连接逻辑与过滤逻辑分开,一旦您习惯了它,它会使查询更易于阅读。

除此之外,查询是可靠的。当你的作品被评分时,一个小问题可能会让你失去分数:你的别名不一致。

SELECT U.USERTYPE, AVG(EVALUATION)
FROM EVALUATION E, USER U, MOVIE M
WHERE E.SSN=U.SSN AND E.CODM=M.CODM AND MOVIESTUDIO='MARVEL'
GROUP BY USERTYPE

以下列没有别名:

  • EVALUATION(第 1 行)
  • MOVIESTUDIO(第 3 行)
  • USERTYPE(第 4 行)

所有其他列都有别名。真正令人震惊的是 USERTYPE 在第 1 行有别名,但在第 4 行没有。保持一致。偶尔会有例外,但在这种情况下,最好给 everything 起别名。

最后,感谢您展示您的作品。 Stack Overflow 上太多的作业问题只是要求代码。当问题像您一样显示出高水平的努力时,我们总是很感激。

【讨论】:

  • 非常感谢 m8!至于我写问题的方式将来可能会改变,但现在这是教授教我们这样做的方式!我这里也有很多同样的例子。但除此之外,感谢您抽出一些时间来回答我的一个问题!正如你所说,我不会对答案投票!
  • 不客气!我要提到的另一件事是:在查询#2 中,如果您使用的是 Oracle,GROUP BY 应该是 GROUP BY USERTYPE,NAME,SURNAME。 MySQL 将让您摆脱简单的GROUP BY USERTYPE,但大多数其他数据库(包括 Oracle)需要来自SELECT 的所有非聚合值。希望这是有道理的。
  • 如果在所有情况下都是如此,那么您刚刚使 GROUP BY 变得容易多了!会做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2021-05-01
  • 2014-03-18
相关资源
最近更新 更多