sql >> Base de Datos >  >> RDS >> Mysql

Conversión de álgebra relacional a la consulta SQL correspondiente

Hay un par de formas en las que podrías ver esto. La primera opción puede ser más fácil si está más familiarizado con las bases de datos que con el álgebra relacional, mientras que la segunda será más fácil (y más precisa para problemas más complejos) si está familiarizado con el álgebra relacional.

Tablas primero:

Comience por averiguar sus uniones. Sabes que tienes tus tres conjuntos (mesas) Guest , Reservation y Room , los tres con están unidos naturalmente (unidos internamente). Así que podrías empezar a escribir tu consulta así:

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

Una vez que esté completo, aplique sus condiciones:

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;

Alternativamente, puede poner la condición para g.age en la unión a Reservation , pero se recomienda poner condiciones en el WHERE cláusula para INNER JOIN .

Finalmente, completa su 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;

Orden de operaciones

Para esto, escribes tu consulta usando el orden de las operaciones. Entonces, todo lo que está dentro de un paréntesis se ejecuta primero. Al hacerlo de esta manera, comienza escribiendo la consulta contra Guest :

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

El siguiente conjunto sería Reservations , y eso es natural unido:

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

Finalmente, llegas a la Room conjunto, de nuevo unido natural:

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;