Mysql
 sql >> Base de données >  >> RDS >> Mysql

Conversion de l'algèbre relationnelle en requête SQL correspondante

Il y a deux façons de voir cela. La première option peut être plus facile si vous êtes plus familier avec les bases de données que l'algèbre relationnelle, tandis que la seconde sera plus facile (et plus précise pour les problèmes plus complexes) si vous êtes familier avec l'algèbre relationnelle.

Tableaux d'abord :

Commencez par déterminer vos jointures. Vous savez que vous avez vos trois ensembles (tableaux) Guest , Reservation , et Room , tous les trois avec sont joints naturels (joints intérieurs). Vous pouvez donc commencer à écrire votre requête comme suit :

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

Une fois cette opération terminée, appliquez vos conditions :

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;

Sinon, vous pouvez mettre la condition pour g.age dans la jointure à Reservation , mais il est recommandé de mettre des conditions dans le WHERE clause pour INNER JOIN .

Enfin, vous remplissez votre 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;

Ordre des opérations

Pour cela, vous écrivez votre requête en utilisant l'ordre des opérations. Ainsi, tout ce qui est entre parenthèses est exécuté en premier. En procédant ainsi, vous commencez par écrire la requête sur Guest :

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

L'ensemble suivant serait Reservations , et qui est naturellement joint :

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

Enfin, vous arrivez dans la Room ensemble, encore une fois naturel joint :

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;