SQL自学:怎么创建视图

在 SQL 中,视图是一种虚拟表,它是基于一个或多个表的查询结果集。视图并不实际存储数据,而是在每次查询时动态生成结果。

一、创建视图的语法(以 MySQL 为例)

sql 复制代码
CREATE VIEW view_name AS
SELECT column1, column2,...
FROM table_name
WHERE condition;
  • view_name:是要创建的视图的名称。
  • column1, column2,...:要在视图中显示的列名,可以是一个或多个表中的列。
  • table_name:是从中获取数据的表名。
  • condition:可选的筛选条件,用于限制视图中的数据。

例如:

sql 复制代码
CREATE VIEW customer_orders_view AS
SELECT c.customer_name, o.order_date, o.total_amount
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id;

这个视图将从customers表和orders表中获取客户名称、订单日期和订单总金额,并将其命名为customer_orders_view

更多例子:

例子一:基于单个表创建视图

假设有一个名为 employees 的表,包含 employee_idemployee_namedepartmentsalary 列。

创建一个视图,只显示特定部门的员工信息:

sql 复制代码
CREATE VIEW it_department_employees AS
SELECT employee_id, employee_name, salary
FROM employees
WHERE department = 'IT';

这段 SQL 语句用于创建一个名为"it_department_employees"的视图。

这个视图是基于名为"employees"的表创建的。

它从"employees"表中选取了"employee_id"(员工编号)、"employee_name"(员工姓名)和"salary"(工资)这三个列的数据。并且通过"WHERE department = 'IT'"这个条件筛选,只选择了那些所在部门为"IT"的员工记录。

这个视图的作用是提供了一种方便的方式来查看特定部门(IT 部门)的员工信息,而无需每次都执行复杂的查询语句。它可以在后续的查询中像一个普通表一样被使用,提高了查询效率和代码的可读性。同时,由于视图是虚拟表,不实际存储数据,所以当底层的"employees"表中的数据发生变化时,这个视图的结果也会自动更新。

例子二:基于多个表的连接创建视图

假设有两个表,customers(包含 customer_idcustomer_namecity)和 orders(包含 order_idcustomer_idorder_datetotal_amount)。

创建一个视图,显示每个客户的名称、所在城市以及他们的订单总数和总金额:

sql 复制代码
CREATE VIEW customer_order_summary AS
SELECT c.customer_name, c.city, COUNT(o.order_id) AS total_orders, SUM(o.total_amount) AS total_amount
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name, c.city;

这段 SQL 语句创建了一个名为"customer_order_summary"的视图。

该视图是基于"customers"表(别名"c")和"orders"表(别名"o")创建的。

它从两个表中选取特定的信息来展示客户的订单汇总情况。具体来说,选择了"customers"表中的"customer_name"(客户姓名)和"city"(客户所在城市),同时通过对"orders"表中的"order_id"进行计数(使用"COUNT(o.order_id)"并别名为"total_orders")得到每个客户的订单总数,以及对"orders"表中的"total_amount"进行求和(使用"SUM(o.total_amount)"并别名为"total_amount")得到每个客户的总金额。

通过使用"JOIN"关键字将"customers"表和"orders"表基于"c.customer_id = o.customer_id"这个条件进行连接,确保只选取有订单的客户信息。最后,使用"GROUP BY"按照"customers"表中的"customer_id"、"customer_name"和"city"对结果进行分组,使得每个客户的信息和其对应的订单汇总数据相对应。

这个视图的作用是为了方便地查看每个客户的姓名、所在城市以及他们的订单总数和总金额,而无需每次都执行复杂的连接和聚合查询操作,提高了查询效率和数据的可读性。

例子三:使用聚合函数创建视图

假设有一个销售数据表 sales_data,包含 product_idquantity_soldprice

创建一个视图,显示每个产品的总销售额:

sql 复制代码
CREATE VIEW product_sales AS
SELECT product_id, SUM(quantity_sold * price) AS total_sales
FROM sales_data
GROUP BY product_id;

这段 SQL 语句用于创建一个名为"product_sales"的视图。

这个视图是基于"sales_data"表创建的。

它从"sales_data"表中选取"product_id"列,同时通过计算"quantity_sold"(销售数量)和"price"(价格)的乘积并求和(使用"SUM(quantity_sold * price)"),将结果别名为"total_sales",代表每个产品的总销售额。 通过"GROUP BY product_id"按照产品编号进行分组,确保计算出的总销售额是针对每个不同的产品的。

这个视图的作用在于提供了一种便捷的方式来查看每个产品的总销售额情况,而无需每次都执行复杂的聚合计算查询。它使得对产品销售情况的分析更加高效和方便,提高了数据的可读性和查询效率。

例子四:结合条件筛选和聚合创建视图

假设有一个库存表 inventory,包含 item_iditem_namequantity_in_stockreorder_level

创建一个视图,显示需要补货的物品名称和当前库存数量:

sql 复制代码
CREATE VIEW items_to_reorder AS
SELECT item_name, quantity_in_stock
FROM inventory
WHERE quantity_in_stock < reorder_level;

这段 SQL 语句创建了一个名为"items_to_reorder"的视图。

该视图是基于"inventory"表构建的。

它从"inventory"表中选取"item_name"(物品名称)和"quantity_in_stock"(当前库存数量)这两列的数据。通过"WHERE quantity_in_stock < reorder_level"这个条件筛选,只选择那些当前库存数量小于重新订购水平(reorder_level)的物品记录。

这个视图的目的是提供一种快速查看需要补货的物品信息的方式。它可以在后续的查询中像普通表一样被使用,使得用户能够方便地确定哪些物品需要进行重新订购,而不必每次都执行复杂的条件查询操作,提高了查询效率和数据的可读性。

二、管理视图的规则和约束

1、命名规则

  • 视图名称必须遵循数据库的命名规则,通常与表名的命名规则相似。
  • 视图名称应该具有描述性,以便于理解其内容。

2、基于现有表或视图

  • 视图可以基于一个或多个现有表,也可以基于其他视图。
  • 当基于其他视图创建视图时,要确保底层的表或视图的数据是稳定的,否则可能会导致视图的结果不准确。

3、数据更新限制

  • 对视图的更新操作可能会受到限制,具体取决于数据库管理系统和视图的定义。
  • 一些数据库管理系统允许对可更新视图进行插入、更新和删除操作,但这些操作必须符合一定的条件。
  • 如果视图是基于多个表的连接或包含聚合函数等复杂查询,通常是不可更新的。

4、性能考虑

  • 视图的查询性能可能会受到底层表的结构和数据量的影响。
  • 如果视图的查询非常复杂或涉及大量数据,可能会导致性能下降。在这种情况下,可以考虑优化底层表的结构或创建索引来提高性能。

5、权限管理

  • 可以对视图设置权限,以控制用户对视图的访问。
  • 可以授予用户对视图的 SELECT、INSERT、UPDATE 和 DELETE 等权限,具体取决于业务需求。
相关推荐
独行soc2 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain20 分钟前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship21 分钟前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站24 分钟前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶27 分钟前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
清平乐的技术专栏44 分钟前
Hive SQL 查询所有函数
hive·hadoop·sql
梦想平凡2 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
TianyaOAO2 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
Ewen Seong2 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存
码农老起3 小时前
企业如何通过TDSQL实现高效数据库迁移与性能优化
数据库·性能优化