Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 视图如何减少代码重复?_Sql_Database_Views - Fatal编程技术网

Sql 视图如何减少代码重复?

Sql 视图如何减少代码重复?,sql,database,views,Sql,Database,Views,关于db视图,我读到了如下内容: 视图非常强大,而且 因为一个突出的原因而有用 最重要的是其他非常好的理由。 它们减少了代码重复。就是, 在大多数情况下,这是底线。如果 查询将用于三个或更多 放置,然后将显示视图 如果架构或 查询参数更改。我曾经不得不 编辑22个要更改的存储过程 一些查询逻辑。如果是原件 然后,架构利用了视图 我只有三个变化 有谁能给我解释一下它是如何工作的,也许能给我举一些例子 致以最良好的祝愿 下面是描述创建视图语法的链接。视图的另一个好处是,它们在服务器上执行,而不是在

关于db视图,我读到了如下内容:

视图非常强大,而且 因为一个突出的原因而有用 最重要的是其他非常好的理由。 它们减少了代码重复。就是, 在大多数情况下,这是底线。如果 查询将用于三个或更多 放置,然后将显示视图 如果架构或 查询参数更改。我曾经不得不 编辑22个要更改的存储过程 一些查询逻辑。如果是原件 然后,架构利用了视图 我只有三个变化

有谁能给我解释一下它是如何工作的,也许能给我举一些例子

致以最良好的祝愿


下面是描述创建视图语法的链接。视图的另一个好处是,它们在服务器上执行,而不是在客户机上执行。这意味着它们的运行速度比本地查询快得多。

视图允许更改基础表结构,而不会影响应用程序查看数据的方式。由于视图通常表示一个或多个表中的更高层域概念(例如,从“航班”、“票价”和“航空公司”表构建的“可用航班”视图),因此它们可以以统一的方式呈现复杂的想法

因为如何将原始数据库表转换为视图的逻辑是在数据库中捕获的,所以构建它们的复杂性不太可能到达您的应用程序。这意味着,如果您在许多地方使用
可用航班
,然后
航班
表中的某些内容发生了更改,则只有明确依赖于
航班
的部分需要更改,而非
可用航班
的任何内容


因此,使用视图降低复杂性并隔离将架构更改破坏回数据库的风险被认为是一个好主意,因为它不会对依赖的应用程序产生太大的影响。

视图就像一个预先确定的查询。只需编写一个
SELECT
查询,从数据库表中返回所需的列/数据-任何返回记录的查询都可以用作视图的基础。然后创建视图,并提供您编写的作为视图定义的SQL查询

在视图中执行
SELECT
时,数据库引擎将执行查询并返回结果,就像您执行了表中的
SELECT column1、column2一样

视图最好的一点是,您不局限于一个表。因此,假设您在多对多关系中有三个表-
用户-用户-角色-角色

您可以编写查询以获取用户及其关联角色:

挑选 u、 用户名, r、 角色名称 从…起 用户u 内部连接用户\u到角色ur ON ur.user\u id=u.id r.id上的内部联接角色r=ur.role\u id

现在,使用上述SQL定义创建一个视图(称为
user\u role\u view
),然后可以执行:

在应用程序中从user\u role\u视图
中选择*并获得一个结果集,其中包含
用户名
角色名
列,所有列都链接正确:-)


如果使用正确,视图在降低应用层SQL查询的复杂性方面会非常强大和有用。

简单地说,视图是由某个查询定义的虚拟表(也就是说,可以像查询表一样进行查询)。它们减少代码重复的原因如下所示:

假设您有一个包含C1和C2列的表T。然后,在应用程序中有几个地方可以查询T:
从T中选择C1,其中C2='cow'
。有一天,您意识到
cow
不再是此查询所需的值,您希望更改为
goat
。要执行此更改,您需要找到每个
SELECT
语句,并将
cow
替换为
goat

如果您一直使用绑定到
SELECT C1 FROM T,其中C2='cow'
,则您的语句看起来更像
SELECT*FROM V
——然后您可以更改
V
,而不是更改单个语句,从而进行一次更改而不是多次更改


提供了一些关于如何使用视图的很好的示例。

注意:下面的语句只是一个示例,由于SELECT*,因此实际上不起作用。这不仅仅是为了显示代码的可能减少

以下面三个类似的查询为例

SELECT
    *
FROM
    Table1
INNER JOIN
    Table2 ON Table2.Id = Table1.Id
INNER JOIN
    Table3 ON Table3.Id = Table2.Id
INNER JOIN
    TableX ON TableX.Id = Table3.Id

SELECT
    *
FROM
    Table1
INNER JOIN
    Table2 ON Table2.Id = Table1.Id
INNER JOIN
    Table3 ON Table3.Id = Table2.Id
INNER JOIN
    TableY ON TableY.Id = Table3.Id

SELECT
    *
FROM
    Table1
INNER JOIN
    Table2 ON Table2.Id = Table1.Id
INNER JOIN
    Table3 ON Table3.Id = Table2.Id
INNER JOIN
    TableZ ON TableZ.Id = Table3.Id
现在,如果我们要创建一个视图,如

CREATE VIEW View123 AS
SELECT
    *
FROM
    Table1
INNER JOIN
    Table2 ON Table2.Id = Table1.Id
INNER JOIN
    Table3 ON Table3.Id = Table2.Id
这三个查询现在可以写成

SELECT
    *
FROM
    View123
INNER JOIN
    TableX ON TableX.Id = View123.Id

SELECT
    *
FROM
    View123
INNER JOIN
    TableY ON TableY.Id = View123.Id

SELECT
    *
FROM
    View123
INNER JOIN
    TableZ ON TableZ.Id = View123.Id

视图是一个宏。不多不少

如果您开始在视图上连接视图,则这些视图可能会取消测试/扩展为服务器终止查询

它们有用途,例如隐藏表模式更改和索引/具体化视图,但它们不是万能的。“封装”您的代码是很诱人的,但要明智地使用


视图减少了代码重复,因为在定义时,大量面向数据的逻辑可以封装在视图中。应用程序可以在不包含逻辑甚至不知道逻辑的情况下访问得到的被操纵数据

例如,设想一个视图OrderDetailsEx:

 CREATE VIEW OrderDetailsEx 
    (OrderID, OrderDate, ProductID, Description, 
     UnitPrice, Quantity, ExtendedPrice, Tax, TotalPrice) AS
 SELECT O.OrderID, O.OrderDate, D.ProductID, P.Description, 
     D.UnitPrice, D.Quantity, (D.Quantity * D.UnitPrice),
     C.TaxRate, (C.TaxRate * D.Quantity * D.UnitPrice)
 FROM Orders O 
     INNER JOIN OrderDetails D ON O.OrderID = D.OrderID
     INNER JOIN Products P ON P.ProductID = D.ProductID
     INNER JOIN Customers C ON C.CustID = O.CustID
现在,只要需要订单信息,应用程序就可以自由地从此表中选择记录。不需要将行扩展、税务计算和连接逻辑编码到应用程序中

如果此信息仅用于一个位置,则意味着您只是将逻辑从应用程序重新定位到数据库。然而,在整个应用程序中,这些信息的使用很可能是分散和重复的——在购物模块中,在打印发票时,在打印对账单时,在审核账目时,等等。如果这是真的,那么你已经消除了所有的du