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.
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:
| Tabela | Linhas | Conteúdo |
|---|---|---|
| rental | 16.044 | locações de discos |
| payment | 16.049 | pagamentos de clientes |
| film_actor | 5.462 | papéis dos atores nos filmes |
| inventory | 4.581 | discos nas lojas |
| film | 1.000 | filmes |
| customer | 599 | clientes |
| city | 600 | cidades |
| actor | 200 | atores |
| country | 109 | países |
| category | 16 | gêneros |
| store | 2 | lojas |
Estrutura das tabelas
Clique em uma tabela para ver suas colunas, uma linha de exemplo e as chaves.
Lista de Tabelas
- actor_ididentificador único do registro (PK)
- first_nameprimeiro nome do ator
- last_namesobrenome do ator
- last_updatedata e hora da última atualização
| actor_id | first_name | last_name | last_update |
|---|---|---|---|
| 1 | John | Doe | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (actor_id)
- 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_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_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_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_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 | 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_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)
- 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_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_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_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_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_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_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 | 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_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;
| title | language | rental_rate | length |
|---|---|---|---|
| ACADEMY DINOSAUR | English | 0.99 | 86 |
| ACE GOLDFINGER | English | 4.99 | 48 |
| ADAPTATION HOLES | English | 2.99 | 50 |
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_name | last_name | city | country |
|---|---|---|---|
| MARY | SMITH | Sasebo | Japan |
| PATRICIA | JOHNSON | San Bernardino | United States |
| LINDA | WILLIAMS | Athenai | Greece |
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_date | title | amount |
|---|---|---|
| 2005-05-24 22:53:30 | BLANKET BEVERLY | 2.99 |
| 2005-05-24 22:54:33 | FREAKY POCUS | 2.99 |
| 2005-05-24 23:03:39 | GRADUATE LORD | 3.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.
- Fundamentos de SQL 39
- Cálculos 15
- Funções de Agregação 27
- Subconsultas 8
- Expressões de Tabela Comum (CTE) 5
- Funções de Janela 9
- Consultas Analíticas 33
- Consultas de Manipulação de Dados (DML) 12
- Linguagem de Definição de Dados (DDL) 4
Por onde começar
Os primeiros exercícios da seção "Banco de dados Sakila":
- Obtenha os atores
- Obtenha a lista de nomes de atores
- Lista de filmes ordenada
- Obtenha os primeiros 10 filmes em ordem alfabética
- Obtenha a terceira página da lista de filmes
- Obtenha uma lista de filmes ordenada por vários campos
- Obtenha o filme mais longo
- Encontre filmes longos
- Encontre comédias longas
- 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.