首页 > 代码库 > 【机房重构】SQL之视图

【机房重构】SQL之视图

    最近在重构机房收费系统,越往后就会越感觉到这里更多的是对之前学过知识(数据库,设计模式)的一种应用和回顾。比如在登录功能中用到了抽象加反射,在学生下机中,我们可以用触发器来同时更新两个表。这里就先说一下视图的使用,关于视图的有点和作用百度上有很多答案,在此不再赘述。

视图定义:

    自己理解:在涉及到多张表的操作的时候就可使用视图。这样可以避免与数据库直接联系。并且当你更新数据库数据时,就会自动更新视图中的数据,方便以后查询。

     百度百科计算机数据库中的视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

视图建立:

   这里我们通过在SQL Sever中使用企业管理器和T-Sql语句来创建。

 第一种:1.打开SQL Sever就会有如下的界面:

                          

          2.右击【视图】,选择【新建视图】,就会如下图所示:

                   

       3.在这里选择你要用到的多个表,最少是两张表。选择后【添加】,就会有如下所示:

         勾选你要用到的字段,保存之后,视图就创建成功了。

   注:这里的主外键设置应该注意。没有主外键在查询数据时,会出现查询结果卡号和学号不对应的情况。

                         

 第二种:通过编写语句来创建视图

<span style="font-family:SimSun;font-size:18px;">CREATE VIEW [dbo].[V_StudentInfo]
AS
SELECT     dbo.T_CardInfo.CardNo, dbo.T_CardInfo.Cash, dbo.T_StudentInfo.StudentNo, dbo.T_StudentInfo.StudentName, dbo.T_StudentInfo.CLassNO, dbo.T_StudentInfo.Grade, 
                      dbo.T_StudentInfo.Department, dbo.T_StudentInfo.Sex, dbo.T_StudentInfo.CardNo AS Expr1
FROM         dbo.T_CardInfo INNER JOIN
                      dbo.T_StudentInfo ON dbo.T_CardInfo.CardNo = dbo.T_StudentInfo.CardNo</span>

视图应用:

   (学生上机中查询学生信息(T_StudentInfo表)和余额(T_CardInfo表))为例   

    首先来看看学生上机的流程:当输入卡号之后,首先要查询是否存在此卡。之后若存在,就要显示学生信息余额。这样就涉及到了两张表的查询操作。

   不用视图的情况:在写查询的时候,我们要写查询学生信息的方法和查询卡余额的方法。

   使用视图的情况:将两张表变成视图存在,就只需要写一个查询方法就可将所需要的信息全部查询出来。

   使用视图的实例展示:

<span style="font-size:18px;"> 'D层
    ''' <summary>
    ''' 学生上机
    ''' </summary>
    ''' <param name="cardno">按卡号查找</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function QueryCardNoDAL(ByVal cardno As Entity.V_StudentEntity) As List(Of Entity.V_StudentEntity) Implements IDAL.ILine.QueryCardNoDAL
        Dim helper As New SqlHelper
        Dim enLine As New Entity.V_StudentEntity
        Dim dt As DataTable

        Dim sql As String = "select * from<strong> V_StudentInfo </strong>where CardNo=@CardNo"
        Dim params As SqlParameter() = {New SqlParameter("@CardNo", cardno)}

        dt = helper.querydata(sql, CommandType.Text, params)

        Dim mylist As List(Of Entity.V_StudentEntity)
        mylist = Entity.EntityHelper.convertToList(Of Entity.V_StudentEntity)(dt)

        Return mylist
    End Function</span>

    记得在学习数据库阶段,米老师找了几个人开会说说目前的学习。那会还和老师说,看完视频对于视图、触发器、存储过程就好像只是有了一个名词概念。具体干嘛用就不了解。 现在在用过这些之后,就会发现,只要做了,其实都不难。