我遇到了这个练习:
以下表格构成了关系DBMS中保存的数据库的一部分:
任务:
练习表明我应该使用子查询或联接方法。
我只能回答第一个问题
SELECT price, type
FROM room
WHERE hotelNo = (SELECT hotelNo
FROM hotel
WHERE hotelName = "Green Palace")
其他问题在一个语句中涉及多个子查询(我不知道该怎么做),而且我不了解子查询和联接之间的区别。 我该如何回答其他问题?
答案 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'
结果将是相同的,但可读性更高,我猜想执行计划的损失也会更少。
现在,我不会全部练习,但我希望我的回答对您有所帮助