Baixe o app para aproveitar ainda mais
Prévia do material em texto
Respostas da Lista de BD I – Exercícios de Revisão! Há duas formas de se fazer uma junção. Ou se usa o INNER JOIN, ou faz a junção pela comparação direta das CHAVES primárias e estrangeiras. a) Listar o Título e o Ano dos filmes produzidos pela Miramax. select titulo, ano from filme INNER JOIN produtora ON (filme.cprodutora = produtora.codprodutora ) where nomeprodutora = 'Miramax'; ou ... select titulo, ano from filme, produtora where filme.cprodutora = produtora.codprodutora and nomeprodutora = 'Miramax'; OBS: as duas instruções são equivalentes b) Listar a Produtora e o Estúdio que produziram filmes com menos de uma hora e meia de duração. select nomeprodutora, nomeestudio from filme INNER JOIN produtora ON (filme.cprodutora = produtora.codprodutora) INNER JOIN estudio ON (estudio.codestudio = filme.cestudio) where filme.duracao < 90; select nomeprodutora, nomeestudio from filme, produtora, estudio where filme.cprodutora = produtora.codprodutora and estudio.codestudio = filme.cestudio and filme.duracao < 90; c) Listar os nomes dos atores que atuaram no filme 'Quero ser Grande'. select nome from ator INNER JOIN atuação ON (ator.codator = atuacao.cator) INNER JOIN filme ON (filme.codfilme = atuacao.cfilme) where filme.titulo = 'Quero ser Grande'; select nome from ator, atuacao, filme where ator.codator = atuacao.cator and filme.codfilme = atuacao.cfilme and filme.titulo = 'Quero ser Grande'; d) Listar os títulos dos filmes e o nome das produtoras que os produziram. select titulo, nomeprodutora from filme INNER JOIN produtora ON (filme.cprodutora = produtora.codprodutora) select titulo, nomeprodutora from filme, produtora where filme.cprodutora = produtora.codprodutora e) Listar distintamente os endereços das produtoras que produziram filmes com mais de uma hora e meia de duração. select distinct produtora.endereco from filme INNER JOIN produtora ON (filme.cprodutora = produtora.codprodutora) where filme.duracao > 90 select distinct produtora.endereco from filme, produtora where filme.cprodutora = produtora.codprodutora and filme.duracao > 90 * Listar a quantidade de filmes produzidos por cada Produtora select NomeProdutora, COUNT(*) from Produtora INNER JOIN Filmes ON (produtora.CodProdutora = Filmes.CProdutora) group by NomeProdutora; COUNT(*) – conta quantos registros tem. Neste caso, os registros estão sendo agrupados pelo nome da Produtora... ou seja, NomeProdutora Filme Miramax Filme1 Miramax Filme2 PlayArt Filme3 PlayArt Filme4 PlayArt Filme5 Neste caso ele agrupa pelo Nome da Produtora apenas com o Nome igual e conta quantas linhas tem cada subgrupo. A resposta será : Miramax 2 PlayArt 3 Subgrupo 1 Subgrupo 2 Apenas um exemplo de SELECT aninhado f) Listar os nomes dos filmes em que os atores Tom Hanks e Meg Ryan atuaram juntos. select titulo from filme INNER JOIN atuacao ON (filme.codfilme = atuacao.cfilme) INNER JOIN ator ON (ator.codator = atuacao.cator) where ator.nome = 'Tom Hanks' and filme.codfilme in ( select codfilme from filme INNER JOIN atuacao ON (filme.codfilme = atuacao.cfilme) INNER JOIN ator ON (ator.codator = atuacao.cator) where ator.nome = 'Meg Ryan' ) select titulo from filme, ator, atuacao where filme.codfilme = atuacao.cfilme and ator.codator = atuacao.cator and ator.nome = 'Tom Hanks' and filme.codfilme in ( select codfilme from filme, ator, atuacao where filme.codfilme = atuacao.cfilme and ator.codator = atuacao.cator and ator.nome = 'Meg Ryan' ) Explicando este último SQL Esse problema usa um SQL aninhado... Por quê? O problema pode ser dividido em dois... Quais os filmes que a Meg Ryan participou? E depois, quais os filmes que o Tom Hanks participou? Se analisarmos, são duas consultas distintas, com isso o Select mais interno faz a consulta do código dos filmes que a Meg Ryan participou e o mais externo faz a consulta dos filmes que o Tom Hanks participou. Agora como juntas os dois SQLs (as duas consultas)? Nós podemos usar o comando IN, pois eu quero apenas os filmes em que os dois aparecem!!! Ele funciona assim: atributo IN (10,20,30) Ou seja, verifica se o atributo é igual a 10 ou a 20 ou a 30. O SELECT interno retorna o código dos filmes que a Meg Ryan fez, ou seja, algo do tipo (01,50,65,157) Aproveitando essa lista de código de filmes, o SQL para os filmes do Tom Hans é complementado com a cláusula: ator.nome = 'Tom Hanks' and filme.codfilme in ( select codfilme … Esse select aninhado tará a lista de códigos dos filmes que a Meg Ryan fez, ou seja, o comando na verdade fica algo desse tipo: ator.nome = 'Tom Hanks' and filme.codfilme in (01,50,65,157) Com isso o comando retornará apenas o nome dos filmes que o Tom Hanks fez, mas que também tenham sido feitos pela Meg Ryan!!!!
Compartilhar