Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Convertendo a álgebra relacional para a consulta SQL correspondente


Existem algumas maneiras que você pode olhar para isso. A primeira opção pode ser mais fácil se você estiver mais familiarizado com bancos de dados do que com álgebra relacional, enquanto a segunda será mais fácil (e mais precisa para problemas mais complexos) se estiver familiarizado com álgebra relacional.

Primeiro as tabelas:

Comece descobrindo suas junções. Você sabe que tem seus três conjuntos (tabelas) Guest , Reservation , e Room , todos os três com são unidos naturalmente (unidos internamente). Então você pode começar a escrever sua consulta assim:
SELECT *
FROM Guest g
    INNER JOIN Reservation res
        ON g._guestId_ = res._guestId_
    INNER JOIN Room r
        ON res._roomId_ = r._roomId_;

Feito isso, aplique suas condições:
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, você pode colocar a condição para g.age na junção a Reservation , mas é recomendado colocar condições no WHERE cláusula para INNER JOIN .

Por fim, você preenche seu 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;

Ordem das operações

Para isso, você escreve sua consulta usando a ordem das operações. Então, tudo dentro de um parêntese é executado primeiro. Fazendo isso, você começa escrevendo a consulta em Guest :
SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;

O próximo conjunto seria Reservations , e isso é natural junto:
SELECT g._guestId_,
    res._roomId_
FROM Guest g
    INNER JOIN Reservation res
        ON g._guestId_ = res._guestId_;

Finalmente, você chega à Room set, novamente natural juntou:
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;