sql >> Databasteknik >  >> RDS >> Mysql

Konvertera relations algebra till motsvarande SQL-fråga

Det finns två sätt att se på detta. Det första alternativet kan vara lättare om du är mer bekant med databaser än relationalgebra, medan det andra blir enklare (och mer exakt för mer komplexa problem) om du är bekant med relationalgebra.

Tables First:

Börja med att ta reda på dina anslutningar. Du vet att du har dina tre set (tabeller) Guest , Reservation och Room , alla tre med är naturligt sammanfogade (inre sammanfogade). Så du kan börja skriva din fråga så här:

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

När det är klart, tillämpa dina villkor:

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;

Alternativt kan du sätta villkoret för g.age i kopplingen till Reservation , men det rekommenderas att sätta villkor i WHERE klausul för INNER JOIN .

Slutligen fyller du i din 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;

Ordning av operationer

För detta skriver du din fråga med hjälp av operationsordning. Så allt inom en parentes exekveras först. Om du gör det på detta sätt börjar du med att skriva frågan mot Guest :

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

Nästa uppsättning skulle vara Reservations , och det är naturligt förenat:

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

Slutligen kommer du till Room set, återigen naturligt sammanfogat:

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. Varför försöker rails ansluta till mysql?

  2. Hämta anonymt PLSQL-blockresultat

  3. Välj minsta värde från flera kolumner med PHP/MySQL

  4. Konvertera Long till Varchar2