Mysql
 sql >> Database >  >> RDS >> Mysql

Conversione dell'algebra relazionale nella query SQL corrispondente

Ci sono un paio di modi in cui potresti guardare questo. La prima opzione potrebbe essere più semplice se hai più familiarità con i database rispetto all'algebra relazionale, mentre la seconda sarà più semplice (e più accurata per problemi più complessi) se hai familiarità con l'algebra relazionale.

Prima le tabelle:

Inizia calcolando i tuoi join. Sai che hai i tuoi tre set (tavoli) Guest , Reservation e Room , tutti e tre con sono uniti naturali (congiunti interni). Quindi potresti iniziare a scrivere la tua query in questo modo:

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

Una volta completato, applica le tue condizioni:

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;

In alternativa puoi inserire la condizione per g.age nel join a Reservation , ma si consiglia di inserire condizioni in WHERE clausola per INNER JOIN .

Infine, inserisci il tuo 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;

Ordine delle operazioni

Per questo, scrivi la tua query usando l'ordine delle operazioni. Quindi tutto ciò che è racchiuso tra parentesi viene eseguito per primo. In questo modo, inizi scrivendo la query su Guest :

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

Il prossimo set sarebbe Reservations , ed è naturale unito:

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

Infine, vieni nella Room insieme, sempre unito naturale:

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;