我遇到了这个练习:
以下表格构成关系DBMS中数据库的一部分:
- 酒店(酒店编号,酒店名称,酒店地址(
- 房间(房间号,酒店号
- 预订(酒店编号,客人编号ateFrom、dateTo、roomNo(
- guest(guestNo,guestName,guestAddress(
任务:
- 列出"绿宫"酒店所有客房的价格和类型
- 列出目前入住"绿宫"酒店的所有客人
- 列出"绿宫"酒店所有房间的详细信息,包括入住该房间的客人的姓名(如果该房间已入住(
- 今天预订"绿宫"酒店的总收入是多少
- 列出"绿宫"酒店目前空置的房间
- "绿宫"酒店空置客房的收入损失是多少
练习指出我应该使用子查询或联接方法。
我只能回答的第一个问题
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——如果你被困在某个地方,就回来吧!