Sakila Dataset For SQL
Sakila Dataset For SQL
Sakila Dataset For SQL
Table of Contents
1
2
3
4
5
Legal Notices
Copyright 2007, 2016, Oracle and/or its affiliates. All rights reserved.
This software and related documentation are provided under a license agreement containing
restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly
permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate,
broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any
form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless
required by law for interoperability, is prohibited.
The information contained herein is subject to change without notice and is not warranted to be errorfree. If you find any errors, please report them to us in writing.
If this is software or related documentation that is delivered to the U.S. Government or anyone
licensing it on behalf of the U.S. Government, then the following notice is applicable:
U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated
software, any programs installed on the hardware, and/or documentation, delivered to U.S.
Government end users are "commercial computer software" pursuant to the applicable Federal
Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication,
disclosure, modification, and adaptation of the programs, including any operating system, integrated
software, any programs installed on the hardware, and/or documentation, shall be subject to license
terms and license restrictions applicable to the programs. No other rights are granted to the U.S.
Government.
This software or hardware is developed for general use in a variety of information management
applications. It is not developed or intended for use in any inherently dangerous applications, including
applications that may create a risk of personal injury. If you use this software or hardware in dangerous
applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and
other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any
damages caused by use of this software or hardware in dangerous applications.
Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be
trademarks of their respective owners.
Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC
trademarks are used under license and are trademarks or registered trademarks of SPARC
International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or
registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.
This software or hardware and documentation may provide access to or information about content,
products, and services from third parties. Oracle Corporation and its affiliates are not responsible
for and expressly disclaim all warranties of any kind with respect to third-party content, products,
and services unless otherwise set forth in an applicable agreement between you and Oracle. Oracle
Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to
your access to or use of third-party content, products, or services, except as set forth in an applicable
agreement between you and Oracle.
Documentation Accessibility
For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program
website at
http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.
Access to Oracle Support
Oracle customers that have purchased support have access to electronic support through My Oracle
Support. For information, visit
http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info or visit http://www.oracle.com/pls/topic/lookup?
ctx=acc&id=trs if you are hearing impaired.
This documentation is NOT distributed under a GPL license. Use of this documentation is subject to the
following terms:
You may create a printed copy of this documentation solely for your own personal use. Conversion
to other formats is allowed as long as the actual content is not altered or edited in any way. You shall
not publish or distribute this documentation in any form or on any media, except if you distribute the
documentation in a manner similar to how Oracle disseminates it (that is, electronically for download
on a Web site with the software) or on a CD-ROM or similar medium, provided however that the
documentation is disseminated together with the software on the same medium. Any other use, such
as any dissemination of printed copies or use of this documentation, in whole or in part, in another
publication, requires the prior written consent from an authorized representative of Oracle. Oracle and/
or its affiliates reserve any and all rights to this documentation not expressly granted above.
2 Introduction
The Sakila sample database was initially developed by Mike Hillyer, a former member of the MySQL
AB documentation team, and is intended to provide a standard schema that can be used for examples
in books, tutorials, articles, samples, and so forth. Sakila sample database also serves to highlight the
latest features of MySQL such as Views, Stored Procedures, and Triggers.
Additional information on the Sakila sample database and its usage can be found through the MySQL
forums.
The Sakila sample database is the result of support and feedback from the MySQL user community
and feedback and user input is always appreciated. Please direct all feedback using the http://
www.mysql.com/company/contact/. For bug reports, use MySQL Bugs.
3 History
The Sakila sample database was designed as a replacement to the world sample database, also
provided by Oracle.
The world sample database provides a set of tables containing information on the countries and cities
of the world and is useful for basic queries, but lacks structures for testing MySQL-specific functionality
and new features found in MySQL 5.
Development of the Sakila sample database began in early 2005. Early designs were based on the
database used in the Dell whitepaper Three Approaches to MySQL Applications on Dell PowerEdge
Servers.
Where Dell's sample database was designed to represent an online DVD store, the Sakila sample
database is designed to represent a DVD rental store. The Sakila sample database still borrows film
and actor names from the Dell sample database.
Development was accomplished using MySQL Query Browser for schema design, with the tables being
populated by a combination of MySQL Query Browser and custom scripts, in addition to contributor
efforts (see Section 7, Acknowledgments).
After the basic schema was completed, various views, stored routines, and triggers were added to the
schema; then the sample data was populated. After a series of review versions, the first official version
of the Sakila sample database was released in March 2006.
4 Installation
The Sakila sample database is available from http://dev.mysql.com/doc/index-other.html. A
downloadable archive is available in compressed tar file or Zip format. The archive contains three
files: sakila-schema.sql, sakila-data.sql, and sakila.mwb.
Note
Sakila contains MySQL version specific comments, in that the sakila schema
and data depends on the version of your MySQL server. For example, MySQL
server 5.7.5 added spatial data, so the address table will include a spatialaware location column on MySQL server 5.7.5 and above.
The sakila-schema.sql file contains all the CREATE statements required to create the structure of
the Sakila database including tables, views, stored procedures, and triggers.
The sakila-data.sql file contains the INSERT statements required to populate the structure
created by the sakila-schema.sql file, along with definitions for triggers that must be created after
the initial data load.
The sakila.mwb file is a MySQL Workbench data model that you can open within MySQL Workbench
to examine the database structure. For more information, see MySQL Workbench.
To install the Sakila sample database, follow these steps:
1. Extract the installation archive to a temporary location such as C:\temp\ or /tmp/. When
you unpack the archive, it creates a directory named sakila-db that contains the sakilaschema.sql and sakila-data.sql files.
2. Connect to the MySQL server using the mysql command-line client with the following command:
shell> mysql -u root -p
Enter your password when prompted. A non-root account can be used as long as the account has
privileges to create new databases.
3. Execute the sakila-schema.sql script to create the database structure by using the following
command:
mysql> SOURCE C:/temp/sakila-db/sakila-schema.sql;
Replace C:/temp/sakila-db with the path to the sakila-schema.sql file on your system.
Note
On Windows, use slashes, rather than backslashes, when executing the
SOURCE command.
4. Execute the sakila-data.sql script to populate the database structure with the following
command:
mysql> SOURCE C:/temp/sakila-db/sakila-data.sql;
Replace C:/temp/sakila-db with the path to the sakila-data.sql file on your system.
5. Confirm that the sample database is installed correctly. Execute the following statements. You
should see output similar to that shown here.
mysql> USE sakila;
Database changed
mysql> SHOW TABLES;
+----------------------------+
| Tables_in_sakila
|
+----------------------------+
| actor
|
| address
|
| category
|
| city
|
| country
|
| customer
|
| customer_list
|
| film
|
| film_actor
|
| film_category
|
| film_list
|
| film_text
|
| inventory
|
| language
|
| nicer_but_slower_film_list |
| payment
|
| rental
|
| sales_by_film_category
|
| sales_by_store
|
| staff
|
| staff_list
|
| store
|
+----------------------------+
22 rows in set (0.00 sec)
mysql> SELECT COUNT(*) FROM film;
+----------+
| COUNT(*) |
+----------+
| 1000
|
+----------+
1 row in set (0.02 sec)
mysql> SELECT COUNT(*) FROM film_text;
+----------+
| COUNT(*) |
+----------+
| 1000
|
+----------+
1 row in set (0.00 sec)
5 Structure
The following diagram provides an overview of the structure of the Sakila sample database. The
diagram source file (for use with MySQL Workbench) is included in the Sakila distribution and is named
sakila.mwb.
5.1 Tables
The following sections describe the tables that make up the Sakila sample database, in alphabetic
order.
Columns
actor_id: A surrogate primary key used to uniquely identify each actor in the table.
first_name: The actor's first name.
last_name: The actor's last name.
last_update: The time that the row was created or most recently updated.
Columns
address_id: A surrogate primary key used to uniquely identify each address in the table.
address: The first line of an address.
address2: An optional second line of an address.
district: The region of an address, this may be a state, province, prefecture, etc.
city_id: A foreign key pointing to the city table.
postal_code: The postal code or ZIP code of the address (where applicable).
phone: The telephone number for the address.
last_update: The time that the row was created or most recently updated.
location: A Geometry column with a spatial index on it.
Note
The spatial location column is supported as of MySQL 5.7.5. This column is
only added when executing the sakila SQL files against MySQL server 5.7.5
and above. Additionally, "SPATIAL KEY idx_location" is also added.
Columns
category_id: A surrogate primary key used to uniquely identify each category in the table.
Columns
city_id: A surrogate primary key used to uniquely identify each city in the table.
city: The name of the city.
country_id: A foreign key identifying the country that the city belongs to.
last_update: The time that the row was created or most recently updated.
Columns
country_id: A surrogate primary key used to uniquely identify each country in the table.
country: The name of the country.
last_update: The time that the row was created or most recently updated.
Columns
customer_id: A surrogate primary key used to uniquely identify each customer in the table.
store_id: A foreign key identifying the customer's home store. Customers are not limited to
renting only from this store, but this is the store they generally shop at.
first_name: The customer's first name.
last_name: The customer's last name.
email: The customer's email address.
address_id: A foreign key identifying the customer's address in the address table.
active: Indicates whether the customer is an active customer. Setting this to FALSE serves as an
alternative to deleting a customer outright. Most queries should have a WHERE active = TRUE
clause.
create_date: The date the customer was added to the system. This date is automatically set using
a trigger during an INSERT.
last_update: The time that the row was created or most recently updated.
Columns
film_id: A surrogate primary key used to uniquely identify each film in the table.
title: The title of the film.
description: A short description or plot summary of the film.
release_year: The year in which the movie was released.
language_id: A foreign key pointing at the language table; identifies the language of the film.
original_language_id: A foreign key pointing at the language table; identifies the original
language of the film. Used when a film has been dubbed into a new language.
rental_duration: The length of the rental period, in days.
rental_rate: The cost to rent the film for the period specified in the rental_duration column.
length: The duration of the film, in minutes.
replacement_cost: The amount charged to the customer if the film is not returned or is returned in
a damaged state.
rating: The rating assigned to the film. Can be one of: G, PG, PG-13, R, or NC-17.
special_features: Lists which common special features are included on the DVD. Can be zero
or more of: Trailers, Commentaries, Deleted Scenes, Behind the Scenes.
last_update: The time that the row was created or most recently updated.
Columns:
actor_id: A foreign key identifying the actor.
film_id: A foreign key identifying the film.
last_update: The time that the row was created or most recently updated.
Columns:
film_id: A foreign key identifying the film.
category_id: A foreign key identifying the category.
last_update: The time that the row was created or most recently updated.
Columns
film_id: A surrogate primary key used to uniquely identify each film in the table.
title: The title of the film.
description: A short description or plot summary of the film.
The contents of the film_text table should never be modified directly. All changes should be made
to the film table instead.
Columns
inventory_id: A surrogate primary key used to uniquely identify each item in inventory.
film_id: A foreign key pointing to the film this item represents.
store_id: A foreign key pointing to the store stocking this item.
last_update: The time that the row was created or most recently updated.
Columns
language_id: A surrogate primary key used to uniquely identify each language.
name: The English name of the language.
last_update: The time that the row was created or most recently updated.
10
Columns
payment_id: A surrogate primary key used to uniquely identify each payment.
customer_id: The customer whose balance the payment is being applied to. This is a foreign key
reference to the customer table.
staff_id: The staff member who processed the payment. This is a foreign key reference to the
staff table.
rental_id: The rental that the payment is being applied to. This is optional because some
payments are for outstanding fees and may not be directly related to a rental.
amount: The amount of the payment.
payment_date: The date the payment was processed.
last_update: The time that the row was created or most recently updated.
Columns
rental_id: A surrogate primary key that uniquely identifies the rental.
rental_date: The date and time that the item was rented.
inventory_id: The item being rented.
customer_id: The customer renting the item.
return_date: The date and time the item was returned.
staff_id: The staff member who processed the rental.
last_update: The time that the row was created or most recently updated.
Columns
staff_id: A surrogate primary key that uniquely identifies the staff member.
11
Columns
store_id: A surrogate primary key that uniquely identifies the store.
manager_staff_id: A foreign key identifying the manager of this store.
address_id: A foreign key identifying the address of this store.
last_update: The time that the row was created or most recently updated.
5.2 Views
The following sections describe the views that are included with the Sakila sample database, in
alphabetic order.
12
13
Parameters
p_film_id: The ID of the film to be checked, from the film_id column of the film table.
p_store_id: The ID of the store to check for, from the store_id column of the store table.
p_film_count: An OUT parameter that returns a count of the copies of the film in stock.
Return Values
This procedure produces a table of inventory ID numbers for the copies of the film in stock, and returns
(in the p_film_count parameter) a count that indicates the number of rows in that table.
Sample Usage
mysql> CALL film_in_stock(1,1,@count);
+--------------+
| inventory_id |
+--------------+
| 1
|
| 2
|
| 3
|
| 4
|
+--------------+
4 rows in set (0.06 sec)
Query OK, 0 rows affected (0.06 sec)
mysql> SELECT @count;
+--------+
| @count |
+--------+
| 4
|
+--------+
1 row in set (0.00 sec)
Parameters
p_film_id: The ID of the film to be checked, from the film_id column of the film table.
p_store_id: The ID of the store to check for, from the store_id column of the store table.
p_film_count: An OUT parameter that returns a count of the copies of the film not in stock.
Return Values
This procedure produces a table of inventory ID numbers for the copies of the film not in stock, and
returns (in the p_film_count parameter) a count that indicates the number of rows in that table.
Sample Usage
mysql> CALL film_not_in_stock(2,2,@count);
+--------------+
| inventory_id |
+--------------+
| 9
|
+--------------+
14
Parameters
min_monthly_purchases: The minimum number of purchases or rentals a customer needed to
make in the last month to qualify.
min_dollar_amount_purchased: The minimum dollar amount a customer needed to spend in
the last month to qualify.
count_rewardees: An OUT parameter that returns a count of the customers who met the
qualifications specified.
Return Values
This function returns a table of customers who met the qualifications specified. The table has the same
structure as the customer table. The procedure also returns (in the count_rewardees parameter) a
count that indicates the number of rows in that table.
Sample Usage
mysql> CALL rewards_report(7,20.00,@count);
...
| 598
| 599
...
| 1
| 2
| WADE
| AUSTIN
| DELVALLE
| CINTRON
| WADE.DELVALLE@sakilacustomer.org
| AUSTIN.CINTRON@sakilacustomer.org
15
| 604
| 605
Parameters
p_customer_id: The ID of the customer to check, from the customer_id column of the
customer table.
p_effective_date: The cutoff date for items that will be applied to the balance. Any rentals,
payments, and so forth after this date are not counted.
Return Values
This function returns the amount owing on the customer's account.
Sample Usage
mysql> SELECT get_customer_balance(298,NOW());
+---------------------------------+
| get_customer_balance(298,NOW()) |
+---------------------------------+
| 22.00
|
+---------------------------------+
1 row in set (0.00 sec)
Parameters
p_inventory_id: The ID of the inventory item to be checked.
Return Values
This function returns the customer_id of the customer who is currently renting the item, or NULL if
the item is in stock.
Sample Usage
mysql> SELECT inventory_held_by_customer(8);
+-------------------------------+
| inventory_held_by_customer(8) |
+-------------------------------+
| NULL
|
+-------------------------------+
1 row in set (0.14 sec)
mysql> SELECT inventory_held_by_customer(9);
+-------------------------------+
| inventory_held_by_customer(9) |
+-------------------------------+
| 366
|
+-------------------------------+
1 row in set (0.00 sec)
Parameters
p_inventory_id: The ID of the inventory item to be checked.
16
Return Values
This function returns TRUE or FALSE to indicate whether the item specified is in stock.
Sample Usage
mysql> SELECT inventory_in_stock(9);
+-----------------------+
| inventory_in_stock(9) |
+-----------------------+
| 0
|
+-----------------------+
1 row in set (0.03 sec)
mysql> SELECT inventory_in_stock(8);
+-----------------------+
| inventory_in_stock(8) |
+-----------------------+
| 1
|
+-----------------------+
1 row in set (0.00 sec)
5.5 Triggers
The following sections describe the triggers in the Sakila sample database.
6 Usage Examples
These are a few usage examples of how to perform common operations using the Sakila sample
database. While these operations are good candidates for stored procedures and views, such
implementation is intentionally left as an exercise to the user.
Rent a DVD
To rent a DVD, first confirm that the given inventory item is in stock, and then insert a row into the
rental table. After the rental table is created, insert a row into the payment table. Depending on
17
business rules, you may also need to check whether the customer has an outstanding balance before
processing the rental.
mysql> SELECT INVENTORY_IN_STOCK(10);
+------------------------+
| INVENTORY_IN_STOCK(10) |
+------------------------+
| 1
|
+------------------------+
1 row in set (0.00 sec)
mysql> INSERT INTO rental(rental_date, inventory_id, customer_id, staff_id)
-> VALUES(NOW(), 10, 3, 1);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT @balance := get_customer_balance(3, NOW());
+--------------------------------------------+
| @balance := get_customer_balance(3, NOW()) |
+--------------------------------------------+
| 4.99
|
+--------------------------------------------+
1 row in set (0.01 sec)
mysql> INSERT INTO payment (customer_id, staff_id, rental_id, amount,
-> VALUES(3,1,LAST_INSERT_ID(), @balance, NOW());
Query OK, 1 row affected (0.00 sec)
payment_date)
Return a DVD
To return a DVD, update the rental table and set the return date. To do this, first identify the
rental_id to update based on the inventory_id of the item being returned. Depending on the
situation, it may be necessary to check the customer balance and perhaps process a payment for
overdue fees by inserting a row into the payment table.
mysql> SELECT rental_id
-> FROM rental
-> WHERE inventory_id = 10
-> AND customer_id = 3
-> AND return_date IS NULL;
+-----------+
| rental_id |
+-----------+
| 16050
|
+-----------+
1 row in set (0.00 sec)
mysql> UPDATE rental
-> SET return_date = NOW()
-> WHERE rental_id = @rentID;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT get_customer_balance(3, NOW());
+--------------------------------+
| get_customer_balance(3, NOW()) |
+--------------------------------+
| 0.00
|
+--------------------------------+
1 row in set (0.09 sec)
18
is overdue and we should produce the name of the film along with the customer name and phone
number.
mysql> SELECT CONCAT(customer.last_name, ', ', customer.first_name) AS customer,
-> address.phone, film.title
-> FROM rental INNER JOIN customer ON rental.customer_id = customer.customer_id
-> INNER JOIN address ON customer.address_id = address.address_id
-> INNER JOIN inventory ON rental.inventory_id = inventory.inventory_id
-> INNER JOIN film ON inventory.film_id = film.film_id
-> WHERE rental.return_date IS NULL
-> AND rental_date + INTERVAL film.rental_duration DAY < CURRENT_DATE()
-> LIMIT 5;
+------------------+--------------+------------------+
| customer
| phone
| title
|
+------------------+--------------+------------------+
| OLVERA, DWAYNE
| 62127829280 | ACADEMY DINOSAUR |
| HUEY, BRANDON
| 99883471275 | ACE GOLDFINGER
|
| BROWN, ELIZABETH | 10655648674 | AFFAIR PREJUDICE |
| OWENS, CARMEN
| 272234298332 | AFFAIR PREJUDICE |
| HANNON, SETH
| 864392582257 | AFRICAN EGG
|
+------------------+--------------+------------------+
5 rows in set (0.02 sec)
7 Acknowledgments
The following individuals and organizations contributed to the initial development of the Sakila sample
database. This historical list is no longer updated.
Roland Bouman: provided valuable feedback throughout the development process, contributed
sample views and stored procedures.
Ronald Bradford: developed the first sample application for use with the Sakila sample database.
Dave Jaffe: provided schema used in Dell whitepaper and secured permission to use parts thereof
in the Sakila sample database.
Giuseppe Maxia: provided valuable feedback throughout the development process, populated
some of the sample data, provided some of the sample views and triggers.
For v1.0, he combined sakila and sakila-spatial by adding MySQL version specific comments within
the SQL files.
Jay Pipes: provided some of the sample stored procedures.
Zak Greant: provided advice and feedback on licensing.
In addition to the individuals mentioned above, various other individuals at MySQL and in the MySQL
community have provided feedback during the course of development.
19
20
21
customer table has a new ON INSERT trigger that enforces create_date column being set to
NOW().
film_id is now SMALLINT.
film.description now has DEFAULT NULL.
film.release_year added with type YEAR.
film.language_id and film.original_language_id added along with language table. For
foreign films that may have been subtitled. original_language_id can be NULL, language_id
is NOT NULL.
film.length is now SMALLINT.
film.category_id column removed.
New table: film_category; allows for multiple categories per film.
film_text.category_id column removed.
inventory_id is now MEDIUMINT.
payment_id is now SMALLINT.
payment.payment_date is now DATETIME.
Trigger added to payment table to enforce that payment_date is set to NOW() upon INSERT.
rental.rent_date is now rental.rental_date and is now DATETIME.
Trigger added to rental table to enforce that rental_date is set to NOW() upon INSERT.
staff_id is now TINYINT.
staff.email added (VARCHAR(50)).
staff.username added (VARCHAR(16)).
store_id is now TINYINT.
film_list view updated to handle new film_category table.
nicer_but_slower_film_list view updated to handle new film_category table.
22