您可以通过多种方式来看待这个问题。如果您比关系代数更熟悉数据库,则第一个选项可能更容易,而如果您熟悉关系代数,则第二个选项会更容易(并且对于更复杂的问题更准确)。
表格优先:
首先弄清楚你的连接。你知道你有你的三组(表)Guest、Reservation 和Room,所有三个 with 都是自然连接的(内连接)。所以你可以像这样开始写你的查询:
SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_;
完成后,应用您的条件:
SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_
WHERE g.age < 20;
或者,您可以将g.age 的条件放在Reservation 的连接中,但建议将条件放在INNER JOIN 的WHERE 子句中。
最后,您填写您的SELECT:
SELECT g._guestId_,
res._roomId_,
r.price
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_
WHERE g.age < 20;
操作顺序
为此,您可以使用操作顺序编写查询。所以括号内的所有内容都会首先执行。这样做,您首先编写针对Guest 的查询:
SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;
下一组是Reservations,这是自然加入的:
SELECT g._guestId_,
res._roomId_
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_;
终于来到Room集合,再次自然加入:
SELECT g._guestId_,
res._roomId_,
r.price
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_
WHERE g.age < 20;