Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Konvertieren der relationalen Algebra in die entsprechende SQL-Abfrage

Es gibt zwei Möglichkeiten, wie Sie dies betrachten können. Die erste Option ist möglicherweise einfacher, wenn Sie mit Datenbanken besser vertraut sind als mit relationaler Algebra, während die zweite einfacher (und genauer für komplexere Probleme) ist, wenn Sie mit relationaler Algebra vertraut sind.

Tabellen zuerst:

Beginnen Sie damit, Ihre Joins herauszufinden. Sie wissen, dass Sie Ihre drei Sätze (Tabellen) Guest haben , Reservation , und Room , alle drei von with sind natürlich verbunden (inner verbunden). Sie könnten also damit beginnen, Ihre Abfrage so zu schreiben:

SELECT *
FROM Guest g
    INNER JOIN Reservation res
        ON g._guestId_ = res._guestId_
    INNER JOIN Room r
        ON res._roomId_ = r._roomId_;

Sobald dies abgeschlossen ist, wenden Sie Ihre Bedingungen an:

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;

Alternativ können Sie die Bedingung für g.age setzen im Join zu Reservation , aber es wird empfohlen, Bedingungen in WHERE zu setzen -Klausel für INNER JOIN .

Schließlich füllen Sie Ihr SELECT aus :

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;

Betriebsordnung

Dazu schreiben Sie Ihre Abfrage in der Reihenfolge der Operationen. Also wird alles innerhalb einer Klammer zuerst ausgeführt. Auf diese Weise beginnen Sie damit, die Abfrage für Guest zu schreiben :

SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;

Der nächste Satz wäre Reservations , und das ist natürlich verbunden:

SELECT g._guestId_,
    res._roomId_
FROM Guest g
    INNER JOIN Reservation res
        ON g._guestId_ = res._guestId_;

Schließlich kommst du in den Room gesetzt, wieder natürlich verbunden:

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;