视图和SELECT查询之间的区别

hri*_*shi 6 sql view

如果视图用于向用户显示选定的列,则可以使用相同的列

SELECT col1, col2
FROM   xyz
Run Code Online (Sandbox Code Playgroud)

,使用视图有什么意义?

Qua*_*noi 14

  • 使用视图可以节省您复制和粘贴查询的过程,并增加代码的可重用性,因此您可以10在代码的不同位置更改单个视图而不是查询.
  • 可以对视图和表授予不同的权限,以便您只能向用户显示一部分数据
  • 视图可以实现,这意味着缓存基础查询的结果


Tom*_*ing 8

正如Quassnoi所说,它对于授予表中某些行的权限很有用.

例如,假设一所大学的讲师需要访问她班级中学生的信息.她不应该访问"学生"表,因为她可以查找或修改整个大学中任何学生的信息.数据库管理员创建的视图仅显示讲师课程中的学生,并为讲师提供适当的视图权限.现在,讲师可以访问自己学生的数据,但不能访问整个"学生"表.


小智 1

上面的所有答案都很好地解释了视图和查询之间的差异。

问题中的查询非常简单,为其创建视图可能有点矫枉过正。然而,大多数查询都比较复杂,例如:

 ;with Orders2016 as (
    select Customers.CustomerID
         , Customers.CompanyName
         , TotalOrderAmount = sum(OD.Quantity * OD.UnitPrice)
    from Customers
             join Orders O on Customers.CustomerID = O.CustomerID
             join OrderDetails OD on O.OrderID = OD.OrderID
    where OrderDate >= '2016-01-01'
      and OrderDate < '2017-01-01'
    group by Customers.CustomerID, Customers.CompanyName
)
   , CustomersGroups as
    (
        select CustomerID
             , CompanyName
             , TotalOrderAmount
             , CustomerGroup =
            (
                case
                    when
                        TotalOrderAmount >= 0 and TotalOrderAmount < 1000
                        then 'low'
                    when TotalOrderAmount >= 1000 and TotalOrderAmount < 5000
                        then 'Medium'
                    when TotalOrderAmount >= 5000 and TotalOrderAmount < 10000
                        then 'High'
                    when TotalOrderAmount >= 10000 then 'VeryHigh'
                    end
                )
        from Orders2016
    )
select CustomerGroup
     , TotalInGroup      = Count(*)
     , PercentageInGroup = Count(*) * 1.0 / (select count(*) from CustomersGroups)
from CustomersGroups
group by CustomerGroup
order by TotalInGroup desc;
Run Code Online (Sandbox Code Playgroud)

想象一下每次您想要访问数据时都重写它。(或者甚至搜索文件、复制和粘贴)。时间管理不善。

视图还为我们节省了大量时间,并且是一种保持 DRY 的方式。