zoukankan      html  css  js  c++  java
  • 数据库系统概论(第三版)学习笔记

    1、获取位于同一个所在地的所有部门的全部详细信息。

    USE sample

    SELECT t1.*

    FROM department t1

    WHERE t1.location IN

    (SELECT t2.location

    FROM department t2

    WHERE t1.dept_no <> t2.dept_no)

    结果如表6-16所示:

    表6-16

    dept_no

    dept_name

    location

    d1

    Research

    Dallas

    d3

    Marketing

    Dallas


    注解:WHERE t1.location IN (SELECT子查询集合),DBMS首先计算子查询,再把结果集返回给

    外部查询。WHERE t1.location IN (‘Dallas’,'Houston')相当于语法

    WHERE t1.location=‘Dallas’ OR t1.location='Houston'

    2、创建一个学生信息表

    CREATE TABLE Student

    ( Sno CHAR(5) NOT NULL UNIQUE,

    Sname CHAR(10),

    Sdept   CHAR(12))

    3、查询语句(表达式作为查询列)

    SELECT Sname Name,1996-Sage Birthday,ISLOWER(Sdept) Department

    FROM Student

    4、去掉相同元组

    SELECT DISTINCT Sno

    FROM SC

    5、谓词 IN 和NOT IN


    SELECT Sname,Ssex

    FROM Student

    WHERE Sdept IN('IS','MA','CS')      /* IN括号里的集合也可以是个子查询*/

    6、WHERE Grade IS NULL 不等于 WHERE Grade = NULL

    7、COUNT()函数统计学生个数,AVG()求课程号1的平均分

    SELECT COUNT(DISTINCT Sno)

    FROM SC

    SELECT AVG(Grade)

    FROM SC

    WHERE Cno='1'

    8、创建信息系学生的视图

    CREATE VIEW IS_Student

                   AS

                   SELECT Sno,Sname,Sage

                   FROM Student

                   WHERE Sdept = 'IS'

    本例中的视图IS_Student省略了列名,隐含了由子查询中的SELECT子句的三个列名组成。
    DBMS执行CREATE VIEW 的结果只是把视图的定义存入数据字典,并不执行其中的SELECT语句,只是在对视图查询时,才按视图的定义,把数据从基本表中读出。

    使用视图:
    这时利用上面创建的视图,查询信息系的学生,就可以这样做了。

    SELECT *
    FROM IS_Student

    看看,这样是不是简化了查询的语法,呵呵。当然这只视图的作用之一。

    with check option 子句

    CREATE VIEW IS_Student

                   AS

                   SELECT Sno,Sname,Sage

                   FROM Student

                   WHERE Sdept = 'IS'

                   WITH CHECK OPTION

          现在视图中加入了
    with check option 子句,以后对视图执行 INSERT、UPDATE、DELETE 操作时,DBMS 会自动加上条件 Sdept = 'IS'
          with check option 可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。比如你insert,那么加的这条记录在刷新视图后必须可以看到;如果修改,修改完的结果也必须能通过该视图看到;如果删除,当然只能删除视图里有显示的记录。

    带表达式视图:

    定义一个反映学生出生年份的视图
    CREATE VIEW BT_S(Sno,Sname,Sbirth)
           AS
           SELECT Sno,Sname,1996-Sage
           FROM Student


    分组视图:

    将学生学号及他的平均成绩定义为一个视图
    CREATE VIEW S_G(Sno,Gavg)
           AS
           SELECT Sno,AVG(Grade)
           FROM SC
           ORDER BY Sno

    视图的作用

          * 简单性。看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

          * 安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上:

          使用权限可被限制在基表的行的子集上。
          使用权限可被限制在基表的列的子集上。
          使用权限可被限制在基表的行和列的子集上。
          使用权限可被限制在多个基表的连接所限定的行上。
          使用权限可被限制在基表中的数据的统计汇总上。
          使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后的子集上。

          * 逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。

    查询优化的一般准则
    1. 选择运算尽可能先做
    选择运算是查询中出现最频繁的一种运算,先做选择运算可大大减少运算中间结果、减少运算量和从外存储器读块的次数,从而可使时间节约几个数量级。
    2.在执行连接之前先对文件适当地预处理。预处理的方法有:
    a)对文件先做排序
    b)在准备连接的属性上建立索引
    在连接运算之前,对文件进行预处理,系统能快速有效地找到要连接的元组,从而达到节约运算时间的目的。虽然建立分类和倒排索引文件需要花费时间,但查询是一个很普遍的运算,总体上讲是合算的。
    3. 同时计算一串投影运算或一串选择运算,避免分开造成重复扫描文件,以便节约运算时间。
    4. 把投影同其前或后的双目运算(∪、-、X、>< )结合起来同时运行,同样可避免重复扫描文件。
    5. 把某些选择同它前面要执行的乘积结合起来成为一个连接运算,使选择与乘积一起完成,成为一个有选择的连接。另一方面避免了再次扫描乘积后容量庞大的中间关系,从而大大节省运算时间。
    6. 找出公共子表达式,并存贮公共的子表达式。
    若一个反复出现的公共表达式的结果不是一个很大的关系,且从外存读入它的时间小于计算它的时间时,可将其结果存入外存,以后若遇到该表达式时不必计算而直接将其调出,从而达到节约操作时间的目的。这种方法对公共子表达式出现频繁的查询效果更好。

  • 相关阅读:
    HDU1172 猜数字 广搜
    HDU2688 Rotate
    HDU1006 Tick and Tick 几何
    ADO.NET中的五个主要对象
    .NET开发人员值得关注的七个开源项目
    常用正则表达式
    常用的正则表达式集锦〔转〕
    一个较优雅的GridView隐藏列取值解决方案
    DataTable分组求和
    处理[未处理的“System.StackOverflowException”类型的异常出现在 System.Windows.Fo ...
  • 原文地址:https://www.cnblogs.com/yangjunwl/p/918832.html
Copyright © 2011-2022 走看看