将关系代数转换为相应的SQL查询

时间:2016-04-17 15:29:53

标签: mysql sql relational-algebra

我试图了解如何正确地从关系代数转换为 SQL查询

我发现这是我努力转换的事情之一。有人能分享任何提示吗?

表格:

<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="map" style="width: 400px; height: 300px;"></div>
Duration:
<input id="duration" />Distance:
<input id="distance" />Origin Longitude
<input id="origin_longitude" />Origin Latitude
<input id="origin_latitude" />Destination Longitude
<input id="destination_longitude" />Destination Latitude
<input id="destination_latitude" />
<div>

关系代数:

Room(_roomId_, numberOfBeds, price)

Guest(_guestId_, homeTown, age)

Reservation(_roomId_, _guestId_, date)

查询: 我设法从声明的一部分中推断出以下内容:

Πprice(ΠroomId(ΠguestId(σage<20)Guest) Natural Join Reservation) Natural Join Room

我关闭了吗?

2 个答案:

答案 0 :(得分:2)

您可以通过以下几种方式来看待这一点。如果你更熟悉数据库然后关系代数,第一个选项可能会更容易,而如果你熟悉关系代数,第二个选项会更容易(对于更复杂的问题更准确)。

表格第一:

首先找出你的联接。你知道你有三套(表格)GuestReservationRoom,所有三个都是自然连接的(内连接)。所以你可以开始写你的查询:

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,但建议在条件WHERE INNER JOIN中添加条件。

最后,您填充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;

答案 1 :(得分:0)

应该是这样的......

{{#each calculatedRooms as |room|}}
   <button class="room-container {{if (is-equal currentRoomId room.id) 'currentRoom'}}" 
     {{action "onRoomClicked" room.id}}>
    ...
{{/each}}

在您的关系代数表示法中,您拥有SELECT price, _roomId_ FROM room inner join Reservation on (reservation._roomId_ = room._roomId_ inner join Guest on (reservation._guestId = guest._guestId and age <20) ; price(选择)的项目,然后您在roomId和此笛卡尔积Guest and Reservation之间的自然加入之间进行自然加入..自然连接在sql中通过内部连接在关系两侧的主键上表达。最后你在and Room上有条件这是一个由where子句或直接在连接条件addinng管理的条件guest age条款