sql server中视图的用途是什么?

sql server中视图的用途是什么?,sql,Sql,可能重复: 嗨, 我怀疑什么是观点。我们应该在哪里使用视图?视图的用途是什么。 有什么好的参考意见吗。感谢您请参阅,以获得良好的概述 视图是一个虚拟表,它 由一个或多个字段中的列组成 桌子。虽然它类似于 表,它不存储在数据库中。 它是存储为对象的查询。 因此,视图是一个 从一个或多个 桌子。参考这些表格 作为基表或基础表 视图本质上是“查询”,您可以在不接触主表的情况下从中进行选择 您通常执行的任何select查询(多个表、函数等)都可以是一个视图 视图有两个主要优点 首先,它们允许您重用查看

可能重复:

嗨, 我怀疑什么是观点。我们应该在哪里使用视图?视图的用途是什么。 有什么好的参考意见吗。感谢您

请参阅,以获得良好的概述

视图是一个虚拟表,它 由一个或多个字段中的列组成 桌子。虽然它类似于 表,它不存储在数据库中。 它是存储为对象的查询。 因此,视图是一个 从一个或多个 桌子。参考这些表格 作为基表或基础表

视图本质上是“查询”,您可以在不接触主表的情况下从中进行选择

您通常执行的任何select查询(多个表、函数等)都可以是一个视图

视图有两个主要优点

首先,它们允许您重用查看数据的常用方法,而无需反复编写相同的复杂SQL(即模块化)


第二,您可以为特定用户加强源表的安全性,同时允许他们通过视图查看数据。

请注意这一点

简而言之,
视图
可以与多个SQL Server一起使用,它是一种SQL标准

通常使用
视图

  • 从不同的角度呈现信息数据
  • 简化对高度复杂的数据库模式信息的访问
  • 防止直接访问数据库表(出于安全目的)(由于ORM工具,现在不太流行)
  • 使用
    视图
    ,一些“现实”就更简单了
  • 下面是一个数据库模式在多个数据库表中存储分层数据的示例

    CREATE TABLE Vehicules (
        VId int IDENTITY(1, 1) PRIMARY KEY
        , VDescription nvarchar(20) NOT NULL
    )
    
    CREATE TABLE MotoredVehicules (
        MvId int IDENTITY(1, 1) PRIMARY KEY
        , MvVId int NOT NULL REFERENCES Vehicules (VId)
        , MvMake nvarchar(20) NOT NULL
    )
    
    CREATE TABLE MotorHP (
        MhpId int IDENTITY(1, 1) PRIMARY KEY
        , MhpMvId int NOT NULL REFERENCES MotoredVehicules (MvId)
        , MhpHP decimal(6, 2) NOT NULL
    )
    
    CREATE TABLE VehiculesWheels (
        VwId int IDENTITY(1, 1) PRIMARY KEY
        , VwVId int NOT NULL REFERENCES Vehicules (VId)
        , VwNumberOfWheels int NOT NULL
    )
    
    insert into Vehicules (VDescription) values (N'Bicycle')
    GO
    insert into Vehicules (VDescription) values (N'Motorcycle')
    GO
    insert into Vehicules (VDescription) values (N'Automobile')
    GO
    insert into Vehicules (VDescription) values (N'Yacht')
    GO
    
    -- Inserting the information about the vehicules that have a motor.
    insert into MotoredVehicules (MvVId, MvMake) (
        select v.VId
                , N'Harley Davidson'
            from Vehicules as v
            where v.VDescription LIKE N'Motorcycle'
    )
    GO
    insert into MotoredVehicules (MvVId, MvMake) (
        select v.VId
                , N'Sea-Ray'
            from Vehicules as v
            where v.VDescription LIKE N'Yacht'
    )
    GO
    insert into MotoredVehicules (MvVId, MvMake) (
        select v.VId
                , N'Mercedes'
            from Vehicules as v
            where v.VDescription LIKE N'Automobile'
    )
    GO
    
    -- Inserting motor HP for the motorized vehicules.
    insert into MotorHP (MhpMvId, MhpHP) (
        select mv.MvId
                , 350
            from MotoredVehicules as mv
            where mv.MvMake LIKE N'Sea-Ray'
    )
    GO
    insert into MotorHP (MhMvId, MhpHP) (
        select mv.MvId
                , 280
            from MotoredVehicules as mv
            where mv.MvMake LIKE N'Mercedes'
    )
    GO
    insert into MotorHP (MhpMvId, MhpHP) (
        select mv.MvId
                , 930
            from MotoredVehicules as mv
            where mv.MvMake LIKE N'Harley Davidson'
    )
    GO
    
    -- Inserting the number of wheels for wheeled vehicules.
    insert into VehiculesWheels (VwVId, VwNumberOfWheels) (
        select v.VId
                , 2
            from Vehicules as v
            where v.VDescription IN (N'Bicycle', N'Motorcycle')
    )
    GO
    insert into VehiculesWheels (VwVId, VwNumberOfWheels) (
        select v.VId
                , 4
            from Vehicules as v
            where v.VDescription LIKE N'Automobile'
    )
    GO
    
    这种关系模型本身并不十分全面。我们本可以只使用一个表来插入它们的所有规范,并允许没有数据的字段为NULL。然而,由于某些层次结构的原因,我们已经创建了关于不同类型车辆的规格表。因此,当您特别想要获得有关Vehicle的信息时,这是不太实际的,因为您必须时不时地加入表,然后您必须检索信息。在这里,有这样一种观点可能变得切实可行:

    然后,每次需要访问有关给定车辆的某些信息数据时,无需写入上述两个创建视图中包含的select,只需查询相应的视图本身即可:

    或者任何你需要的信息

    免责声明:此代码未经测试,仅为示例目的而直接编写。它可能无法正常工作


    我希望这能帮助您更好地理解视图。

    请参见此处:。在提问之前,请先搜索现有答案。另请参见:好的,实际上我问这个问题是为了更好地解释。如果我在emp表上写视图,是否可以在视图中插入新行(是否可以在视图中写入插入查询)。假设emp表由5行组成,我创建了一个视图。我在emp表中插入了一个新行,然后新创建的行将显示在视图中?是。在幕后,每次使用源表时,视图将始终在源表上运行。好的,因此视图用于基础表的安全性。我们可以对视图应用更新查询吗?re:“每次使用源表时,视图将始终在源表上运行”在一些实现中,存在一些具体化/索引化视图,这些视图在这里有点混乱view@Surya-如果删除基础列,视图将无法工作。。。您必须编辑视图以匹配新的架构。我们可以在视图上编写insert查询吗?旧的但仍然相关,该示例非常好地解释了一个实际用例,即表示可以存储在视图中的复杂查询。但请记住,视图不存储任何内容,它是在查询视图时从真实数据库动态填充的。
    CREATE VIEW WheeledMotoredVehiculesView AS
        select v.VId
                , mv.MvMake
                , hp.MhpHP
                , vw.NumberOfWheels
                , v.VDescription
            from Vehicules as v
                left join MotoredVehicules as mv on mv.MvVId = v.VId
                left join MotorHP as hp on hp.MhpMvId on mv.MvId
                left join VehiculesWheels as vw on vw.VwVId = v.VId
    GO
    
    CREATE VIEW MotoredVehiculesView AS
        select v.VId
                , mv.MvMake
                , hp.MhpHP
                , v.VDescription
            from Vehicules as v
                left join MotoredVehicules as mv on mv.MvId = v.Id
                left join MotorHP as hp on hp.MhpMvId = mv.MvId
    GO
    
    CREATE VIEW WheeledVehicules AS
        select v.VId
                , vw.NumberOfWheels
                , v.VDescription
            from Vehicules as v
                left join VehiculesWheels vw on vw.VwVId = v.VId
    GO
    
    select *
        from MotoredVehiculesView