单表查询

SELECT ? FROM ? WHERE ?

连接查询

  • 同时涉及多个表的查询

  • 连接操作方法

    • 循环嵌套法 连接 表1 表2
    • 在 表1 中找到第一个元组
    • 从头扫描 表2 查找满足连接条件元组
    • 符合条件进行连接
    • 查找完 表2 后,查找 表1 的第二个元组
    • 重复操作
    • 排序合并法
    • 首先按连接属性对表排序
    • 执行循环嵌套(剪枝)
  • 连接类型:
    • 等值连接

    • SELECT Student.\*, SC.\* FROM Student, SC WHERE Student.Sno = SC.Sno;
      
    • 自然连接

    • SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
      From Student, SC
      WHERE Student,Sno = SC.Sno;
      
    • 非等值连接(> <)

    • 自身连接

    • 需要给表起别名以示区别

    • 必须使用别名前缀

    • SELECT FIRST.Cno, SECOND.Cpno
      FROM Course FIRST, Course SECOND
      WHERE FIRST.Cpno = SECOND.Cno;
      
    • 外连接与普通连接

    • 外连接中参与连接的表有主从之分,主表中不满足连接条件的相应列填 NULL

    • ... FROM LEFT JOIN SC ON (...)
      
    • 左外连接,右外连接,全连接

    • 复合条件连接

    • ... WHERE ?=? AND ?=? AND ?>?;
      

嵌套查询

  • 查询块的嵌套

  • SELECT Sname
    FROM Student
    WHERE Sno IN
    (SELECT Sno
      FROM SC
      WHERE Cno='2');
    
  • 子查询不能使用 ORDER BY

  • 有些嵌套查询可以用连接运算替代

  • 不相关子查询 子查询条件不依赖父查询

  • IN 比较运算符 ANY(SOME)ALL EXISTS

  • /*相关子查询*/
    SELECT Sno, Cno
    FROM SC x
    WHERE Grade >= (SELECT AVG(Grade)
                 FROM SC y
                 WHERE y.Sno = x.Sno);
    
  • SELECT Sname, Sage
    FROM Student
    WHERE Sage < ANY(SELECT Sage
                  FROM Student
                  WHERE Sdept='CS')
                  AND Sdept <> 'CS';