【问题标题】:Need Help In Subquery/Join SQL在子查询/加入 SQL 中需要帮助
【发布时间】:2020-08-22 21:37:29
【问题描述】:

我遇到了这个练习:

以下表格构成关系 DBMS 中保存的数据库的一部分:

  • 酒店(hotelNo、hotelName、hotelAddress)
  • 房间(roomNohotelNo、类型、价格)
  • 预订(hotelNoguestNodateFrom、dateTo、roomNo)
  • 来宾(guestNo、guestName、guestAddress)

任务:

  1. 列出“绿宫”酒店所有客房的价格和房型。
  2. 列出目前入住“绿宫”酒店的所有客人。
  3. 列出“绿宫”酒店所有客房的详细信息,包括入住该客房的客人姓名(如果该客房有人入住)。
  4. 今天预订“绿宫”酒店的总收入是多少?
  5. 列出“绿宫”酒店目前空置的房间。
  6. “绿宫”酒店空置房间造成的收入损失是多少?

练习表明我应该使用子查询或连接方法。

我只能回答第一个问题

SELECT price, type
FROM room
WHERE hotelNo = (SELECT hotelNo
                 FROM hotel
                 WHERE hotelName = "Green Palace")

其他问题涉及一个语句中的多个子查询(我不知道该怎么做),我不了解子查询和联接之间的区别。 我该如何回答其他问题?

【问题讨论】:

  • 我认为你必须使用 JOIN 而不是子查询。所以试试:SELECT price, type FROM room r JOIN hotel h on h.hotelNo = r.hotelNo WHERE h.hotelName = "Green Palace"
  • 您好,如果是这种情况,您可能是参加 CSC 226 的 NDU 学生,我找到了博士可能从中获得的练习及其解决方案。 javaguicodexample.com/mysqldatabasequerynetbeansex.html不要忘记更改酒店名称。 :)

标签: sql


【解决方案1】:

子查询是请求中的请求。当您想从另一个表中添加一个与当前表几乎没有链接的条件时,您可以使用它。

select * from user where userId in (select id from person where name = 'plop')

连接是两个表之间的关系。如果两个表通过列(外键)链接,您将使用连接(主要是左连接或内连接)。您的请求看起来就像您只有一个表,其中包含两个表中的所有数据。

select u.* from user u
inner join person p on u.userId = p.id
where p.name = 'plop'

在我的示例中,如果 User.userId 不可为空,您将获得相同的结果。如果它可以为空,你也会得到 userId = null 的用户。

所以对于您的第一个问题,我更喜欢使用连接:

select r.price, r.type from room r
inner join hotel h on h.hotelNo = r.hotelNo
where h.hotelName = 'Green Palace'

结果会是一样的,但我猜它更具可读性并且执行计划的丢失会更少。

现在,我不会做整个练习,但我希望我的回答对你有所帮助

【讨论】:

    【解决方案2】:

    第一个问题使用 JOIN 的方法可能是这样的:

    SELECT r.price, r.type
    FROM room r
    INNER JOIN hotel h ON r.hotelNo = h.hotelNo
    WHERE h.hotelName = "Green Palace"
    

    因此,您无需使用子查询来确定相关的hotelNo(如您在问题中所示),而是基于一个公共列加入(或“链接”)两个涉及的表,并使用WHERE 子句来限制您正在查看的酒店。

    对于问题 #2 - 尝试这样的事情:

    SELECT g.guestName, g.guestAddress
    FROM guest g
    INNER JOIN booking b ON b.guestNo = g.guestNo
    INNER JOIN hotel h ON b.hotelNo = h.hotelNo
    WHERE h.hotelName = 'Green Palace'
    

    将客人与预订结合起来以查找客人的预订,然后将预订加入酒店表以将您的结果限制为“绿宫”酒店的(特定客人的)预订。

    这应该会给你一些推动力 - 现在尝试任务 #3 到 #6 - 如果你被困在某个地方,请回来!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 2015-08-01
      • 1970-01-01
      相关资源
      最近更新 更多