嘿,各位数据界的小伙伴们,欢迎来到SQL训练营的第十八章!这一章,咱们要玩转一个超级有用的工具——视图View。视图就像是数据界的“魔术镜”,能让你看到数据的不同面貌,还能简化、格式化、过滤数据,甚至计算新字段!是不是听起来就像变魔术一样?那就跟着我一起来探索这个“魔术镜”吧!准备好了吗?让我们开始吧!
第一节:准备相关基础表和数据
为了方便我们练习视图,我们将创建几个新的表格,并插入一些与前几章不同的数据。假设我们有一个电影租赁平台,需要记录电影、导演、演员和租赁信息。我们将创建四个表格:movies(电影表)、directors(导演表)、actors(演员表)和 rentals(租赁表),并插入一些初始数据。
1. 创建表格
movies 表格(电影信息)
-- 创建 "movies" 表格,包含电影的基本信息
CREATE TABLE movies (
movie_id INT PRIMARY KEY AUTO_INCREMENT, -- 电影编号,自动递增
title VARCHAR(100), -- 电影名称
release_year YEAR, -- 上映年份
director_id INT, -- 导演编号
genre VARCHAR(50) -- 电影类型
);
directors 表格(导演信息)
-- 创建 "directors" 表格,包含导演的基本信息
CREATE TABLE directors (
director_id INT PRIMARY KEY AUTO_INCREMENT, -- 导演编号,自动递增
first_name VARCHAR(50), -- 导演名
last_name VARCHAR(50) -- 导演姓
);
actors 表格(演员信息)
-- 创建 "actors" 表格,包含演员的基本信息
CREATE TABLE actors (
actor_id INT PRIMARY KEY AUTO_INCREMENT, -- 演员编号,自动递增
first_name VARCHAR(50), -- 演员名
last_name VARCHAR(50), -- 演员姓
movie_id INT -- 所参演的电影编号
);
rentals 表格(租赁信息)
-- 创建 "rentals" 表格,包含租赁的基本信息
CREATE TABLE rentals (
rental_id INT PRIMARY KEY AUTO_INCREMENT, -- 租赁编号,自动递增
customer_name VARCHAR(100), -- 客户姓名
movie_id INT, -- 租赁的电影编号
rental_date DATE, -- 租赁日期
return_date DATE -- 归还日期
);
2. 插入数据
movies 表格数据
-- 插入五条电影记录
INSERT INTO movies (title, release_year, director_id, genre)
VALUES ('The Godfather', 1972, 1, 'Crime');
INSERT INTO movies (title, release_year, director_id, genre)
VALUES ('Pulp Fiction', 1994, 2, 'Crime');
INSERT INTO movies (title, release_year, director_id, genre)
VALUES ('Inception', 2010, 3, 'Sci-Fi');
INSERT INTO movies (title, release_year, director_id, genre)
VALUES ('The Dark Knight', 2008, 3, 'Action');
INSERT INTO movies (title, release_year, director_id, genre)
VALUES ('Forrest Gump', 1994, 4, 'Drama');
directors 表格数据
-- 插入五条导演记录
INSERT INTO directors (first_name, last_name)
VALUES ('Francis', 'Coppola');
INSERT INTO directors (first_name, last_name)
VALUES ('Quentin', 'Tarantino');
INSERT INTO directors (first_name, last_name)
VALUES ('Christopher', 'Nolan');
INSERT INTO directors (first_name, last_name)
VALUES ('Robert', 'Zemeckis');
actors 表格数据
-- 插入五条演员记录
INSERT INTO actors (first_name, last_name, movie_id)
VALUES ('Marlon', 'Brando', 1);
INSERT INTO actors (first_name, last_name, movie_id)
VALUES ('John', 'Travolta', 2);
INSERT INTO actors (first_name, last_name, movie_id)
VALUES ('Leonardo', 'DiCaprio', 3);
INSERT INTO actors (first_name, last_name, movie_id)
VALUES ('Christian', 'Bale', 4);
INSERT INTO actors (first_name, last_name, movie_id)
VALUES ('Tom', 'Hanks', 5);
rentals 表格数据
-- 插入五条租赁记录
INSERT INTO rentals (customer_name, movie_id, rental_date, return_date)
VALUES ('Alice Smith', 1, '2023-01-15', '2023-01-22');
INSERT INTO rentals (customer_name, movie_id, rental_date, return_date)
VALUES ('Bob Johnson', 2, '2023-02-10', '2023-02-17');
INSERT INTO rentals (customer_name, movie_id, rental_date, return_date)
VALUES ('Charlie Brown', 3, '2023-03-05', '2023-03-12');
INSERT INTO rentals (customer_name, movie_id, rental_date, return_date)
VALUES ('Diana Prince', 4, '2023-04-20', '2023-04-27');
INSERT INTO rentals (customer_name, movie_id, rental_date, return_date)
VALUES ('Eve Adams', 5, '2023-05-12', '2023-05-19');
现在,我们的 movies、directors、actors 和 rentals 表格已经准备好了,里面有一些电影、导演、演员和租赁的信息。接下来,我们将学习如何使用视图来简化和美化这些数据查询。
幽默小贴士:
视图就像是给数据库“化妆”,你可以通过它让数据看起来更加漂亮和易于理解。别担心,SQL 会帮你搞定这一切! 💄
第二节:视图介绍
1. 什么是视图?
视图(View) 是一个虚拟的表格,它并不实际存储数据,而是基于一个或多个真实表格的查询结果。你可以把视图想象成一个“窗口”,通过这个窗口,你可以看到经过筛选、格式化或计算后的数据。视图可以帮助你简化复杂的查询,提高查询效率,并且可以让数据看起来更加整洁和易于理解。
2. 为什么使用视图?
视图有很多好处,以下是其中的一些:
简化复杂查询:视图可以将复杂的多表联结查询封装起来,用户只需要查询视图,而不需要关心底层的表结构。格式化数据:视图可以对数据进行格式化处理,例如显示友好的列名、计算字段等。过滤数据:视图可以根据特定条件过滤数据,只显示你需要的部分。保护数据:视图可以限制用户只能访问某些特定的数据,而不能直接访问底层表格,从而提高数据的安全性。提高性能:虽然视图本身不存储数据,但有些数据库系统会对常用的视图进行缓存,从而提高查询性能。
3. 视图的规则和限制
虽然视图非常有用,但在使用时也有一些规则和限制需要注意:
视图是只读的:默认情况下,视图是只读的,无法直接修改视图中的数据。如果你想通过视图更新数据,需要确保视图的查询结果是可以更新的(例如,没有使用聚合函数或分组)。视图依赖于底层表格:视图只是基于底层表格的查询结果,因此如果底层表格的结构发生变化,视图可能需要重新定义。视图不会占用额外的存储空间:视图只是一个查询的定义,不会像真实表格那样占用额外的存储空间。视图可以嵌套:你可以在一个视图中引用另一个视图,但这可能会导致性能问题,因此要谨慎使用。
幽默小贴士:
视图就像是给数据库“化妆”,它可以让你的数据看起来更加漂亮和易于理解。而且,它还可以保护你的数据,防止别人“乱动”! 🛡️
第三节:创建视图
1. 基本创建视图语法
要创建一个视图,可以使用 CREATE VIEW 语句。你需要指定视图的名称以及查询语句。视图的查询语句可以是任何有效的 SQL 查询,包括联结、聚合、子查询等。
示例 1:创建一个简单的视图
假设我们要创建一个名为 top_movies 的视图,用于显示评分最高的电影。我们可以使用以下语句:
CREATE VIEW top_movies AS
SELECT m.title, m.release_year, d.first_name, d.last_name, m.genre
FROM movies m
JOIN directors d ON m.director_id = d.director_id
WHERE m.genre = 'Crime';
这条语句会创建一个名为 top_movies 的视图,显示所有类型为“犯罪片”的电影及其导演信息。
2. 利用视图简化数据
视图的一个重要用途是简化复杂的查询。通过将复杂的查询封装在视图中,用户只需要查询视图,而不需要关心底层的表结构。
示例 2:简化多表联结查询
假设我们要查询每个客户的租赁历史,包括他们租借的电影名称和归还日期。我们可以创建一个名为 customer_rental_history 的视图,简化这个查询:
CREATE VIEW customer_rental_history AS
SELECT r.customer_name, m.title, r.rental_date, r.return_date
FROM rentals r
JOIN movies m ON r.movie_id = m.movie_id;
现在,用户只需要查询 customer_rental_history 视图,就可以看到每个客户的租赁历史,而不需要手动编写复杂的联结查询。
3. 利用视图格式化数据
视图不仅可以简化查询,还可以对数据进行格式化处理。例如,你可以使用别名来显示更友好的列名,或者使用函数来格式化数据。
示例 3:格式化日期和列名
假设我们要创建一个名为 formatted_rentals 的视图,显示租赁信息时将日期格式化为“YYYY-MM-DD”,并将列名改为更友好的名称:
CREATE VIEW formatted_rentals AS
SELECT
r.customer_name AS "Customer Name",
m.title AS "Movie Title",
DATE_FORMAT(r.rental_date, '%Y-%m-%d') AS "Rental Date",
DATE_FORMAT(r.return_date, '%Y-%m-%d') AS "Return Date"
FROM rentals r
JOIN movies m ON r.movie_id = m.movie_id;
现在,查询 formatted_rentals 视图时,日期将以“YYYY-MM-DD”的格式显示,列名也更加友好。
4. 利用视图过滤数据
视图还可以根据特定条件过滤数据,只显示你需要的部分。这可以帮助你专注于重要的数据,而不必每次都手动添加 WHERE 子句。
示例 4:过滤特定类型的电影
假设我们要创建一个名为 action_movies 的视图,只显示类型为“动作片”的电影:
CREATE VIEW action_movies AS
SELECT m.title, m.release_year, d.first_name, d.last_name, m.genre
FROM movies m
JOIN directors d ON m.director_id = d.director_id
WHERE m.genre = 'Action';
现在,查询 action_movies 视图时,只会显示类型为“动作片”的电影。
5. 利用视图计算字段
视图还可以用于计算字段,例如计算两个日期之间的天数、求平均值等。这可以帮助你在查询时直接获取计算结果,而不需要手动编写复杂的计算公式。
示例 5:计算租赁天数
假设我们要创建一个名为 rental_days 的视图,显示每个客户的租赁天数:
CREATE VIEW rental_days AS
SELECT
r.customer_name,
m.title,
DATEDIFF(r.return_date, r.rental_date) AS "Rental Days"
FROM rentals r
JOIN movies m ON r.movie_id = m.movie_id;
现在,查询 rental_days 视图时,可以直接看到每个客户的租赁天数。
幽默小贴士:
视图就像是给数据库“穿上了一件漂亮的外衣”,它不仅让数据看起来更加整洁,还能帮你节省很多时间! 👗
第四节:删除视图
1. 删除视图
如果你不再需要某个视图,可以使用 DROP VIEW 语句将其删除。请注意,删除视图不会影响底层的表格,视图只是查询的定义。
示例 6:删除 top_movies 视图
假设我们决定不再需要 top_movies 视图,可以使用以下语句将其删除:
DROP VIEW top_movies;
2. 删除多个视图
如果你想同时删除多个视图,可以在一条语句中列出多个 DROP VIEW 操作。
示例 7:删除多个视图
假设我们决定删除 customer_rental_history 和 formatted_rentals 视图,可以使用以下语句:
DROP VIEW customer_rental_history, formatted_rentals;
幽默小贴士:
删除视图就像是给数据库“脱衣服”,虽然有时候不可避免,但一定要小心,不要脱错了! 😅
第五节:挑战分析
1. 挑战 1:创建一个名为 comedy_movies 的视图,显示所有类型为“喜剧片”的电影及其导演信息
要创建一个名为 comedy_movies 的视图,显示所有类型为“喜剧片”的电影及其导演信息,可以使用以下语句:
CREATE VIEW comedy_movies AS
SELECT m.title, m.release_year, d.first_name, d.last_name, m.genre
FROM movies m
JOIN directors d ON m.director_id = d.director_id
WHERE m.genre = 'Comedy';
2. 挑战 2:创建一个名为 actor_movies 的视图,显示每个演员参演的电影数量
要创建一个名为 actor_movies 的视图,显示每个演员参演的电影数量,可以使用以下语句:
CREATE VIEW actor_movies AS
SELECT a.first_name, a.last_name, COUNT(a.movie_id) AS "Movies Count"
FROM actors a
GROUP BY a.actor_id;
3. 挑战 3:创建一个名为 long_rentals 的视图,显示租赁天数超过 7 天的记录
要创建一个名为 long_rentals 的视图,显示租赁天数超过 7 天的记录,可以使用以下语句:
CREATE VIEW long_rentals AS
SELECT
r.customer_name,
m.title,
DATEDIFF(r.return_date, r.rental_date) AS "Rental Days"
FROM rentals r
JOIN movies m ON r.movie_id = m.movie_id
WHERE DATEDIFF(r.return_date, r.rental_date) > 7;
4. 挑战 4:创建一个名为 average_rental_days 的视图,显示每部电影的平均租赁天数
要创建一个名为 average_rental_days 的视图,显示每部电影的平均租赁天数,可以使用以下语句:
CREATE VIEW average_rental_days AS
SELECT
m.title,
AVG(DATEDIFF(r.return_date, r.rental_date)) AS "Average Rental Days"
FROM rentals r
JOIN movies m ON r.movie_id = m.movie_id
GROUP BY m.movie_id;
5. 挑战 5:删除 comedy_movies 视图
要删除 comedy_movies 视图,可以使用以下语句:
DROP VIEW comedy_movies;
幽默小贴士:
挑战就像是编程中的“小游戏”,虽然有时候你会遇到困难,但只要坚持尝试,最终一定能找到正确的答案。每一次挑战都是通向成功的一步! 🎮
本章总结
通过这一章的学习,我们掌握了以下技能:
视图介绍:视图是一个虚拟的表格,它基于一个或多个真实表格的查询结果。视图可以帮助你简化复杂的查询、格式化数据、过滤数据和计算字段。创建视图:使用 CREATE VIEW 语句可以创建视图,并将复杂的查询封装起来。视图可以简化数据查询、格式化数据、过滤数据和计算字段。删除视图:使用 DROP VIEW 语句可以删除视图,而不会影响底层的表格。视图的规则和限制:视图是只读的,默认情况下无法直接修改视图中的数据。视图依赖于底层表格,因此如果表格结构发生变化,视图可能需要重新定义。
幽默小贴士:
视图就像是给数据库“穿上了一件漂亮的外衣”,它不仅让数据看起来更加整洁,还能帮你节省很多时间! 👗
结束语
恭喜你完成了 SQL 训练营的第十八章!希望你在这一章中学到了很多关于视图的知识,并且通过动手实践加深了对 SQL 的理解。记住,视图就像一面镜子,它反映的是你查询的结果,而不是存储的数据。接下来,继续你的SQL之旅,用视图的魔力去探索更多数据的“魔术”吧!