目录:
视频: 跟着Inty学SQL(SQL入门,初学者教程1) 2024
有时,您想要从SQL中的CUSTOMER表中检索特定的信息。你不想看所有的东西 - 只有特定的列和行。你需要的是一个观点。
一个 视图 是一个虚拟表。在大多数实现中,视图没有独立的物理存在。视图的定义仅存在于数据库的元数据中,但数据来自您从中派生视图的一个或多个表格。视图的数据不是物理上重复的。
<! --1 - >单表视图
如果您想要的信息存在于单个表中,则可以创建数据的单表视图。例如,假设您想查看所有居住在新罕布什尔州的客户的姓名和电话号码。您可以从仅包含所需数据的CUSTOMER表创建视图。以下SQL语句创建此视图:
CREATE VIEW NH_CUST AS SELECT CUSTOMER。名字,客户。姓氏,CUSTOMER。电话从客户的客户。国家='NH';
如果您的SQL实现假定所有表引用与FROM子句中的相同,则可以使用较少的键入来完成相同的任务。如果您的系统进行了合理的默认假设,则可以将语句缩减为以下几行:
创建视图NH_CUST作为选择姓,名,电话从CUSTOMER WHERE STATE ='NH';
虽然第二个版本更容易编写和读取,但更容易受到ALTER TABLE命令的干扰。对于这种简单的情况,这样的中断不是问题,它没有JOIN,但是当使用完全限定的名字时JOIN的视图更健壮。
多视图
通常情况下,您需要从两个或多个表中提取数据来回答您的问题。例如,假设您在体育用品商店工作,并且希望自去年开业以来,向所有购买了滑雪设备的客户发送促销邮件。
您需要来自CUSTOMER表,PRODUCT表,INVOICE表和INVOICE_LINE表的信息。您可以创建一个多视图来显示您需要的数据。每次使用视图时,都会反映自上次使用视图后在基础表中发生的任何更改。
该体育用品商店的数据库包含四个表格:客户,产品,发票和INVOICE_LINE。 CHAR <15>
表 | 列 | 数据类型 | |
---|---|---|---|
约束 | CUSTOMER | 客户ID | INTEGER |
NOT NULL | 999(999)CHAR(20) | ||
NOT NULL | 街道 | CHAR(25) | |
城市 | CHAR(20) | ||
州 | CHAR(2) | ||
邮编 > CHAR(10) | 电话 | ||
CHAR(13) | 产品 | ||
产品ID | INTEGER | ||
NOT NULL | 名称 | CHAR(25) | 说明 > CHAR(30) |
类别 | CHAR(15) | ||
VendorID | INTEGER | ||
VendorName | CHAR(30) | ||
INVOICE | InvoiceNumber | ||
INTEGER | NOT NULL | ||
CustomerID | INTEGER | InvoiceDate | DATE |
TotalSale | NUMERIC(9,2) | ||
TotalRemitted | NUMERIC(9,2) | ||
FormOfPayment > CHAR(10) | INVOICE_LINE | ||
LineNumber | INTEGER | ||
NOT NULL | InvoiceNumber | ||
INTEGER | NOT NULL | ProductID | INTEGER |
NOT NULL >数量 | INTEGER | SalePrice | |
NUMERIC(9,2) | 请注意,某些列包含约束NOT NULL。这些列是它们各自表的主键,或者是您决定 | 必须 | |
包含值的列。表的主键必须唯一标识每一行。为此,主键必须在每一行中包含一个非空值。 | 这些表格通过它们共有的列相互关联。以下列表描述了这些关系: | ||
CUSTOMER表对INVOICE表承载 | 一对多关系 |
。一个客户可以进行多次采购,生成多个发票。但是,每张发票都只能处理一个客户。 INVOICE表与INVOICE_LINE表具有一对多的关系。一张发票可能有多行,但是每一行都会出现在一张发票上,而且只有一张。 PRODUCT表也与INVOICE_LINE表具有一对多的关系。产品可能出现在一个或多个发票上的多行上。但是,每条产品线只涉及一个产品。 CUSTOMER表通过公共CustomerID列链接到INVOICE表。 INVOICE表通过普通的InvoiceNumber列链接到INVOICE_LINE表。 PRODUCT表通过常见的ProductID列链接到INVOICE_LINE表。这些链接是使这个数据库成为
关系数据库的原因。
-
要访问购买滑雪设备的客户的信息,您需要CUSTOMER表中的FirstName,LastName,Street,City,State和Zipcode;来自PRODUCT表的类别; INVOICE表中的InvoiceNumber;和INVOICE_LINE表中的LineNumber。您可以使用以下语句分阶段创建所需的视图: CREATE VIEW SKI_CUST1 AS SELECT姓,名,街道,城市,州,邮编,发票号码从客户加入发票使用(客户ID); CREATE VIEW SKI_CUST2 AS SELECT名字,姓氏,街道,城市,州,邮编,ProductID从SKI_CUST1加入INVOICE_LINE USING(InvoiceNumber); CREATE VIEW SKI_CUST3 AS SELECT名字,姓氏,街道,城市,州,邮编,类别从SKI_CUST2加入产品使用(ProductID); CREATE VIEW SKI_CUST AS SELECT DISTINCT名字,姓氏,街道,城市,州,从SKI_CUST3邮政编码WHERE CATEGORY ='滑雪'; 这些CREATE VIEW语句通过使用JOIN运算符组合来自多个表的数据。
-
以下是四条CREATE VIEW语句的简要说明:
-
第一条语句将CUSTOMER表中的列与INVOICE表的一列相结合,以创建SKI_CUST1视图。
第二个语句将SKI_CUST1与INVOICE_LINE表中的一列相结合,以创建SKI_CUST2视图。 第三个语句将SKI_CUST2与PRODUCT表中的列结合起来创建SKI_CUST3视图。 第四个语句过滤掉所有没有Ski类别的行。结果是一个视图(SKI_CUST),其中包含所有在Ski类别中至少购买一个产品的客户的名称和地址。
第四个CREATE VIEW的SELECT子句中的DISTINCT关键字可确保每个客户只有一个条目,即使某些客户多次购买滑雪项目也是如此。