文档详情

第四讲 结构化查询语言.ppt

发布:2017-05-29约1.21万字共88页下载文档
文本预览下载声明
4. 联接操作 联接条件可在WHERE中指定,也可以在 FROM子句中指定。 ?把课程名为”数据库原理”的成绩从表SC中删除. DELETE FROM SC WHERE CNO IN (SELECT CNO FROM C WHERE CNAME=数据库原理); ?把课程名为”数据库原理”的成绩提高10%. UPDATE SC SET GRADE=1.1*GRADE WHERE CNO IN (SELECT CNO FROM C WHERE CNAME=数据库原理); ③ 引入游标机制: 将集合操作转换为单元组处理。 SQL的执行是面向集合的,一条SQL语句原则上可以产 生或处理多条记录。 宿主语言是面向记录的,一组主变量一次只能存放 一条记录。 为此引入游标来协调SQL语言与主语言的 不同数据处理方式。 二、与游标有关的语句: ① 定义游标语句( DECLARE ) 游标是与某一查询结果相联系的符号名。 EXEC SQL DECLARE 游标名 CURSOR FOR SELECT语句 [FOR UPDATE [OF 字段名1 ,…,字段名n]]; END_EXEC 这是一个说明语句,定义中的SELECT语句并不立即执行。 EXEC SQL DECLARE scx CURSOR FOR SELECT SNO,CNO,GRADE FROM SC WHERE SNO=(SELECT SNO FROM S WHERE SNAME=:givensname) FOR UPDATE OF GRADE; 第二种情况:SELECT语句中未使用分组子句,但在SELECT子句中使用了聚合操作,此时SELECT子句的语义是对查询结果执行聚合操作。如: SELECT COUNT(*) count_男,AVG(AGE) avg_age FROM S WHERE SEX=男; 该语句是求男同学的人数和平均年龄。 第三种情况:SELECT语句使用了分组子句和聚合操作,此时SELECT子句的语义是对查询结果的每一分组去做聚合操作。如: SELECT AGE,COUNT(*) count FROM S WHERE SEX=男 GROUP BY AGE; 该语句是求男同学每一年龄的人数。 注意: ? 通常SELECT语句中使用了分组子句就会有聚合操作。 但执行聚合操作不一定要用分组子句。 如:求男同学的人数,此时聚合值只有一个,因此不必分组。 ? 但同一个聚合操作的值有多个时,必须使用分组子句。 如:求每一年龄的学生人数。此时聚合值有多个, 与年龄有关,因此必须分组。 在 FROM 子句中指定联接条件时,SQL2将 联接操作符分成: 联接类型、联接条件。 联接类型:决定了如何处理联接条件中不匹配的元组。 联接条件:决定了两个关系中哪些元组应该匹配。 联接类型中的OUTER字样可不写。 交叉联接: CROSS JOIN 完全外联接: FULL OUTER JOIN 右外联接: RIGHT OUTER JOIN 左外联接: LEFT OUTER JOIN 内联接: INNER JOIN 联接类型说明 联接类型 结果为两个联接表中匹配行的联接。 结果包括“左”表(出现在 JOIN 子 句的最左边)中的所有行。不包括右表中的 不匹配行。 结果包括“右”表(出现在JOIN 子句的最右边)中的所有行。不包括左表中的不匹配行。 结果包括所有联接表中的所有行,不论它们是否匹配 结果包括两个联接表中所有可能的行组合。交叉联接返回的是两个表的笛卡儿积 具体列出两个关系在哪些相应属性上做联接条件比较。联接条件应写在联接类型的右边。 ON 联接条件 联接条件说明 联接条件 举例:检索选修了C1和C3的课程的学生的学号。 SELECT DISTINCT X.SNO FROM SC X INNER JOIN SC Y ON X.SNO = Y.SNO WHERE (X.CNO =‘C1’) AND (Y.CNO =‘C3’); §4 SQL的数据更新
显示全部
相似文档