⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sakila-schema.sql

📁 这是MySQL官方测试用的数据库
💻 SQL
📖 第 1 页 / 共 2 页
字号:
	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 FROM customer AS cu JOIN address AS a ON cu.address_id = a.address_id JOIN city ON a.city_id = city.city_id 	JOIN country ON city.country_id = country.country_id;---- View structure for view `film_list`--CREATE VIEW film_list AS SELECT film.film_id AS FID, film.title AS title, film.description AS description, category.name AS category, film.rental_rate AS price,	film.length AS length, film.rating AS rating, GROUP_CONCAT(CONCAT(actor.first_name, _utf8' ', actor.last_name) SEPARATOR ', ') AS actors 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        JOIN film_actor ON film.film_id = film_actor.film_id 	JOIN actor ON film_actor.actor_id = actor.actor_id GROUP BY film.film_id;---- View structure for view `nicer_but_slower_film_list`--CREATE VIEW nicer_but_slower_film_list AS SELECT film.film_id AS FID, film.title AS title, film.description AS description, category.name AS category, film.rental_rate AS price, 	film.length AS length, film.rating AS rating, GROUP_CONCAT(CONCAT(CONCAT(UCASE(SUBSTR(actor.first_name,1,1)),	LCASE(SUBSTR(actor.first_name,2,LENGTH(actor.first_name))),_utf8' ',CONCAT(UCASE(SUBSTR(actor.last_name,1,1)),	LCASE(SUBSTR(actor.last_name,2,LENGTH(actor.last_name)))))) SEPARATOR ', ') AS actors 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        JOIN film_actor ON film.film_id = film_actor.film_id	JOIN actor ON film_actor.actor_id = actor.actor_id GROUP BY film.film_id;---- View structure for view `staff_list`--CREATE VIEW staff_list AS 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,	city.city AS city, country.country AS country, s.store_id AS SID FROM staff AS s JOIN address AS a ON s.address_id = a.address_id JOIN city ON a.city_id = city.city_id 	JOIN country ON city.country_id = country.country_id;---- View structure for view `sales_by_store`--CREATE VIEW sales_by_storeAS SELECT CONCAT(c.city, _utf8',', cy.country) AS store, CONCAT(m.first_name, _utf8' ', m.last_name) AS manager, SUM(p.amount) AS total_salesFROM payment AS pINNER JOIN rental AS r ON p.rental_id = r.rental_idINNER JOIN inventory AS i ON r.inventory_id = i.inventory_idINNER JOIN store AS s ON i.store_id = s.store_idINNER JOIN address AS a ON s.address_id = a.address_idINNER JOIN city AS c ON a.city_id = c.city_idINNER JOIN country AS cy ON c.country_id = cy.country_idINNER JOIN staff AS m ON s.manager_staff_id = m.staff_idGROUP BY s.store_idORDER BY cy.country, c.city;---- View structure for view `sales_by_film_category`---- Note that total sales will add up to >100% because-- some titles belong to more than 1 category--CREATE VIEW sales_by_film_categoryAS SELECT c.name AS category, SUM(p.amount) AS total_salesFROM payment AS pINNER JOIN rental AS r ON p.rental_id = r.rental_idINNER JOIN inventory AS i ON r.inventory_id = i.inventory_idINNER JOIN film AS f ON i.film_id = f.film_idINNER JOIN film_category AS fc ON f.film_id = fc.film_idINNER JOIN category AS c ON fc.category_id = c.category_idGROUP BY c.nameORDER BY total_sales DESC;---- View structure for view `actor_info`--CREATE DEFINER=CURRENT_USER SQL SECURITY INVOKER VIEW actor_info ASSELECT      a.actor_id,a.first_name,a.last_name,GROUP_CONCAT(DISTINCT CONCAT(c.name, ': ',		(SELECT GROUP_CONCAT(f.title ORDER BY f.title SEPARATOR ', ')                    FROM sakila.film f                    INNER JOIN sakila.film_category fc                      ON f.film_id = fc.film_id                    INNER JOIN sakila.film_actor fa                      ON f.film_id = fa.film_id                    WHERE fc.category_id = c.category_id                    AND fa.actor_id = a.actor_id                 )             )             ORDER BY c.name SEPARATOR '; ')AS film_infoFROM sakila.actor aLEFT JOIN sakila.film_actor fa  ON a.actor_id = fa.actor_idLEFT JOIN sakila.film_category fc  ON fa.film_id = fc.film_idLEFT JOIN sakila.category c  ON fc.category_id = c.category_idGROUP BY a.actor_id, a.first_name, a.last_name;---- Procedure structure for procedure `rewards_report`--DELIMITER //CREATE PROCEDURE rewards_report (    IN min_monthly_purchases TINYINT UNSIGNED    , IN min_dollar_amount_purchased DECIMAL(10,2) UNSIGNED    , OUT count_rewardees INT)LANGUAGE SQLNOT DETERMINISTIC READS SQL DATASQL SECURITY DEFINERCOMMENT 'Provides a customizable report on best customers'proc: BEGIN        DECLARE last_month_start DATE;    DECLARE last_month_end DATE;    /* Some sanity checks... */    IF min_monthly_purchases = 0 THEN        SELECT 'Minimum monthly purchases parameter must be > 0';        LEAVE proc;    END IF;    IF min_dollar_amount_purchased = 0.00 THEN        SELECT 'Minimum monthly dollar amount purchased parameter must be > $0.00';        LEAVE proc;    END IF;    /* Determine start and end time periods */    SET last_month_start = DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH);    SET last_month_start = STR_TO_DATE(CONCAT(YEAR(last_month_start),'-',MONTH(last_month_start),'-01'),'%Y-%m-%d');    SET last_month_end = LAST_DAY(last_month_start);    /*         Create a temporary storage area for         Customer IDs.      */    CREATE TEMPORARY TABLE tmpCustomer (customer_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY);    /*         Find all customers meeting the         monthly purchase requirements    */    INSERT INTO tmpCustomer (customer_id)    SELECT p.customer_id     FROM payment AS p    WHERE DATE(p.payment_date) BETWEEN last_month_start AND last_month_end    GROUP BY customer_id    HAVING SUM(p.amount) > min_dollar_amount_purchased    AND COUNT(customer_id) > min_monthly_purchases;    /* Populate OUT parameter with count of found customers */    SELECT COUNT(*) FROM tmpCustomer INTO count_rewardees;    /*         Output ALL customer information of matching rewardees.        Customize output as needed.    */    SELECT c.*     FROM tmpCustomer AS t       INNER JOIN customer AS c ON t.customer_id = c.customer_id;    /* Clean up */    DROP TABLE tmpCustomer;END //DELIMITER ;DELIMITER $$CREATE FUNCTION get_customer_balance(p_customer_id INT, p_effective_date DATETIME) RETURNS DECIMAL(5,2)    DETERMINISTIC    READS SQL DATABEGIN       #OK, WE NEED TO CALCULATE THE CURRENT BALANCE GIVEN A CUSTOMER_ID AND A DATE       #THAT WE WANT THE BALANCE TO BE EFFECTIVE FOR. THE BALANCE IS:       #   1) RENTAL FEES FOR ALL PREVIOUS RENTALS       #   2) ONE DOLLAR FOR EVERY DAY THE PREVIOUS RENTALS ARE OVERDUE       #   3) IF A FILM IS MORE THAN RENTAL_DURATION * 2 OVERDUE, CHARGE THE REPLACEMENT_COST       #   4) SUBTRACT ALL PAYMENTS MADE BEFORE THE DATE SPECIFIED  DECLARE v_rentfees DECIMAL(5,2); #FEES PAID TO RENT THE VIDEOS INITIALLY  DECLARE v_overfees INTEGER;      #LATE FEES FOR PRIOR RENTALS  DECLARE v_payments DECIMAL(5,2); #SUM OF PAYMENTS MADE PREVIOUSLY  SELECT IFNULL(SUM(film.rental_rate),0) INTO v_rentfees    FROM film, inventory, rental    WHERE film.film_id = inventory.film_id      AND inventory.inventory_id = rental.inventory_id      AND rental.rental_date <= p_effective_date      AND rental.customer_id = p_customer_id;  SELECT IFNULL(SUM(IF((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) > film.rental_duration,        ((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) - film.rental_duration),0)),0) INTO v_overfees    FROM rental, inventory, film    WHERE film.film_id = inventory.film_id      AND inventory.inventory_id = rental.inventory_id      AND rental.rental_date <= p_effective_date      AND rental.customer_id = p_customer_id;  SELECT IFNULL(SUM(payment.amount),0) INTO v_payments    FROM payment    WHERE payment.payment_date <= p_effective_date    AND payment.customer_id = p_customer_id;  RETURN v_rentfees + v_overfees - v_payments;END $$DELIMITER ;DELIMITER $$CREATE PROCEDURE film_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT)READS SQL DATABEGIN     SELECT inventory_id     FROM inventory     WHERE film_id = p_film_id     AND store_id = p_store_id     AND inventory_in_stock(inventory_id);     SELECT FOUND_ROWS() INTO p_film_count;END $$DELIMITER ;DELIMITER $$CREATE PROCEDURE film_not_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT)READS SQL DATABEGIN     SELECT inventory_id     FROM inventory     WHERE film_id = p_film_id     AND store_id = p_store_id     AND NOT inventory_in_stock(inventory_id);     SELECT FOUND_ROWS() INTO p_film_count;END $$DELIMITER ;DELIMITER $$CREATE FUNCTION inventory_held_by_customer(p_inventory_id INT) RETURNS INTREADS SQL DATABEGIN  DECLARE v_customer_id INT;  DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;  SELECT customer_id INTO v_customer_id  FROM rental  WHERE return_date IS NULL  AND inventory_id = p_inventory_id;  RETURN v_customer_id;END $$DELIMITER ;DELIMITER $$CREATE FUNCTION inventory_in_stock(p_inventory_id INT) RETURNS BOOLEANREADS SQL DATABEGIN    DECLARE v_rentals INT;    DECLARE v_out     INT;    #AN ITEM IS IN-STOCK IF THERE ARE EITHER NO ROWS IN THE rental TABLE    #FOR THE ITEM OR ALL ROWS HAVE return_date POPULATED    SELECT COUNT(*) INTO v_rentals    FROM rental    WHERE inventory_id = p_inventory_id;    IF v_rentals = 0 THEN      RETURN TRUE;    END IF;    SELECT COUNT(rental_id) INTO v_out    FROM inventory LEFT JOIN rental USING(inventory_id)    WHERE inventory.inventory_id = p_inventory_id    AND rental.return_date IS NULL;    IF v_out > 0 THEN      RETURN FALSE;    ELSE      RETURN TRUE;    END IF;END $$DELIMITER ;SET SQL_MODE=@OLD_SQL_MODE;SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -