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



我遇到了这个练习:

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

  • 酒店(酒店编号,酒店名称,酒店地址(
  • 房间(房间号酒店号
  • 预订(酒店编号客人编号ateFrom、dateTo、roomNo(
  • guest(guestNo,guestName,guestAddress(

任务:

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

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

我只能回答的第一个问题

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

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

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

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不可为null,则会得到相同的结果。如果它可以为null,那么您也将获得userId为null的用户。

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

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

结果会是一样的,但我想它更可读,执行计划也会更少丢失。

现在,我不会做全部的练习,但我希望我的答案能帮助你

对于您的第一个问题,使用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——如果你被困在某个地方,就回来吧!

最新更新