CS50-MCZ

Uma introdução aos empreendimentos intelectuais da Ciência da Computação e da arte da programação.


Movies


Escreva consultas SQL para responder perguntas sobre um banco de dados de filmes.

Começando

Acesse code.cs50.io, clique na janela do seu terminal e execute cd sozinho. Você deve encontrar que o prompt da janela do seu terminal se assemelha ao abaixo:

$

Depois execute

wget https://cdn.cs50.net/2022/fall/psets/7/movies.zip

para baixar um arquivo ZIP chamado movies.zip para o seu espaço de código.

Em seguida, execute

unzip movies.zip

para criar uma pasta chamada movies. Você não precisa mais do arquivo ZIP, então pode executar

rm movies.zip

e responda com "y" seguido de Enter no prompt para remover o arquivo ZIP que você baixou.

Agora digite

cd movies

seguido de Enter para se mover para dentro (ou seja, abrir) esse diretório. Seu prompt agora deve se parecer com o abaixo.

movies/ $

Execute ls sozinho e você deverá ver 13 arquivos .sql, assim como movies.db.

Se você encontrar algum problema, siga essas mesmas etapas novamente e veja se pode determinar onde você errou!

Entendendo

É fornecido a você um arquivo chamado movies.db, um banco de dados SQLite que armazena dados do IMDb sobre filmes, as pessoas que os dirigiram e estrelaram, e suas avaliações. Em uma janela de terminal, execute sqlite3 movies.db para poder começar a executar consultas no banco de dados.

Primeiro, quando o sqlite3 solicitar uma consulta, digite .schema e pressione enter. Isso exibirá as declarações CREATE TABLE que foram usadas para gerar cada uma das tabelas no banco de dados. Ao examinar essas declarações, você pode identificar as colunas presentes em cada tabela.

Observe que a tabela movies tem uma coluna id que identifica exclusivamente cada filme, assim como colunas para o título de um filme e o ano em que o filme foi lançado. A tabela people também possui uma coluna id, e também possui colunas para o nome e o ano de nascimento de cada pessoa.

As avaliações dos filmes, por sua vez, são armazenadas na tabela ratings. A primeira coluna na tabela é movie_id: uma chave estrangeira que referencia o id da tabela movies. O restante da linha contém dados sobre a avaliação de cada filme e o número de votos que o filme recebeu no IMDb.

Finalmente, as tabelas stars e directors relacionam pessoas aos filmes nos quais elas atuaram ou dirigiram. (Apenas as estrelas e diretores principais estão incluídos.) Cada tabela possui apenas duas colunas: movie_id e person_id, que referenciam um filme e uma pessoa específicos, respectivamente.

O desafio que está à sua frente é escrever consultas SQL para responder a uma variedade de perguntas diferentes, selecionando dados de uma ou mais dessas tabelas.

Especificação

Para cada um dos problemas a seguir, você deve escrever uma única consulta SQL que produza os resultados especificados por cada problema. Sua resposta deve estar na forma de uma única consulta SQL, embora você possa aninhar outras consultas dentro da sua consulta. Você não deve assumir nada sobre os ids de filmes ou pessoas específicos: suas consultas devem ser precisas mesmo se o id de um filme ou pessoa específica for diferente. Por fim, cada consulta deve retornar apenas os dados necessários para responder à pergunta: se o problema apenas pede para exibir os nomes dos filmes, por exemplo, sua consulta não deve exibir também o ano de lançamento de cada filme.

Você pode comparar os resultados de suas consultas com o próprio IMDb, mas esteja ciente de que as avaliações no site podem ser diferentes das do movies.db, pois pode ter havido mais votos desde o momento em que os dados foram baixados!

  1. Em 1.sql, escreva uma consulta SQL para listar os títulos de todos os filmes lançados em 2008.
    • Sua consulta deve exibir uma tabela com uma única coluna para o título de cada filme.
  2. Em 2.sql, escreva uma consulta SQL para determinar o ano de nascimento de Emma Stone.
    • Sua consulta deve exibir uma tabela com uma única coluna e uma única linha (sem contar o cabeçalho) contendo o ano de nascimento de Emma Stone.
    • Você pode assumir que existe apenas uma pessoa no banco de dados com o nome Emma Stone.
  3. Em 3.sql, escreva uma consulta SQL para listar os títulos de todos os filmes com data de lançamento em ou após 2018, em ordem alfabética.
    • Sua consulta deve exibir uma tabela com uma única coluna para o título de cada filme.
    • Os filmes lançados em 2018 devem ser incluídos, assim como os filmes com datas de lançamento futuras.
  4. Em 4.sql, escreva uma consulta SQL para determinar o número de filmes com uma classificação IMDb de 10.0.
    • Sua consulta deve exibir uma tabela com uma única coluna e uma única linha (sem contar o cabeçalho) contendo o número de filmes com classificação 10.0.
  5. Em 5.sql, escreva uma consulta SQL para listar os títulos e os anos de lançamento de todos os filmes de Harry Potter, em ordem cronológica.
    • Sua consulta deve exibir uma tabela com duas colunas, uma para o título de cada filme e outra para o ano de lançamento de cada filme.
    • Você pode assumir que o título de todos os filmes de Harry Potter começará com as palavras "Harry Potter" e que se um título de filme começar com as palavras "Harry Potter", é um filme de Harry Potter.
  6. Em 6.sql, escreva uma consulta SQL para determinar a classificação média de todos os filmes lançados em 2012.
    • Sua consulta deve exibir uma tabela com uma única coluna e uma única linha (não contando o cabeçalho) contendo a classificação média.
  7. Em 7.sql, escreva uma consulta SQL para listar todos os filmes lançados em 2010 e suas classificações, em ordem decrescente por classificação. Para filmes com a mesma classificação, ordene-os em ordem alfabética pelo título.
    • Sua consulta deve exibir uma tabela com duas colunas, uma para o título de cada filme e outra para a classificação de cada filme.
    • Filmes que não possuem classificação não devem ser incluídos no resultado.
  8. Em 8.sql, escreva uma consulta SQL para listar os nomes de todas as pessoas que atuaram em Toy Story.
    • Sua consulta deve exibir uma tabela com uma única coluna para o nome de cada pessoa.
    • Você pode assumir que há apenas um filme no banco de dados com o título Toy Story.
  9. Em 9.sql, escreva uma consulta SQL para listar os nomes de todas as pessoas que atuaram em um filme lançado em 2004, ordenadas por ano de nascimento.
    • Sua consulta deve exibir uma tabela com uma única coluna para o nome de cada pessoa.
    • Pessoas com o mesmo ano de nascimento podem ser listadas em qualquer ordem.
    • Não é necessário se preocupar com pessoas que não têm ano de nascimento listado, contanto que aqueles que têm um ano de nascimento sejam listados em ordem.
    • Se uma pessoa apareceu em mais de um filme em 2004, ela deve aparecer apenas uma vez nos resultados.
  10. No arquivo 10.sql, escreva uma consulta SQL para listar os nomes de todas as pessoas que dirigiram um filme que recebeu uma classificação de pelo menos 9.0.
    • Sua consulta deve gerar uma tabela com uma única coluna para o nome de cada pessoa.
    • Se uma pessoa dirigiu mais de um filme que recebeu uma classificação de pelo menos 9.0, ela deve aparecer nos resultados apenas uma vez.
  11. No arquivo 11.sql, escreva uma consulta SQL para listar os títulos dos cinco filmes com as classificações mais altas (em ordem) em que Chadwick Boseman atuou, começando pelo mais bem avaliado.
    • Sua consulta deve gerar uma tabela com uma única coluna para o título de cada filme.
    • Você pode assumir que há apenas uma pessoa no banco de dados com o nome Chadwick Boseman.
  12. No arquivo 12.sql, escreva uma consulta SQL para listar os títulos de todos os filmes em que Johnny Depp e Helena Bonham Carter atuaram.
    • Sua consulta deve gerar uma tabela com uma única coluna para o título de cada filme.
    • Você pode assumir que há apenas uma pessoa no banco de dados com o nome Johnny Depp.
    • Você pode assumir que há apenas uma pessoa no banco de dados com o nome Helena Bonham Carter.
  13. No arquivo 13.sql, escreva uma consulta SQL para listar os nomes de todas as pessoas que atuaram em um filme em que Kevin Bacon também atuou.
    • Sua consulta deve gerar uma tabela com uma única coluna para o nome de cada pessoa.
    • Pode haver várias pessoas com o nome Kevin Bacon no banco de dados. Certifique-se de selecionar apenas o Kevin Bacon nascido em 1958.
    • O próprio Kevin Bacon não deve ser incluído na lista resultante.

Uso

Para testar suas consultas no VS Code, você pode consultar o banco de dados executando

$ cat filename.sql | sqlite3 movies.db

onde filename.sql é o arquivo que contém sua consulta SQL.

Você também pode executar

$ cat filename.sql | sqlite3 movies.db > output.txt

para redirecionar a saída da consulta para um arquivo de texto chamado output.txt. (Isso pode ser útil para verificar quantas linhas são retornadas pela sua consulta!)

Dicas

Testando

Embora o check50 esteja disponível para este problema, você é incentivado a testar seu código por conta própria para cada um dos seguintes itens. Você pode executar sqlite3 movies.db para executar consultas adicionais no banco de dados e garantir que seu resultado esteja correto.

Se você estiver usando o banco de dados movies.db fornecido neste conjunto de problemas, você deverá constatar que

Observe que as contagens de linhas não incluem linhas de cabeçalho que mostram apenas os nomes das colunas.

Se sua consulta retornar um número de linhas ligeiramente diferente do resultado esperado, verifique se você está lidando corretamente com duplicatas! Para consultas que solicitam uma lista de nomes, nenhuma pessoa deve ser listada duas vezes, mas duas pessoas diferentes com o mesmo nome devem ser listadas separadamente.

Execute o código abaixo para avaliar a correção do seu código usando check50.

check50 cs50/problems/2023/x/movies

Como enviar

No seu terminal, execute o comando abaixo para enviar o seu trabalho.

submit50 cs50/problems/2023/x/movies

Agradecimentos

Informações cortesia de IMDb (imdb.com). Usado com permissão.