首页 > 解决方案 > 在子查询/加入 SQL 中需要帮助

问题描述

我遇到了这个练习:

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

任务:

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

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

我只能回答第一个问题

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

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

标签: sql

解决方案


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

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 的用户。

因此,对于您的第一个问题,我更喜欢使用 join :

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

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

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


推荐阅读