1
-- Sakila Sample Database Schema
4
-- Copyright (c) 2006, MySQL AB
5
-- All rights reserved.
7
-- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
9
-- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
10
-- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
11
-- * Neither the name of MySQL AB nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
13
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
17
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
18
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
20
DROP SCHEMA IF EXISTS sakila;
25
-- Table structure for table `actor`
29
actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
30
first_name VARCHAR(45) NOT NULL,
31
last_name VARCHAR(45) NOT NULL,
32
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
33
PRIMARY KEY (actor_id),
34
KEY idx_actor_last_name (last_name)
35
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
38
-- Table structure for table `address`
41
CREATE TABLE address (
42
address_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
43
address VARCHAR(50) NOT NULL,
44
address2 VARCHAR(50) DEFAULT NULL,
45
district VARCHAR(20) NOT NULL,
46
city_id SMALLINT UNSIGNED NOT NULL,
47
postal_code VARCHAR(10) DEFAULT NULL,
48
phone VARCHAR(20) NOT NULL,
49
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
50
PRIMARY KEY (address_id),
51
KEY idx_fk_city_id (city_id),
52
CONSTRAINT `fk_address_city` FOREIGN KEY (city_id) REFERENCES city (city_id) ON DELETE RESTRICT ON UPDATE CASCADE
53
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
56
-- Table structure for table `category`
59
CREATE TABLE category (
60
category_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
61
name VARCHAR(25) NOT NULL,
62
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
63
PRIMARY KEY (category_id)
64
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
67
-- Table structure for table `city`
71
city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
72
city VARCHAR(50) NOT NULL,
73
country_id SMALLINT UNSIGNED NOT NULL,
74
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
75
PRIMARY KEY (city_id),
76
KEY idx_fk_country_id (country_id),
77
CONSTRAINT `fk_city_country` FOREIGN KEY (country_id) REFERENCES country (country_id) ON DELETE RESTRICT ON UPDATE CASCADE
78
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
81
-- Table structure for table `country`
84
CREATE TABLE country (
85
country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
86
country VARCHAR(50) NOT NULL,
87
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
88
PRIMARY KEY (country_id)
89
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
92
-- Table structure for table `customer`
95
CREATE TABLE customer (
96
customer_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
97
store_id TINYINT UNSIGNED NOT NULL,
98
first_name VARCHAR(45) NOT NULL,
99
last_name VARCHAR(45) NOT NULL,
100
email VARCHAR(50) DEFAULT NULL,
101
address_id SMALLINT UNSIGNED NOT NULL,
102
active BOOLEAN NOT NULL DEFAULT TRUE,
103
create_date DATETIME NOT NULL,
104
last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
105
PRIMARY KEY (customer_id),
106
KEY idx_fk_store_id (store_id),
107
KEY idx_fk_address_id (address_id),
108
KEY idx_last_name (last_name),
109
CONSTRAINT fk_customer_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE,
110
CONSTRAINT fk_customer_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE
111
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
114
-- Table structure for table `film`
118
film_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
119
title VARCHAR(255) NOT NULL,
120
description TEXT DEFAULT NULL,
121
release_year YEAR DEFAULT NULL,
122
language_id TINYINT UNSIGNED NOT NULL,
123
original_language_id TINYINT UNSIGNED DEFAULT NULL,
124
rental_duration TINYINT UNSIGNED NOT NULL DEFAULT 3,
125
rental_rate DECIMAL(4,2) NOT NULL DEFAULT 4.99,
126
length SMALLINT UNSIGNED DEFAULT NULL,
127
replacement_cost DECIMAL(5,2) NOT NULL DEFAULT 19.99,
128
rating ENUM('G','PG','PG-13','R','NC-17') DEFAULT 'G',
129
special_features SET('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL,
130
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
131
PRIMARY KEY (film_id),
132
KEY idx_title (title),
133
KEY idx_fk_language_id (language_id),
134
KEY idx_fk_original_language_id (original_language_id),
135
CONSTRAINT fk_film_language FOREIGN KEY (language_id) REFERENCES language (language_id) ON DELETE RESTRICT ON UPDATE CASCADE,
136
CONSTRAINT fk_film_language_original FOREIGN KEY (original_language_id) REFERENCES language (language_id) ON DELETE RESTRICT ON UPDATE CASCADE
137
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
140
-- Table structure for table `film_actor`
143
CREATE TABLE film_actor (
144
actor_id SMALLINT UNSIGNED NOT NULL,
145
film_id SMALLINT UNSIGNED NOT NULL,
146
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
147
PRIMARY KEY (actor_id,film_id),
148
KEY idx_fk_film_id (`film_id`),
149
CONSTRAINT fk_film_actor_actor FOREIGN KEY (actor_id) REFERENCES actor (actor_id) ON DELETE RESTRICT ON UPDATE CASCADE,
150
CONSTRAINT fk_film_actor_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE
151
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
154
-- Table structure for table `film_category`
157
CREATE TABLE film_category (
158
film_id SMALLINT UNSIGNED NOT NULL,
159
category_id TINYINT UNSIGNED NOT NULL,
160
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
161
PRIMARY KEY (film_id, category_id),
162
CONSTRAINT fk_film_category_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE,
163
CONSTRAINT fk_film_category_category FOREIGN KEY (category_id) REFERENCES category (category_id) ON DELETE RESTRICT ON UPDATE CASCADE
164
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
167
-- Table structure for table `film_text`
170
CREATE TABLE film_text (
171
film_id SMALLINT NOT NULL,
172
title VARCHAR(255) NOT NULL,
174
PRIMARY KEY (film_id),
175
FULLTEXT KEY idx_title_description (title,description)
176
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
179
-- Triggers for loading film_text from film
183
CREATE TRIGGER `ins_film` AFTER INSERT ON `film` FOR EACH ROW BEGIN
184
INSERT INTO film_text (film_id, title, description)
185
VALUES (new.film_id, new.title, new.description);
189
CREATE TRIGGER `upd_film` AFTER UPDATE ON `film` FOR EACH ROW BEGIN
190
IF (old.title != new.title) or (old.description != new.description)
194
description=new.description,
196
WHERE film_id=old.film_id;
201
CREATE TRIGGER `del_film` AFTER DELETE ON `film` FOR EACH ROW BEGIN
202
DELETE FROM film_text WHERE film_id = old.film_id;
208
-- Table structure for table `inventory`
211
CREATE TABLE inventory (
212
inventory_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
213
film_id SMALLINT UNSIGNED NOT NULL,
214
store_id TINYINT UNSIGNED NOT NULL,
215
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
216
PRIMARY KEY (inventory_id),
217
KEY idx_fk_film_id (film_id),
218
KEY idx_store_id_film_id (store_id,film_id),
219
CONSTRAINT fk_inventory_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE,
220
CONSTRAINT fk_inventory_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE
221
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
224
-- Table structure for table `language`
227
CREATE TABLE language (
228
language_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
229
name CHAR(20) NOT NULL,
230
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
231
PRIMARY KEY (language_id)
232
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
235
-- Table structure for table `payment`
238
CREATE TABLE payment (
239
payment_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
240
customer_id SMALLINT UNSIGNED NOT NULL,
241
staff_id TINYINT UNSIGNED NOT NULL,
242
rental_id INT DEFAULT NULL,
243
amount DECIMAL(5,2) NOT NULL,
244
payment_date DATETIME NOT NULL,
245
last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
246
PRIMARY KEY (payment_id),
247
KEY idx_fk_staff_id (staff_id),
248
KEY idx_fk_customer_id (customer_id),
249
CONSTRAINT fk_payment_rental FOREIGN KEY (rental_id) REFERENCES rental (rental_id) ON DELETE SET NULL ON UPDATE CASCADE,
250
CONSTRAINT fk_payment_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) ON DELETE RESTRICT ON UPDATE CASCADE,
251
CONSTRAINT fk_payment_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE
252
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
256
-- Table structure for table `rental`
259
CREATE TABLE rental (
260
rental_id INT NOT NULL AUTO_INCREMENT,
261
rental_date DATETIME NOT NULL,
262
inventory_id MEDIUMINT UNSIGNED NOT NULL,
263
customer_id SMALLINT UNSIGNED NOT NULL,
264
return_date DATETIME DEFAULT NULL,
265
staff_id TINYINT UNSIGNED NOT NULL,
266
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
267
PRIMARY KEY (rental_id),
268
UNIQUE KEY (rental_date,inventory_id,customer_id),
269
KEY idx_fk_inventory_id (inventory_id),
270
KEY idx_fk_customer_id (customer_id),
271
KEY idx_fk_staff_id (staff_id),
272
CONSTRAINT fk_rental_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE,
273
CONSTRAINT fk_rental_inventory FOREIGN KEY (inventory_id) REFERENCES inventory (inventory_id) ON DELETE RESTRICT ON UPDATE CASCADE,
274
CONSTRAINT fk_rental_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) ON DELETE RESTRICT ON UPDATE CASCADE
275
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
278
-- Table structure for table `staff`
282
staff_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
283
first_name VARCHAR(45) NOT NULL,
284
last_name VARCHAR(45) NOT NULL,
285
address_id SMALLINT UNSIGNED NOT NULL,
286
picture BLOB DEFAULT NULL,
287
email VARCHAR(50) DEFAULT NULL,
288
store_id TINYINT UNSIGNED NOT NULL,
289
active BOOLEAN NOT NULL DEFAULT TRUE,
290
username VARCHAR(16) NOT NULL,
291
password VARCHAR(40) BINARY DEFAULT NULL,
292
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
293
PRIMARY KEY (staff_id),
294
KEY idx_fk_store_id (store_id),
295
KEY idx_fk_address_id (address_id),
296
CONSTRAINT fk_staff_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE,
297
CONSTRAINT fk_staff_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE
298
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
301
-- Table structure for table `store`
305
store_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
306
manager_staff_id TINYINT UNSIGNED NOT NULL,
307
address_id SMALLINT UNSIGNED NOT NULL,
308
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
309
PRIMARY KEY (store_id),
310
UNIQUE KEY idx_unique_manager (manager_staff_id),
311
KEY idx_fk_address_id (address_id),
312
CONSTRAINT fk_store_staff FOREIGN KEY (manager_staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE,
313
CONSTRAINT fk_store_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE
314
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
317
-- View structure for view `customer_list`
320
CREATE VIEW customer_list
322
SELECT cu.customer_id AS ID, CONCAT(cu.first_name, _utf8' ', cu.last_name) AS name, a.address AS address, a.postal_code AS `zip code`,
323
a.phone AS phone, city.city AS city, country.country AS country, IF(cu.active, _utf8'active',_utf8'') AS notes, cu.store_id AS SID
324
FROM customer AS cu JOIN address AS a ON cu.address_id = a.address_id JOIN city ON a.city_id = city.city_id
325
JOIN country ON city.country_id = country.country_id;
328
-- View structure for view `film_list`
331
CREATE VIEW film_list
333
SELECT film.film_id AS FID, film.title AS title, film.description AS description, category.name AS category, film.rental_rate AS price,
334
film.length AS length, film.rating AS rating, GROUP_CONCAT(CONCAT(actor.first_name, _utf8' ', actor.last_name) SEPARATOR ', ') AS actors
335
FROM category LEFT JOIN film_category ON category.category_id = film_category.category_id LEFT JOIN film ON film_category.film_id = film.film_id
336
JOIN film_actor ON film.film_id = film_actor.film_id
337
JOIN actor ON film_actor.actor_id = actor.actor_id
338
GROUP BY film.film_id;
341
-- View structure for view `nicer_but_slower_film_list`
344
CREATE VIEW nicer_but_slower_film_list
346
SELECT film.film_id AS FID, film.title AS title, film.description AS description, category.name AS category, film.rental_rate AS price,
347
film.length AS length, film.rating AS rating, GROUP_CONCAT(CONCAT(CONCAT(UCASE(SUBSTR(actor.first_name,1,1)),
348
LCASE(SUBSTR(actor.first_name,2,LENGTH(actor.first_name))),_utf8' ',CONCAT(UCASE(SUBSTR(actor.last_name,1,1)),
349
LCASE(SUBSTR(actor.last_name,2,LENGTH(actor.last_name)))))) SEPARATOR ', ') AS actors
350
FROM category LEFT JOIN film_category ON category.category_id = film_category.category_id LEFT JOIN film ON film_category.film_id = film.film_id
351
JOIN film_actor ON film.film_id = film_actor.film_id
352
JOIN actor ON film_actor.actor_id = actor.actor_id
353
GROUP BY film.film_id;
356
-- View structure for view `staff_list`
359
CREATE VIEW staff_list
361
SELECT s.staff_id AS ID, CONCAT(s.first_name, _utf8' ', s.last_name) AS name, a.address AS address, a.postal_code AS `zip code`, a.phone AS phone,
362
city.city AS city, country.country AS country, s.store_id AS SID
363
FROM staff AS s JOIN address AS a ON s.address_id = a.address_id JOIN city ON a.city_id = city.city_id
364
JOIN country ON city.country_id = country.country_id;
367
-- View structure for view `sales_by_store`
370
CREATE VIEW sales_by_store
373
CONCAT(c.city, _utf8',', cy.country) AS store
374
, CONCAT(m.first_name, _utf8' ', m.last_name) AS manager
375
, SUM(p.amount) AS total_sales
377
INNER JOIN rental AS r ON p.rental_id = r.rental_id
378
INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id
379
INNER JOIN store AS s ON i.store_id = s.store_id
380
INNER JOIN address AS a ON s.address_id = a.address_id
381
INNER JOIN city AS c ON a.city_id = c.city_id
382
INNER JOIN country AS cy ON c.country_id = cy.country_id
383
INNER JOIN staff AS m ON s.manager_staff_id = m.staff_id
385
ORDER BY cy.country, c.city;
388
-- View structure for view `sales_by_film_category`
390
-- Note that total sales will add up to >100% because
391
-- some titles belong to more than 1 category
394
CREATE VIEW sales_by_film_category
398
, SUM(p.amount) AS total_sales
400
INNER JOIN rental AS r ON p.rental_id = r.rental_id
401
INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id
402
INNER JOIN film AS f ON i.film_id = f.film_id
403
INNER JOIN film_category AS fc ON f.film_id = fc.film_id
404
INNER JOIN category AS c ON fc.category_id = c.category_id
406
ORDER BY total_sales DESC;
409
-- View structure for view `actor_info`
412
CREATE DEFINER=CURRENT_USER SQL SECURITY INVOKER VIEW actor_info
418
GROUP_CONCAT(DISTINCT CONCAT(c.name, ': ',
419
(SELECT GROUP_CONCAT(f.title ORDER BY f.title SEPARATOR ', ')
421
INNER JOIN sakila.film_category fc
422
ON f.film_id = fc.film_id
423
INNER JOIN sakila.film_actor fa
424
ON f.film_id = fa.film_id
425
WHERE fc.category_id = c.category_id
426
AND fa.actor_id = a.actor_id
429
ORDER BY c.name SEPARATOR '; ')
432
LEFT JOIN sakila.film_actor fa
433
ON a.actor_id = fa.actor_id
434
LEFT JOIN sakila.film_category fc
435
ON fa.film_id = fc.film_id
436
LEFT JOIN sakila.category c
437
ON fc.category_id = c.category_id
438
GROUP BY a.actor_id, a.first_name, a.last_name;
441
-- Procedure structure for procedure `rewards_report`
446
CREATE PROCEDURE rewards_report (
447
IN min_monthly_purchases TINYINT UNSIGNED
448
, IN min_dollar_amount_purchased DECIMAL(10,2) UNSIGNED
449
, OUT count_rewardees INT
455
COMMENT 'Provides a customizable report on best customers'
458
DECLARE last_month_start DATE;
459
DECLARE last_month_end DATE;
461
/* Some sanity checks... */
462
IF min_monthly_purchases = 0 THEN
463
SELECT 'Minimum monthly purchases parameter must be > 0';
466
IF min_dollar_amount_purchased = 0.00 THEN
467
SELECT 'Minimum monthly dollar amount purchased parameter must be > $0.00';
471
/* Determine start and end time periods */
472
SET last_month_start = DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH);
473
SET last_month_start = STR_TO_DATE(CONCAT(YEAR(last_month_start),'-',MONTH(last_month_start),'-01'),'%Y-%m-%d');
474
SET last_month_end = LAST_DAY(last_month_start);
477
Create a temporary storage area for
480
CREATE TEMPORARY TABLE tmpCustomer (customer_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY);
483
Find all customers meeting the
484
monthly purchase requirements
486
INSERT INTO tmpCustomer (customer_id)
489
WHERE DATE(p.payment_date) BETWEEN last_month_start AND last_month_end
491
HAVING SUM(p.amount) > min_dollar_amount_purchased
492
AND COUNT(customer_id) > min_monthly_purchases;
494
/* Populate OUT parameter with count of found customers */
495
SELECT COUNT(*) FROM tmpCustomer INTO count_rewardees;
498
Output ALL customer information of matching rewardees.
499
Customize output as needed.
502
FROM tmpCustomer AS t
503
INNER JOIN customer AS c ON t.customer_id = c.customer_id;
506
DROP TABLE tmpCustomer;
513
CREATE FUNCTION get_customer_balance(p_customer_id INT, p_effective_date DATETIME) RETURNS DECIMAL(5,2)
518
#OK, WE NEED TO CALCULATE THE CURRENT BALANCE GIVEN A CUSTOMER_ID AND A DATE
519
#THAT WE WANT THE BALANCE TO BE EFFECTIVE FOR. THE BALANCE IS:
520
# 1) RENTAL FEES FOR ALL PREVIOUS RENTALS
521
# 2) ONE DOLLAR FOR EVERY DAY THE PREVIOUS RENTALS ARE OVERDUE
522
# 3) IF A FILM IS MORE THAN RENTAL_DURATION * 2 OVERDUE, CHARGE THE REPLACEMENT_COST
523
# 4) SUBTRACT ALL PAYMENTS MADE BEFORE THE DATE SPECIFIED
525
DECLARE v_rentfees DECIMAL(5,2); #FEES PAID TO RENT THE VIDEOS INITIALLY
526
DECLARE v_overfees INTEGER; #LATE FEES FOR PRIOR RENTALS
527
DECLARE v_payments DECIMAL(5,2); #SUM OF PAYMENTS MADE PREVIOUSLY
529
SELECT IFNULL(SUM(film.rental_rate),0) INTO v_rentfees
530
FROM film, inventory, rental
531
WHERE film.film_id = inventory.film_id
532
AND inventory.inventory_id = rental.inventory_id
533
AND rental.rental_date <= p_effective_date
534
AND rental.customer_id = p_customer_id;
536
SELECT IFNULL(SUM(IF((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) > film.rental_duration,
537
((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) - film.rental_duration),0)),0) INTO v_overfees
538
FROM rental, inventory, film
539
WHERE film.film_id = inventory.film_id
540
AND inventory.inventory_id = rental.inventory_id
541
AND rental.rental_date <= p_effective_date
542
AND rental.customer_id = p_customer_id;
545
SELECT IFNULL(SUM(payment.amount),0) INTO v_payments
548
WHERE payment.payment_date <= p_effective_date
549
AND payment.customer_id = p_customer_id;
551
RETURN v_rentfees + v_overfees - v_payments;
558
CREATE PROCEDURE film_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT)
563
WHERE film_id = p_film_id
564
AND store_id = p_store_id
565
AND inventory_in_stock(inventory_id);
567
SELECT FOUND_ROWS() INTO p_film_count;
574
CREATE PROCEDURE film_not_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT)
579
WHERE film_id = p_film_id
580
AND store_id = p_store_id
581
AND NOT inventory_in_stock(inventory_id);
583
SELECT FOUND_ROWS() INTO p_film_count;
590
CREATE FUNCTION inventory_held_by_customer(p_inventory_id INT) RETURNS INT
593
DECLARE v_customer_id INT;
594
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
596
SELECT customer_id INTO v_customer_id
598
WHERE return_date IS NULL
599
AND inventory_id = p_inventory_id;
601
RETURN v_customer_id;
608
CREATE FUNCTION inventory_in_stock(p_inventory_id INT) RETURNS BOOLEAN
611
DECLARE v_rentals INT;
614
#AN ITEM IS IN-STOCK IF THERE ARE EITHER NO ROWS IN THE rental TABLE
615
#FOR THE ITEM OR ALL ROWS HAVE return_date POPULATED
617
SELECT COUNT(*) INTO v_rentals
619
WHERE inventory_id = p_inventory_id;
621
IF v_rentals = 0 THEN
625
SELECT COUNT(rental_id) INTO v_out
626
FROM inventory LEFT JOIN rental USING(inventory_id)
627
WHERE inventory.inventory_id = p_inventory_id
628
AND rental.return_date IS NULL;
639
SET SQL_MODE=@OLD_SQL_MODE;
640
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
641
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;