• 用聚集函数实现查询
    SELECT Sname, Sage
    FROM Student
    WHERE Sage <
    (SELECT MAX(Sage)
      FROM Student
      WHERE Sdept="CS")
    AND Sdept <> "CS";
    
  • 带 EXISTS 谓词的子查询
    • 代表存在量词
    • 不返回数据,只返回 True 或 False
    • 若结果非空,返回真
    • 若结果为空,返回假
    • 目标列表达式通常用 *
    • NOT EXISTS 与之相反
  • 查询选修了一号课程的学生姓名
    SELECT Sname
    FROM Student
    WHERE EXISTS
    (SELECT *
      FROM SC
      WHERE Sno=Student.Sno AND Cno='1');
    
    SELECT Sname
    FROM Student, SC
    WHERE Student.Sno=SC.Sno AND SC.Cno='1';
    
  • 所有带有 IN 不等号 AND 的子查询都能够用带 EXIST 的子查询等价替换

  • sql中没有全称量词,用 EXIST 替换

  • 查询选修了全部课程的学生姓名

    SELECT Sname
    FROM Student
    WHERE NOT EXISTS
    (SELECT *
      FROM Course
      WHERE NOT EXISTS
        (SELECT *
          FROM SC
          WHERE Sno = Student.Sno
          AND Cno = Course.Cno));
    
  • 逻辑蕴含

    选择选了某同学所有课程的学生

    SELECT DISTINCT Sno
    FROM SC SCX
    WHERE NOT EXISTS
    (SELECT *
      FROM SC SCY
      WHERE SCY.Sno = '200215122'
      AND NOT EXISTS(
            SELECT *
            FROM SC SCZ
            WHERE SCZ.Sno = SCX.Sno
            AND SCZ.Cno = SCY.Cno));
    

集合查询

  • 集合操作
    • 并集 交集 差集
    SELECT *
    ...
    
    UNION / EXCEPT / ...
    
    SELECT *
    ...
    

数据更新

  • 插入,修改,删除
    • 插入数据

    • 插入元组

      INSERT
      INTO 表名(列名,列名,列名)
      VALUES (值,值,值)
      
      • 元素值顺序无要求
      • values必须匹配
    • 插入子查询结果
      INSERT
      INTO 表名(列名,列名,列名)
      SELECT 列名,列名,列名
      ...
      
    • 修改数据

    UPDATE Student
    SET Sage = 22
    WHERE Sno = '200215121'
    
    UPDATE Student
    SET Sage = Sage+1
    
    UPDATE SC
    SET Grade = 0
    WHERE 'CS' =
        (SELECT Sdept
        FROM Student
        WHERE Student.Sno = SC.Sno)
    
    • 视图

    • 可以简化用户的操作

    • 为重构数据库提供了一定程度的逻辑独立性

    • 是一张虚表

    • 从一个或几个基本表中导出

    • 只存放定义,不存放数据

    • 当基表数据变化,将同步变化

      /*建立视图*/
      CREATE VIEW IS_Student
      AS
      SELECT Sno, Sname, Sage
      FROM Student
      WHERE Sdept='IS'
      WITH CHECK OPTION
      /*需要保留select条件*/
      
    • 只包含某些行列:行列子集视图

    • 基于多个基表/视图

      CREATE VIEW IS_S1(Sno, Sname, ..)
      ..
      FROM 多个基表/视图
      
    • 带有表达式,分组查询

    • 不指定属性列

    • 更新视图