3.5-7 数据更新、空值的处理、视图

第三章完整版->有道云笔记

3.数据更新

  • 插入数据

插入元组

I. 指出表名和属性名,属性的顺序可与CREATE TABLE的顺序不同。

    /* 将一个新学生元组插入到Student表中 */
    INSERT 
    INTO Student(Sno, Sname, Ssex, Sdept, Sage)
    VALUES('201215128', '陈学冬', '男', 'CS', 20);

II. 指出表名,不指出属性名,新元组要在表的所有属性列上都指定值,并与CREATE TABLE次序一一对应。

    /* 插入一条选课记录('201215128','1'),没有指出SC属性名时,在Grade列上要明确给出空值 */
    INSERT 
    INTO SC
    VALUES('201215128', '1', NULL);

插入子查询结果

    /* 语法格式 */
    INSERT
    INTO <表名>([<属性列1>[<,属性列2>]...])
    子查询;
    
    /* 对Student表按系分组求平均年龄,再将系名和对应的学生平均年龄存入新表 */
    INSERT
    INTO Dept_age(Sdept, Avg_age) /* Dept_age存放系名和对应的学生平均年龄 */
    SELECT Sdept, AVG(Sage)
    FROM Student
    GROUP BY Sdept; 
  • 修改数据

一般格式

    UPDATE <表名>
    SET <列名>=<表达式> [,<列名>=<表达式>] ...
    [WHERE <条件>];

修改某一个元组的值

    /* 将学生201215121的年龄改为22岁 */
    UPDATE Student
    SET Sage = 22
    WHERE Sno = '201215121';

修改多个元组的值

    /* 将所有学生的年龄增加1岁 */
    UPDATE Student
    SET Sage = Sage + 1;

带子查询的修改语句

    /* 将计科系全体学生成绩置零 */
    UPDATE SC
    SET Grade = 0
    WHERE Sno IN
        (SLECT Sno 
        FROM Student
        WHERE Sdept = 'CS');
  • 删除数据

一般格式

    DELETE
    FROM <表名>
    [WHERE <条件>];

删除某一个元组的值

    /* 删除学号为201215128的学生记录 */
    DELETE
    FROM Student
    WHERE Sno = '201215128';

删除多个元组的值

    /* 删除所有的学生选课记录 */
    DELETE
    FROM SC;

[注]:DELETE删除的是表中数据,而不是关于表的定义。DROP才可删除表。

带子查询的删除语句

    /* 删除计科系所有学生的选课记录 */
    DELETE 
    FROM SC
    WHERE Sno IN
        (SELECT Sno 
        FROM Student
        WHERE Sdept = 'CS');

4.空值的处理

  • 空值的产生
    INSERT INTO SC(Sno, Cno, Grade)
        VALUES('201216127', '1', NULL); /* 在插入时该学生还没有考试成绩,取空值 */
  • 空值的判断

判断一个属性的值是否为空值,用IS NULL或IS NOT NULL来表示。

    /* 从Student表中找出漏填了数据的学生信息 */
    SELECT *
    FROM Student
    WHRER Sname IS NULL OR Ssex IS NULL OR Sage IS NULL OR Sdept IS NULL;
  • 空值的约束条件

属性(或者域)定义中有NOT NULL约束条件的 / 加了UNIQUE限制的属性 / 码属性不能取空值。

  • 空值的算术运算、比较运算和逻辑运算

空值与另一个值(包括另一个空值)的算术运算的结果为空值,空值与另一个值(包括另一个空值)的比较运算结果为UNKNOWN。传统二值逻辑拓展成了三值逻辑。

    /* 选出选修1号课程不及格的学生以及缺考的学生 */
    SELECT Sno
    FROM SC
    WHERE Cno = '1' AND (Grade < 60 OR Grade IS NULL);

5.视图

视图是从一个或几个基本表(或视图)导出的表,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据。视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。

  • 定义视图

    I. 建立视图

      /* 一般格式 */
      CREATE VIEW <视图名>[(<列名>[,<列名>]...)]
      AS <子查询>  /* 子查询可以是任意的SELECT语句 */
      [WITH CHECK OPTION]; 
      /* 对视图进行UPDATE、INSERT、DELETE时要保证满足视图定义中的谓词条件(即子查询中的条件表达式) */ 
      
      /* 建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 */
      CREATE VIEW IS_Student
      AS
      SELECT Sno, Sname, Sage
      FROM Student
      WHERE Sdept = 'IS'
      WITH CHECK OPTION; /* 检查是不是还在信息系里 */
    

    [注]:由于在定义IS_Student视图时,加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,关系数据库管理系统会自动加上Sdept='IS'的条件。

      /* 建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩) */
      CREATE VIEW IS_S1(Sno, Sname, Grade) 
      AS
      SELECT Student.Sno, Sname, Grade
      FROM Student, SC
      WHERE Sdept= 'IS' AND 
            Student.Sno = SC.Sno AND 
            SC.Cno = '1';
    

    [注]:由于视图IS_S1的属性列中包含了Student表和SC表同名列Sno,所以必须在视图名后说明视图的各个属性名

      /* 建立信息系选修了1号课程且成绩在90分以上的学生的视图 */
      CREATE VIEW IS_S2
      AS
      SELECT Sno, Sname, Grade
      FROM IS_S1
      WHERE Grade >= 90;
    

    [注]:视图可以建立在一个或多个已定义好的视图上,或建立在基本表与视图之上。这里的视图IS_S2就是建立在视图IS_S1之上的。

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

    [注]:由基本数据经各种计算派生出的数据一般是不存储的,这些派生属性由于在基本表中并不实际存在,称为虚拟列。带虚拟列的视图也称带表达式的视图

      /* 将学生的学号及平均成绩定义为一个视图 */
      /* 列平均成绩是通过聚集函数得到的,所以S_G视图必须指明各属性列名*/
      CREATE VIEW S_G(Sno, Gavg) 
      AS
      SELECT Sno, AVG(Grade)
      FROM SC
      GROUP BY Sno;
    

    [注]:用带有聚集函数和GROUP BY子句的查询来定义视图,这种视图称为分组视图

      /* 将Student表中所有女生记录定义为一个视图 */
      CREATE VIEW F_Student(F_sno, name, sex, age, dept)
      AS
      SELECT *
      FROM Student
      WHERE Ssex = '女';
    

    [注]:F_Student视图的属性列与Student表的属性列一一对应。如果修改了基本表Student的结构,与视图的映像关系就会被破坏,该视图就不能正常工作了。因此,最好在修改基本表之后删除由该基本表导出的视图,然后重建这个视图

    II. 删除视图

     /* 级联删除 */
      DROP VIEW <视图名> [CASCADE];
    
      DROP VIEW BT_S;  /* 成功执行 */
      DROP VIEW IS_S1; /* 拒绝执行,由于IS_S1视图上还导出了IS_S2 */
      
      DROP VIEW IS_S1 CASCADE; /* 删除了IS_S1和由它导出的所有视图 */
    
  • 查询视图

    /* 在信息系学生的视图中找出年龄小于20岁的学生 */
    SELECT Sno, Sage
    FROM IS_Student
    WHERE Sage < 20;
    
    /* 转换后的查询语句为 */
    SELECT Sno, Sage
    FROM Student
    WHERE Sdept = 'IS' AND Sage < 20;
    
    /* 涉及视图与基本表的连接:查询选修了1号课程的信息系学生 */
    SELECT IS_Student.Sno, Sname
    FROM IS_Student, SC
    WHERE IS_Student.Sno = SC.Sno AND SC.Cno = '1';

[注]:目前多数关系数据库系统对行列子集视图的查询均能进行正确转换,但对非行列子集视图的查询就不一定能做转换了。如P125 例3.94。

  • 更新视图

更新视图是指通过视图来插入、删除和修改数据。由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新

    /* 为信息系学生视图IS_Student中某学生修改姓名 */
    UPDATE IS_Student
    SET Sname = '刘辰'
    WHERE Sno = '201215122';
    
    /* 转换后的更新语句为 */
    UPDATE Student
    SET Sname = '刘辰'
    WHERE Sno = '201215122' AND Sdept = 'IS';
    /* 向信息系学生视图IS_Student中插入一个新的学生记录 */
    INSERT
    INTO IS_Student
    VALUES('201215129','赵信',20);
    
    /* 转换后的插入语句为 */
    INSERT
    INTO Student(Sno, Sname, Sage, Sdept)
    VALUES('201215129','赵信',20,'IS'); /* 系统自动将系名'IS'放入VALUES子句中 */

[注]:在关系数据库中,并不是所有视图都可更新。一般地,行列子集视图是可更新的。

例如,如果想将视图S_G中学号为'201215128'的学生的平均成绩改为90分,SQL语句如下:

    UPDATE
    SET Gavg = 90
    WHERE Sno = '201215128';

对这个视图的更新无法转换为对基本表SC的更新的。因为系统无法修改各科成绩,以使平均成绩为90。所以S_G视图是不可更新的。

  • 视图的作用

视图能够简化用户的操作:
用户所做的只是对一张虚表的查询,而虚表如何而来,用户无需了解。

视图使用户能以多种角度看待同一数据。

视图对重构数据库提供了一定程度的逻辑独立性:数据的逻辑独立性指的是当数据库重构造时,如增加新的关系或原有关系增加新字段,用户的应用程序不会受影响。

视图能够对机密数据提供安全保护:对不同用户定义不同视图,如在Student表上定义n个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本院系学生视图。

适当利用视图可以更清晰地表达查询:如对每个同学找出他获得最高成绩的课程号,可以先定义一个视图,求出每个同学获得的最高成绩,再进行查询。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容