SQL训练营:第十八章 视图View —— 数据界的“魔术镜”!

嘿,各位数据界的小伙伴们,欢迎来到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之旅,用视图的魔力去探索更多数据的“魔术”吧!

Copyright © 2022 世界杯进球_国足进世界杯了吗 - fulitb.com All Rights Reserved.