~percona-dev/percona-xtrabackup/percona-xtrabackup-windows-vadim

« back to all changes in this revision

Viewing changes to test/inc/sakila-db/sakila-schema.sql

  • Committer: Aleksandr Kuzminsky
  • Date: 2010-06-02 13:05:00 UTC
  • mto: This revision was merged to the branch mainline in revision 138.
  • Revision ID: aleksandr.kuzminsky@percona.com-20100602130500-8f39yicogve1xamm
Added the XtraBackup test framework

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
-- Sakila Sample Database Schema
 
2
-- Version 0.8
 
3
 
 
4
-- Copyright (c) 2006, MySQL AB
 
5
-- All rights reserved.
 
6
 
 
7
-- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 
8
 
 
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.
 
12
 
 
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.
 
14
 
 
15
 
 
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';
 
19
 
 
20
DROP SCHEMA IF EXISTS sakila;
 
21
CREATE SCHEMA sakila;
 
22
USE sakila;
 
23
 
 
24
--
 
25
-- Table structure for table `actor`
 
26
--
 
27
 
 
28
CREATE 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;
 
36
 
 
37
--
 
38
-- Table structure for table `address`
 
39
--
 
40
 
 
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;
 
54
 
 
55
--
 
56
-- Table structure for table `category`
 
57
--
 
58
 
 
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;
 
65
 
 
66
--
 
67
-- Table structure for table `city`
 
68
--
 
69
 
 
70
CREATE 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;
 
79
 
 
80
--
 
81
-- Table structure for table `country`
 
82
--
 
83
 
 
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;
 
90
 
 
91
--
 
92
-- Table structure for table `customer`
 
93
--
 
94
 
 
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;
 
112
 
 
113
--
 
114
-- Table structure for table `film`
 
115
--
 
116
 
 
117
CREATE 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;
 
138
 
 
139
--
 
140
-- Table structure for table `film_actor`
 
141
--
 
142
 
 
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;
 
152
 
 
153
--
 
154
-- Table structure for table `film_category`
 
155
--
 
156
 
 
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;
 
165
 
 
166
--
 
167
-- Table structure for table `film_text`
 
168
--
 
169
 
 
170
CREATE TABLE film_text (
 
171
  film_id SMALLINT NOT NULL,
 
172
  title VARCHAR(255) NOT NULL,
 
173
  description TEXT,
 
174
  PRIMARY KEY  (film_id),
 
175
  FULLTEXT KEY idx_title_description (title,description)
 
176
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
177
 
 
178
--
 
179
-- Triggers for loading film_text from film
 
180
--
 
181
 
 
182
DELIMITER ;;
 
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);
 
186
  END;;
 
187
 
 
188
 
 
189
CREATE TRIGGER `upd_film` AFTER UPDATE ON `film` FOR EACH ROW BEGIN
 
190
    IF (old.title != new.title) or (old.description != new.description)
 
191
    THEN
 
192
        UPDATE film_text
 
193
            SET title=new.title,
 
194
                description=new.description,
 
195
                film_id=new.film_id
 
196
        WHERE film_id=old.film_id;
 
197
    END IF;
 
198
  END;;
 
199
 
 
200
 
 
201
CREATE TRIGGER `del_film` AFTER DELETE ON `film` FOR EACH ROW BEGIN
 
202
    DELETE FROM film_text WHERE film_id = old.film_id;
 
203
  END;;
 
204
 
 
205
DELIMITER ;
 
206
 
 
207
--
 
208
-- Table structure for table `inventory`
 
209
--
 
210
 
 
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;
 
222
 
 
223
--
 
224
-- Table structure for table `language`
 
225
--
 
226
 
 
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;
 
233
 
 
234
--
 
235
-- Table structure for table `payment`
 
236
--
 
237
 
 
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;
 
253
 
 
254
 
 
255
--
 
256
-- Table structure for table `rental`
 
257
--
 
258
 
 
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;
 
276
 
 
277
--
 
278
-- Table structure for table `staff`
 
279
--
 
280
 
 
281
CREATE 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;
 
299
 
 
300
--
 
301
-- Table structure for table `store`
 
302
--
 
303
 
 
304
CREATE 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;
 
315
 
 
316
--
 
317
-- View structure for view `customer_list`
 
318
--
 
319
 
 
320
CREATE VIEW customer_list
 
321
AS
 
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;
 
326
 
 
327
--
 
328
-- View structure for view `film_list`
 
329
--
 
330
 
 
331
CREATE VIEW film_list
 
332
AS
 
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;
 
339
 
 
340
--
 
341
-- View structure for view `nicer_but_slower_film_list`
 
342
--
 
343
 
 
344
CREATE VIEW nicer_but_slower_film_list
 
345
AS
 
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;
 
354
 
 
355
--
 
356
-- View structure for view `staff_list`
 
357
--
 
358
 
 
359
CREATE VIEW staff_list
 
360
AS
 
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;
 
365
 
 
366
--
 
367
-- View structure for view `sales_by_store`
 
368
--
 
369
 
 
370
CREATE VIEW sales_by_store
 
371
AS
 
372
SELECT
 
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
 
376
FROM payment AS p
 
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
 
384
GROUP BY s.store_id
 
385
ORDER BY cy.country, c.city;
 
386
 
 
387
--
 
388
-- View structure for view `sales_by_film_category`
 
389
--
 
390
-- Note that total sales will add up to >100% because
 
391
-- some titles belong to more than 1 category
 
392
--
 
393
 
 
394
CREATE VIEW sales_by_film_category
 
395
AS
 
396
SELECT
 
397
c.name AS category
 
398
, SUM(p.amount) AS total_sales
 
399
FROM payment AS p
 
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
 
405
GROUP BY c.name
 
406
ORDER BY total_sales DESC;
 
407
 
 
408
--
 
409
-- View structure for view `actor_info`
 
410
--
 
411
 
 
412
CREATE DEFINER=CURRENT_USER SQL SECURITY INVOKER VIEW actor_info
 
413
AS
 
414
SELECT
 
415
a.actor_id,
 
416
a.first_name,
 
417
a.last_name,
 
418
GROUP_CONCAT(DISTINCT CONCAT(c.name, ': ',
 
419
                (SELECT GROUP_CONCAT(f.title ORDER BY f.title SEPARATOR ', ')
 
420
                    FROM sakila.film f
 
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
 
427
                 )
 
428
             )
 
429
             ORDER BY c.name SEPARATOR '; ')
 
430
AS film_info
 
431
FROM sakila.actor a
 
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;
 
439
 
 
440
--
 
441
-- Procedure structure for procedure `rewards_report`
 
442
--
 
443
 
 
444
DELIMITER //
 
445
 
 
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
 
450
)
 
451
LANGUAGE SQL
 
452
NOT DETERMINISTIC
 
453
READS SQL DATA
 
454
SQL SECURITY DEFINER
 
455
COMMENT 'Provides a customizable report on best customers'
 
456
proc: BEGIN
 
457
 
 
458
    DECLARE last_month_start DATE;
 
459
    DECLARE last_month_end DATE;
 
460
 
 
461
    /* Some sanity checks... */
 
462
    IF min_monthly_purchases = 0 THEN
 
463
        SELECT 'Minimum monthly purchases parameter must be > 0';
 
464
        LEAVE proc;
 
465
    END IF;
 
466
    IF min_dollar_amount_purchased = 0.00 THEN
 
467
        SELECT 'Minimum monthly dollar amount purchased parameter must be > $0.00';
 
468
        LEAVE proc;
 
469
    END IF;
 
470
 
 
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);
 
475
 
 
476
    /*
 
477
        Create a temporary storage area for
 
478
        Customer IDs.
 
479
    */
 
480
    CREATE TEMPORARY TABLE tmpCustomer (customer_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY);
 
481
 
 
482
    /*
 
483
        Find all customers meeting the
 
484
        monthly purchase requirements
 
485
    */
 
486
    INSERT INTO tmpCustomer (customer_id)
 
487
    SELECT p.customer_id
 
488
    FROM payment AS p
 
489
    WHERE DATE(p.payment_date) BETWEEN last_month_start AND last_month_end
 
490
    GROUP BY customer_id
 
491
    HAVING SUM(p.amount) > min_dollar_amount_purchased
 
492
    AND COUNT(customer_id) > min_monthly_purchases;
 
493
 
 
494
    /* Populate OUT parameter with count of found customers */
 
495
    SELECT COUNT(*) FROM tmpCustomer INTO count_rewardees;
 
496
 
 
497
    /*
 
498
        Output ALL customer information of matching rewardees.
 
499
        Customize output as needed.
 
500
    */
 
501
    SELECT c.*
 
502
    FROM tmpCustomer AS t
 
503
    INNER JOIN customer AS c ON t.customer_id = c.customer_id;
 
504
 
 
505
    /* Clean up */
 
506
    DROP TABLE tmpCustomer;
 
507
END //
 
508
 
 
509
DELIMITER ;
 
510
 
 
511
DELIMITER $$
 
512
 
 
513
CREATE FUNCTION get_customer_balance(p_customer_id INT, p_effective_date DATETIME) RETURNS DECIMAL(5,2)
 
514
    DETERMINISTIC
 
515
    READS SQL DATA
 
516
BEGIN
 
517
 
 
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
 
524
 
 
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
 
528
 
 
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;
 
535
 
 
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;
 
543
 
 
544
 
 
545
  SELECT IFNULL(SUM(payment.amount),0) INTO v_payments
 
546
    FROM payment
 
547
 
 
548
    WHERE payment.payment_date <= p_effective_date
 
549
    AND payment.customer_id = p_customer_id;
 
550
 
 
551
  RETURN v_rentfees + v_overfees - v_payments;
 
552
END $$
 
553
 
 
554
DELIMITER ;
 
555
 
 
556
DELIMITER $$
 
557
 
 
558
CREATE PROCEDURE film_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT)
 
559
READS SQL DATA
 
560
BEGIN
 
561
     SELECT inventory_id
 
562
     FROM inventory
 
563
     WHERE film_id = p_film_id
 
564
     AND store_id = p_store_id
 
565
     AND inventory_in_stock(inventory_id);
 
566
 
 
567
     SELECT FOUND_ROWS() INTO p_film_count;
 
568
END $$
 
569
 
 
570
DELIMITER ;
 
571
 
 
572
DELIMITER $$
 
573
 
 
574
CREATE PROCEDURE film_not_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT)
 
575
READS SQL DATA
 
576
BEGIN
 
577
     SELECT inventory_id
 
578
     FROM inventory
 
579
     WHERE film_id = p_film_id
 
580
     AND store_id = p_store_id
 
581
     AND NOT inventory_in_stock(inventory_id);
 
582
 
 
583
     SELECT FOUND_ROWS() INTO p_film_count;
 
584
END $$
 
585
 
 
586
DELIMITER ;
 
587
 
 
588
DELIMITER $$
 
589
 
 
590
CREATE FUNCTION inventory_held_by_customer(p_inventory_id INT) RETURNS INT
 
591
READS SQL DATA
 
592
BEGIN
 
593
  DECLARE v_customer_id INT;
 
594
  DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
 
595
 
 
596
  SELECT customer_id INTO v_customer_id
 
597
  FROM rental
 
598
  WHERE return_date IS NULL
 
599
  AND inventory_id = p_inventory_id;
 
600
 
 
601
  RETURN v_customer_id;
 
602
END $$
 
603
 
 
604
DELIMITER ;
 
605
 
 
606
DELIMITER $$
 
607
 
 
608
CREATE FUNCTION inventory_in_stock(p_inventory_id INT) RETURNS BOOLEAN
 
609
READS SQL DATA
 
610
BEGIN
 
611
    DECLARE v_rentals INT;
 
612
    DECLARE v_out     INT;
 
613
 
 
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
 
616
 
 
617
    SELECT COUNT(*) INTO v_rentals
 
618
    FROM rental
 
619
    WHERE inventory_id = p_inventory_id;
 
620
 
 
621
    IF v_rentals = 0 THEN
 
622
      RETURN TRUE;
 
623
    END IF;
 
624
 
 
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;
 
629
 
 
630
    IF v_out > 0 THEN
 
631
      RETURN FALSE;
 
632
    ELSE
 
633
      RETURN TRUE;
 
634
    END IF;
 
635
END $$
 
636
 
 
637
DELIMITER ;
 
638
 
 
639
SET SQL_MODE=@OLD_SQL_MODE;
 
640
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 
641
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
 
642
 
 
643