在子查询/联接SQL中需要帮助

时间:2020-05-07 14:28:59

标签: sql

我遇到了这个练习:

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

  • 酒店(酒店编号,酒店名称,酒店地址)
  • 房间(房间号酒店号,类型,价格)
  • 预订(酒店号客人号 dateFrom ,dateTo,房间号)
  • 客人( guestNo ,guestName,guestAddress)

任务:

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

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

我只能回答第一个问题

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

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

2 个答案:

答案 0 :(得分:0)

第一个问题采用 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任务-如果您被卡在某个地方,请回来!

答案 1 :(得分:0)

子查询是请求中的一个请求。当您要从另一个表中添加条件时,可以使用它,而该表与当前表的链接很少。

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'

结果将是相同的,但可读性更高,我猜想执行计划的损失也会更少。

现在,我不会全部练习,但我希望我的回答对您有所帮助