sql - 在子查询/加入 SQL 中需要帮助
问题描述
我遇到了这个练习:
以下表构成关系 DBMS 中保存的数据库的一部分:
- 酒店(酒店编号,酒店名称,酒店地址)
- 房间(房间号,酒店号,类型,价格)
- 预订 ( hotelNo , guestNo , dateFrom , dateTo, roomNo)
- 来宾(来宾号、来宾姓名、来宾地址)
任务:
- 列出“绿宫”酒店所有房间的价格和类型。
- 列出目前入住“绿宫”酒店的所有客人。
- 列出“绿宫”酒店所有客房的详细信息,包括入住该客房的客人姓名(如果该客房有人入住)。
- 今天预订“绿宫”酒店的总收入是多少?
- 列出“绿宫”酒店目前空置的房间。
- “绿宫”酒店空置房间的收入损失是多少?
练习表明我应该使用子查询或连接方法。
我只能回答第一个问题
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 不可为空,您将获得相同的结果。如果它可以为空,您将获得 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'
结果将是相同的,但我猜它更具可读性并且执行计划将更少丢失。
现在,我不会做整个练习,但我希望我的回答能帮助你
推荐阅读
- apache-spark - Spark——对多列连接的性能影响
- xamarin.android - Azure Devops Android 发布到 Google Play 商店失败
- python - 提高稀疏张量收缩的性能
- typescript - 从返回的响应中为接口创建自定义字段
- firefox - 为什么 Firefox 对 Rust HTTP 服务器的请求会阻塞 TcpStream::read?
- powershell - PS shell 和 CMD shell 中运行命令的区别
- r - 在 Shiny 中插入 bspopover
- r - kableExtra - 条纹颜色
- javascript - 如何用子图像覆盖固定大小的容器,保持全宽/高比?
- spring-boot - 在 Spring Boot 中无法使用 Spring-WS 使用 SOAP WS,但可以从 SOAPUI 工作