Novo mês, novos objetivos. Sua ajuda ajuda o projeto a avançar. 🖥️ Apoie o sqltest →
Código SQL copiado para a área de transferência

Banco de dados Sakila: esquema, tabelas e exercícios de SQL

Sakila é o banco de dados de exemplo do MySQL que descreve uma rede de locadoras de filmes em DVD. No SQLtest.online você trabalha com ele direto no navegador: resolve exercícios com correção automática e executa suas próprias consultas no playground, sem instalar nada.

  • 16 tabelas e 7 views
  • 1.000 filmes
  • 16.044 locações
  • 179 exercícios de SQL

O que é o Sakila

O Sakila foi criado por Mike Hillyer, da equipe de documentação do MySQL, para que os exemplos da documentação e dos livros usassem um mesmo esquema realista. O nome vem de Sakila, o golfinho do logotipo do MySQL, e o banco é distribuído sob a licença BSD.

O banco modela um negócio comum: um catálogo de filmes com atores e gêneros, clientes e funcionários de duas lojas, locações de discos e pagamentos. Por isso é ótimo para aprender: os relacionamentos são claros sem explicação, e há dados suficientes para agrupamentos, funções de janela e análises.

Diagrama ER

O diagrama mostra as tabelas do Sakila e as chaves estrangeiras entre elas. Clique para abrir em tamanho real.

Diagrama ER do banco de dados Sakila

O que há no banco

As tabelas do Sakila se dividem em três grupos.

Catálogo de filmes

film, actor, category, language e as tabelas de ligação film_actor, film_category.

Lojas e pessoas

store, staff, customer e os endereços: address → city → country.

Locações e pagamentos

inventory guarda os discos de cada loja, rental as locações, payment os pagamentos.

O ponto principal: o cliente aluga um disco, não um filme. Por isso rental se liga a film através de inventory, e não diretamente. A tabela film_text é uma cópia auxiliar de títulos e descrições para busca de texto completo.

Quantos dados há nas principais tabelas:

TabelaLinhasConteúdo
rental16.044locações de discos
payment16.049pagamentos de clientes
film_actor5.462papéis dos atores nos filmes
inventory4.581discos nas lojas
film1.000filmes
customer599clientes
city600cidades
actor200atores
country109países
category16gêneros
store2lojas

Estrutura das tabelas

Clique em uma tabela para ver suas colunas, uma linha de exemplo e as chaves.

Lista de Tabelas

actor - tabela de atores.
  • actor_ididentificador único do registro (PK)
  • first_nameprimeiro nome do ator
  • last_namesobrenome do ator
  • last_updatedata e hora da última atualização
Exemplo de estrutura da tabela actor
actor_id first_name last_name last_update
1 John Doe 2023-01-01 12:00:00
  • PRIMARY KEY, btree (actor_id)
address - endereços de clientes e funcionários.
  • address_ididentificador único do registro (PK)
  • addressendereço postal
  • address2endereço adicional
  • districtdistrito ou região
  • city_ididentificador da cidade (FK)
  • postal_codecódigo postal
  • phonenúmero de telefone
  • last_updatedata e hora da última atualização
address_id address address2 district city_id postal_code phone last_update
1 123 Main St [null] Downtown 1 12345 +1234567890 2023-01-01 12:00:00
  • PRIMARY KEY, btree (address_id)
  • FOREIGN KEY (city_id) REFERENCES city(city_id)
category - categorias de filmes.
  • category_ididentificador único do registro (PK)
  • namenome da categoria
  • last_updatedata e hora da última atualização
category_id name last_update
1 Action 2023-01-01 12:00:00
  • PRIMARY KEY, btree (category_id)
city - tabela de cidades.
  • city_ididentificador único do registro (PK)
  • citynome da cidade
  • country_ididentificador do país (FK)
  • last_updatedata e hora da última atualização
city_id city country_id last_update
1 Metropolis 1 2023-01-01 12:00:00
  • PRIMARY KEY, btree (city_id)
  • FOREIGN KEY (country_id) REFERENCES country(country_id)
country - tabela de países.
  • country_ididentificador único do registro (PK)
  • countrynome do país
  • last_updatedata e hora da última atualização
country_id country last_update
1 United States 2023-01-01 12:00:00
  • PRIMARY KEY, btree (country_id)
customer - tabela de clientes.
  • customer_ididentificador único do registro (PK)
  • store_ididentificador da loja (FK)
  • first_nameprimeiro nome do cliente
  • last_namesobrenome do cliente
  • emailendereço de e-mail do cliente
  • address_ididentificador do endereço (FK)
  • activeindicador de atividade do cliente (0/1)
  • create_datedata e hora em que o cliente foi adicionado ao banco de dados
  • last_updatedata e hora da última atualização
customer_id store_id first_name last_name email address_id active create_date last_update
1 1 John Doe john.doe@example.com 1 1 2023-01-01 12:00:00 2023-01-01 12:00:00
  • PRIMARY KEY, btree (customer_id)
  • FOREIGN KEY (store_id) REFERENCES store(store_id)
  • FOREIGN KEY (address_id) REFERENCES address(address_id)
film - tabela de filmes.
  • film_idid único do registro (PK)
  • titletítulo do filme
  • descriptionbreve descrição ou enredo do filme
  • release_yearano em que o filme foi lançado
  • language_ididentificador do idioma do filme (FK)
  • original_language_idid do idioma original do filme, caso seja dublado em um novo idioma
  • rental_durationduração do período de aluguel em dias
  • rental_ratecusto do aluguel do filme pelo período especificado na coluna duracao_aluguel
  • lengthduração do filme em minutos
  • replacement_costvalor da penalidade por perda ou dano do disco
  • ratingclassificação atribuída ao filme. Pode ser um dos seguintes: G, PG, PG-13, R ou NC-17
  • special_featureslista de recursos especiais incluídos no DVD. Pode ser nenhum ou mais dos seguintes: Trailers, Comentários, Cenas Excluídas, Por Trás das Cenas
  • last_updatedata e hora da última atualização
film_id title description release_year language_id original_language_id rental_duration rental_rate length replacement_cost rating special_features last_update
1 Film Title A brief description of the film. 2000 1 2 5 4.99 120 19.99 PG-13 Trailers, Commentaries 2023-01-01 12:00:00
  • PRIMARY KEY, btree (film_id)
  • FOREIGN KEY (language_id) REFERENCES language(language_id)
  • FOREIGN KEY (original_language_id) REFERENCES language(language_id)
film_actor - relação entre atores e filmes.
  • actor_ididentificador do ator (FK)
  • film_ididentificador do filme (FK)
  • last_updatedata e hora da última atualização
actor_id film_id last_update
1 1 2023-01-01 12:00:00
  • PRIMARY KEY, btree (actor_id, film_id)
  • FOREIGN KEY (actor_id) REFERENCES actor(actor_id)
  • FOREIGN KEY (film_id) REFERENCES film(film_id)
film_category - relação entre filmes e categorias.
  • film_ididentificador de cada filme (FK)
  • category_ididentificador de cada categoria (FK)
  • last_updatedata e hora da última atualização
film_id category_id last_update
1 1 2023-01-01 12:00:00
  • PRIMARY KEY, btree (film_id, category_id)
  • FOREIGN KEY (film_id) REFERENCES film(film_id)
  • FOREIGN KEY (category_id) REFERENCES category(category_id)
inventory - tabela de inventário.
  • inventory_ididentificador único do registro (PK)
  • film_ididentificador do filme (FK)
  • store_idid da loja onde o inventário está localizado (FK)
  • last_updatedata e hora da última atualização
inventory_id film_id store_id last_update
1 23 2 2023-01-01 12:00:00
  • PRIMARY KEY, btree (inventory_id)
  • FOREIGN KEY (film_id) REFERENCES film(film_id)
  • FOREIGN KEY (store_id) REFERENCES store(store_id)
language - idiomas dos filmes.
  • language_ididentificador único do registro (PK)
  • nomenome do idioma
  • last_updatedata e hora da última atualização
language_id name last_update
1 English 2023-01-01 12:00:00
  • PRIMARY KEY, btree (language_id)
payment - pagamentos dos clientes.
  • payment_ididentificador único do registro (PK)
  • customer_ididentificador do cliente (FK)
  • staff_idid do funcionário que recebeu o pagamento (FK)
  • rental_ididentificador do registro de aluguel (FK)
  • amountvalor do pagamento
  • payment_datedata e hora do pagamento
  • last_updatedata e hora da última atualização
payment_id customer_id staff_id rental_id amount payment_date last_update
1 1 1 1 4.99 2023-01-01 12:13:14 2023-01-01 12:14:15
  • PRIMARY KEY, btree (payment_id)
  • FOREIGN KEY (customer_id) REFERENCES customer(customer_id)
  • FOREIGN KEY (staff_id) REFERENCES staff(staff_id)
  • FOREIGN KEY (rental_id) REFERENCES rental(rental_id)
rental - aluguéis dos clientes.
  • rental_ididentificador único do registro (PK)
  • rental_datedata de início do aluguel
  • inventory_ididentificador do disco (FK)
  • customer_ididentificador do cliente (FK)
  • return_datedata de devolução do filme
  • staff_idid do funcionário que emitiu o disco (FK)
  • last_updatedata e hora da última atualização
rental_id rental_date inventory_id customer_id return_date staff_id last_update
1 2023-01-01 16:15:21 1 1 2023-01-10 09:12:36 1 2023-01-01 12:00:00
  • PRIMARY KEY, btree (rental_id)
  • FOREIGN KEY (inventory_id) REFERENCES inventory(inventory_id)
  • FOREIGN KEY (customer_id) REFERENCES customer(customer_id)
  • FOREIGN KEY (staff_id) REFERENCES staff(staff_id)
staff - equipe da empresa.
  • staff_ididentificador único do registro (PK)
  • first_nameprimeiro nome do membro da equipe
  • last_namesobrenome do membro da equipe
  • address_ididentificador do endereço (FK)
  • picturefotografia do membro da equipe
  • emailendereço de e-mail do membro da equipe
  • store_idchave estrangeira referenciando a tabela de lojas (FK)
  • activeindicador de atividade do membro da equipe (0/1)
  • usernamenome de usuário para login no sistema
  • passwordsenha para login
  • last_updatedata e hora da última atualização
staff_id first_name last_name address_id picture email store_id active username password last_update
1 John Doe 1 [null] john.doe@example.com 1 1 johndoe ******** 2023-01-01 12:00:00
  • PRIMARY KEY, btree (staff_id)
  • FOREIGN KEY (address_id) REFERENCES address(address_id)
  • FOREIGN KEY (store_id) REFERENCES store(store_id)
store - histórias da empresa.
  • store_ididentificador único do registro (PK)
  • manager_staff_ididentificador do gerente da loja (FK)
  • address_ididentificador do endereço (FK)
  • last_updatedata e hora da última atualização
store_id manager_staff_id address_id last_update
1 1 1 2023-01-01 12:00:00
  • PRIMARY KEY, btree (store_id)
  • FOREIGN KEY (manager_staff_id) REFERENCES staff(staff_id)
  • FOREIGN KEY (address_id) REFERENCES address(address_id)

Exemplos de consultas

Estas consultas mostram como as tabelas se relacionam. Copie qualquer uma e execute no playground.

Um filme e seu idioma: um relacionamento simples de muitos para um.

SELECT f.title, l.name AS language, f.rental_rate, f.length
FROM film f
JOIN language l ON l.language_id = f.language_id
ORDER BY f.film_id
LIMIT 3;
titlelanguagerental_ratelength
ACADEMY DINOSAUREnglish0.9986
ACE GOLDFINGEREnglish4.9948
ADAPTATION HOLESEnglish2.9950

Onde o cliente mora: uma cadeia de quatro tabelas.

SELECT c.first_name, c.last_name, ci.city, co.country
FROM customer c
JOIN address a ON a.address_id = c.address_id
JOIN city ci ON ci.city_id = a.city_id
JOIN country co ON co.country_id = ci.country_id
ORDER BY c.customer_id
LIMIT 3;
first_namelast_namecitycountry
MARYSMITHSaseboJapan
PATRICIAJOHNSONSan BernardinoUnited States
LINDAWILLIAMSAthenaiGreece

Qual filme foi alugado e quanto foi pago: da locação ao filme passando por inventory.

SELECT r.rental_date, f.title, p.amount
FROM rental r
JOIN inventory i ON i.inventory_id = r.inventory_id
JOIN film f ON f.film_id = i.film_id
JOIN payment p ON p.rental_id = r.rental_id
ORDER BY r.rental_id
LIMIT 3;
rental_datetitleamount
2005-05-24 22:53:30BLANKET BEVERLY2.99
2005-05-24 22:54:33FREAKY POCUS2.99
2005-05-24 23:03:39GRADUATE LORD3.99

Exercícios de SQL por tema

Há 179 exercícios no banco Sakila, de consultas SELECT simples a análises com funções de janela. As soluções são verificadas automaticamente em um MySQL real. O número à direita é a quantidade de exercícios do tema; os pontos coloridos mostram a faixa de dificuldade.

Por onde começar

Os primeiros exercícios da seção "Banco de dados Sakila":

  1. Obtenha os atores
  2. Obtenha a lista de nomes de atores
  3. Lista de filmes ordenada
  4. Obtenha os primeiros 10 filmes em ordem alfabética
  5. Obtenha a terceira página da lista de filmes
  6. Obtenha uma lista de filmes ordenada por vários campos
  7. Obtenha o filme mais longo
  8. Encontre filmes longos
  9. Encontre comédias longas
  10. Filmes clássicos

Todos os exercícios do Sakila →

Perguntas frequentes

Preciso instalar o MySQL para usar o Sakila?

Não. Os exercícios e o playground do SQLtest.online executam as consultas nos nossos servidores, então basta um navegador. No playground, o Sakila está disponível no MySQL 8.0, no MySQL 9.7 e no MariaDB 10.

Onde baixar o banco de dados Sakila?

Os arquivos oficiais sakila-schema.sql e sakila-data.sql estão na página de bancos de exemplo do MySQL, e a documentação do Sakila os descreve.

Existe Sakila para PostgreSQL?

Sim, existe uma versão chamada Pagila. A estrutura é a mesma, mas alguns tipos e funções foram trocados pelos equivalentes do PostgreSQL.

Posso alterar os dados do Sakila?

No playground o banco é somente leitura, para que todos vejam os mesmos dados. Os exercícios de INSERT, UPDATE e DELETE rodam em uma cópia temporária da tabela necessária, e depois o conteúdo dessa cópia é verificado.

O Sakila serve para se preparar para entrevistas de SQL?

Sim. Com ele é fácil praticar JOINs, agrupamentos, subconsultas e funções de janela, os temas mais cobrados em entrevistas técnicas.