关系数据库标准语言——SQL.ppt_第1页
关系数据库标准语言——SQL.ppt_第2页
关系数据库标准语言——SQL.ppt_第3页
关系数据库标准语言——SQL.ppt_第4页
关系数据库标准语言——SQL.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2019/8/9,数据库系统原理,韶关学院计算机科学与技术系,第5章 关系数据库标准语言SQL,5.1 SQL概述及特点 5.2 数据定义语句 5.3 数据查询语句 5.4 数据更新语句 5.5 嵌入式SQL 5.6 数据控制机制和语句,5.1 SQL概述及特点,1. SQL的主要功能 (1) 数据定义功能 定义关系数据库的模式、外模式和内模式,以实现对基本表、视图以及索引文件的定义、修改和删除等操作。 (2) 数据操纵功能 包括数据查询和数据更新两种数据操作语句:数据查询指对数据库中的数据查询、统计、分组、排序操作;数据更新指数据的插入、删除、修改等数据维护操作。 (3) 数据控制功能 通过对数据库用户的授权和收权命令来实现有关数据的存取控制,以保证数据库的安全性。,2. SQL的特点,(1) SQL具有自含式和嵌入式两种形式。 (2) SQL具有语言简洁、易学易用的特点。 (3) SQL支持三级模式结构。 全体基本表构成了数据库的模式。 视图和部分基本表构成了数据库的外模式。 数据库的存储文件和它们的索引文件构成了关系数据库的内模式。,5.2 数据定义语句,5.2.1 基本表的定义和维护 1. 定义基本表 定义基本表语句的一般格式为: CREATE TABLE 库名表名( 列名数据类型列级完整性约束条件 , 列名数据类型列级完整性约束条件 ,n ,表级完整性约束条件 ,n );,(1) SQL支持的数据类型,(2) 列级完整性的约束条件,针对属性值设置的限制条件。 1) NOT NULL或NULL约束。NOT NULL约束不允许字段值为空,而NULL约束允许字段值为空。 2) UNIQUE约束。惟一性约束,即不允许列中出现重复的属性值。 3) DEFAULT约束。默认值约束。 DEFAULT约束名默认值FOR列名 4) CHECK约束。检查约束。 CONSTRAINT约束名CHECK (约束条件表达式),(3) 表级完整性约束条件,涉及到关系中多个列的限制条件。 1) UNIQUE约束。惟一性约束。 2) PRIMARY KEY约束。定义主码,保证惟一性和非空性。 CONTRAINT约束名PRIMARY KEY CLUSTERED (列组) 3) FOREIGN KEY约束。用于定义参照完整性。 CONTRAINT约束名FOREIGN KEY(外码) REFERENCES被参照表名(与外码对应的主码名),CREATE TABLE 学生(学号 CHAR(5) NOT NULL UNIQUE, 姓名 CHAR(8) NOT NULL,年龄 SMALLINT, 性别 CHAR(2),所在系 CHAR(20), DEFAULT C1 20 FOR 年龄, CONSTRAINT C2 CHECK(性别 IN (男,女); CREATE TABLE 课程(课程号 CHAR(5) PRIMARY KEY, 课程名 CHAR(20),先行课 CHAR(5); CREATE TABLE 选课(学号 CHAR(5),课程号 CHAR(5), 成绩 SMALLINT, CONSTRAINT C3 CHECK(成绩 BETWEEN 0 AND 100), CONSTRAINT C4 PRIMARY KEY(学号,课程号), CONSTRAINT C5 FOREIGN KEY(学号) REFERENCES 学生(学号), CONSTRAINT C6 FOREIGN KEY(课程号) REFERENCES 课程(课程号);,【例5-1】,建立基本表: 学生(学号,姓名,年龄,性别,所在系); 课程(课程号,课程名,先行课); 选课(学号,课程号,成绩).,2. 修改基本表和删除基本表,ALTER TABLE表名 ADD(新列名数据类型完整性约束 ,n) DROP完整性约束名 MODIFY(列名数据类型,n); (1) 使用ADD子句增加新列 【例5-2】向课程表中增加“学时”字段。 ALTER TABLE 课程 ADD 学时 SMALLINT; (2) 使用MODIFY子句修改列的原定义 (3) 使用DROP子句删除指定的完整性约束条件 【例5-3】删除学生表中对年龄的默认值的定义。 ALTER TABLE 学生 DROP C1; 删除基本表的一般格式为: DROP TABLE表名;,5.2.2 索引的定义和维护,1. 索引的作用 1) 使用索引可以明显地加快数据查询的速度。 2) 使用索引可保证数据的惟一性。 3) 使用索引可以加快连接速度。 2. 建立索引的原则 1) 索引的建立和维护由DBA和DBMS完成。 2) 大表应当建索引,小表则不必建索引。 3) 对于一个基本表,不要建立过多的索引。 4) 根据查询要求建索引。,3. 建立和删除索引的格式,建立格式为: CREATE UNIQUE CLUSTER INDEX索引名 ON表名(列名次序,列名次序); 删除索引格式为: DROP INDEX 索引名; 【例5-4】为学生_课程数据库中的学生、课程和选课三个表建立索引。其中,学生表按学号升序建立索引;课程表按课程号升序建惟一索引;选课表按学号升序和课程号降序建惟一索引。 CREATE UNIQUE INDEX 学号ON 学生(学号); CREATE UNIQUE INDEX 课程号 ON 课程(课程号); CREATE UNIQUE INDEX 选课号 ON 选课(学号 ASC,课程号 DESC);,5.2.3 视图的定义和维护,1. 视图的优点 1) 视图能够简化用户的操作。 2) 视图机制可以使用户以不同的方式看待同一数据。 3) 视图对数据库的重构提供了一定程度的逻辑独立性。 4) 视图可以对机密的数据提供安全保护。 2. 视图定义的格式 一般格式为: CREATE VIEW视图名(列名组) AS子查询 WITH CHECK OPTION;,视图举例,【例5-6】建立计算机系学生的视图。 CREATE VIEW 计算机系学生 AS SELECT 学号,姓名,年龄 FROM 学生 WHERE 所在系=计算机系; 【例5-7】由学生、课程和选课三个表,定义一个计算机系的学生成绩视图,其属性包括学号、姓名、课程名和成绩。 CREATE VIEW 学生成绩(学号,姓名,课程名,成绩) AS SELECT 学生.学号,学生.姓名,课程.课程名,选课.成绩 FORM 学生,课程,选课 WHERE 学生.学号=选课.学号 AND 程.课程名=选课.课程号 AND 学生.所在系=计算机系;,3. 视图的删除 、查询和维护,视图删除语句的一般格式为: DROP VIEW视图名; 视图可以和基本表一样被查询,其使用方法与基本表相同,但利用视图进行数据增、删、改操作,会受到一定的限制。,5.3 数据查询语句,5.3.1 数据查询的基本语法 1. SELECT语句的语法 SELECT目标列组 FROM数据源 WHERE元组选择条件 GROUP BY分列组HAVING 组选择条件 ORDER BY排序列1排序要求1 ,n;,语法说明,(1) SELECT子句:指明目标列(字段、表达式、函数表达式、常量)。基本表中相同的列名表示为:表名.列名 (2) FROM子句:指明数据源。表间用“,”分割。数据源不在当前数据库中,使用“数据库名.表名”表示。一表多用,用别名标识。定义表别名:表名别名 (3) WHERE子句:元组选择条件。 (4) GROUP BY子句:结果集分组。当目标列中有统计函数,则统计为分组统计,否则为对整个结果集统计。子句后带上HAVING子句表达组选择条件(带函数的表达式)。 (5) ORDER BY子句:排序。当排序要求为ASC时升序排序;排序要求为DESC时降序排列。,2. SELECT语句的操作符,(1) 算术操作符 +(加号)、(减号)、*(乘号)和 /(除号)。 (2) 比较操作符 =(等于)、(大于)、=(大于等于)、!=(不等于)、(小于大于)、!(不大于)和 !(不小于),共9种操作符。,(3) 逻辑操作符,(4) 组合查询操作符和其他SQL操作符,查询1组合操作符查询2 1) UNION:并查询,并在结果集中去掉重复行。 2) MINUS:差查询操作。 3) INTERSECT:交查询操作。 4) *:取全部字段。格式为: * 或表名.* 5) ALL:全部。保留重复值(有统计函数时要求计算重复值)。 格式为: ALL字段或 ALL字段组 6) DISTINCT:去掉重复值。在结果集中去掉重复值,或在统计函数中不计重复值。 格式为: DISTINCT字段或 DISTINCT字段组,5.3.2 数据查询实例,学生课程库结构为:学生(学号,姓名,年龄,所在系); 课程(课程号,课程名,先行课); 选课(学号,课程号,成绩). 1. 简单查询:查询过程中只涉及到一个表的查询语句。 【例5-9】求数学系学生的学号和姓名。 SELECT 学号,姓名 FROM 学生 WHERE 所在系=数学系; 【例5-10】求选修了课程的学生学号。 SELECT DISTINCT 学号 FROM 选课;,例子,【例5-11】求选修C1课程的学生学号和成绩,并要求对查询结果按成绩的降序排列,如果成绩相同则按学号的升序排列。 SELECT 学号,成绩 FROM 选课 WHERE 课程号=C1 ORDER BY 成绩 DESC,学号 ASC; 【例5-12】求选修课程C1且成绩在8090之间的学生学号和成绩,并将成绩乘以系数0.8输出。 SELECT 学号,成绩*0.8 FROM 选课 WHERE 课程号 = C1 AND 成绩 BETWEEN 80 AND 90;,例子,【例5-13】求数学系或计算机系姓张的学生的信息。 SELECT * FROM 学生 WHERE 所在系 IN ( 数学系,计算机系 ) AND 姓名 LIKE 张%; 【例5-14】求缺少了成绩的学生的学号和课程号。 SELECT 学号,课程号 FROM 选课 WHERE 成绩 IS NULL;,2. 连接查询,连接查询中的连接条件通过WHERE子句表达,连接条件和元组选择条件之间用AND(与)操作符衔接。 (1) 等值连接和非等值连接 表名1.列名1比较运算符表名2.列名2 比较运算符:=、=、= 和!=;列名称为连接字段。 【例5-15】查询每个学生的情况以及他(她)所选修的课程。 SELECT 学生.*,选课.* FROM 学生,选课 WHERE 学生.学号=选课.学号;,例子,【例5-16】求学生的学号、姓名、选修的课程名及成绩。 SELECT 学生.学号,姓名,课程名,成绩 FROM 学生,课程,选课 WHERE 学生.学号=选课.学号 AND 课程.课程号=选课.课程号; 【例5-17】求选修C1课程且成绩为90分以上的学生学号、姓名及成绩。 SELECT 学生.学号,姓名,成绩 FROM 学生,选课 WHERE 学生.学号=选课.学号 AND 课程号=C1AND 成绩90;,例子,(2) 自身连接 例如,课程表中的先行课是在上学期应开设的,先行课的先行课,即间接先行课应提前一学年开设。如果求查询某门课的间接先行课或全部课程的间接先行课,就需要对课程表进行自身连接。,课程的先行关系链为:C5C4C3C2C1, 课程的间接关系链为:C5C3C1。,A,B,结果,【例5-18】,查询每一门课的间接先行课。 SELECT A.课程号,A.课程名,B.先行课 FROM 课程 A,课程 B WHERE A.先行课=B.课程号,(3) 外部连接,左外部连接操作是在结果集中保留连接表达式左表中的非匹配记录;右外部连接操作是在结果集中保留连接表达式右表中的非匹配记录。外部连接符号为“*=”,右外部连接符号为“=*”。外部连接中不匹配的分量用NULL表示。,职工表 部门表,连接的结果集,内连接的结果集,左外部连接的结果集,内连接: SELECT 职工.*,部门名称,电话 FROM 职工,部门 WHERE 职工.所在部门= 部门.部门号; 左外部连接: SELECT 职工.*,部门名称,电话 FROM 职工,部门 WHERE 职工.所在部门*= 部门.部门号; 右外部连接: SELECT 职工.*,部门名称,电话 FROM 职工,部门 WHERE 职工.所在部门 =*部门.部门号;,【例5-19】,用SQL表达职工和部门之间的内连接、左外部连接和右外部连接的语句,3. 嵌套查询,使用IN操作符的嵌套查询 【例5-20】求选修了高等数学的学生学号和姓名。 SELECT 学号,姓名 FROM 学生 WHERE 学号 IN ( SELECT 学号 FROM 选课 WHERE 课程号 IN ( SELECT 课程号 FROM 课程 WHERE 课程名=高等数学 ); 该题也可以使用下面的连接查询表达。 SELECT 学生.学号,姓名 FROM 学生,课程,选课 WHERE 学生.学号=课程.学号 AND 课程.课程号=选课.课程号 AND 课程.课程名=高等数学;,(2) 使用比较符的嵌套查询,【例5-21】求C1课程的成绩高于张三的学生学号和成绩。 SELECT 学号,成绩 FROM 选课 WHERE 课程号=C1 AND 成绩 ( SELEC 成绩 FROM 选课 WHERE 课程号=C1AND 学号= (SELECT 学号 FROM 学生 WHERE 姓名=张三);,(3) 使用ANY或ALL操作符的嵌套查询,格式为:字段比较符ANY|ALL子查询,例子,【例5-22】求其他系中比计算机系某一学生年龄小的学生。 SELECT * FROM 学生 WHERE 年龄 计算机系; 【例5-23】求其他系中比计算机系学生年龄都小的学生。 SELECT * FROM 学生 WHERE 年龄 计算机系;,(4) 使用EXISTS操作符的嵌套查询,【例5-24】求选修了C2课程的学生姓名。 SELECT 姓名 FROM 学生 WHERE EXISTS (SELECT * FROM 选课 WHERE 学生.学号=学号 AND 课程号=C2); 【例5-25】求没有选修C2课程的学生姓名。 SELECT 姓名 FROM 学生 WHERE NOT EXISTS (SELECT * FROM 选课 WHERE 学生.学号=学号 AND 课程号=C2);,例子,【例5-26】查询选修了全部课程的学生的姓名。 SELECT 姓名 FROM 学生 WHERE NOT EXISTS (SELECT * FROM 课程 WHERE NOT EXISTS (SELECT * FROM 选课 WHERE 学生.学号=学号 AND 课程.课程号=课程号);,例子,【例5-27】求至少选修了学号为“S2”的学生所选修的全部课程的学生学号和姓名。 SELECT 学号,姓名 FROM 学生 WHERE NOT EXISTS (SELECT * FROM 选课 选课1 WHERE 选课1.学号=S2 AND NOT EXISTS (SELECT * FROM 选课 选课2 WHERE 学生.学号=选课2.学号 AND 选课2 .课程号=选课1.课程号);,4. 组合查询,【例5-28】求选修了C1课程或选修了C2课程的学生学号。 SELECT 学号 FROM 选课 WHERE 课程号=C1 UNION SELECT 学号 FROM 选课 WHERE 课程号=C2 【例5-29】求选修C1课程,并且也选修C2课程的学生学号。 SELECT 学号 FROM 选课 WHERE 课程号=C1 INTERSECT SELECT 学号 FROM 选课 WHERE 课程号=C2;,【例5-30】求选修了C1课程但没有选修C2课程的学生学号。,SELECT 学号 FROM 选课 WHERE 课程号=C1 MINUS SELECT 学号 FROM 选课 WHERE 课程号=C2; 本例也可以用下面的EXISTS嵌套查询表示。 SELECT 学号 FROM 选课 选课1 WHERE 课程号=C1 AND NOT EXISTS (SELECT 学号 FROM 选课 选课2 WHERE 选课1.学号=选课2.学号 AND 选课2.课程号=C2);,5. 使用分组和SQL函数查询,【例5-31】求学生的总人数。 SELECT COUNT (*) FROM 学生;,例子,【例5-32】求选修了课程的学生人数。 SELECT COUNT(DISTINCT 学号) FROM 选课; 【例5-33】求课程和选修该课程的人数。 SELECT 课程号,COUNT(学号) FROM 选课 GROUP BY 课程号; 【例5-34】求选修课超过3门课的学生学号。 SELECT 学号 FROM 选课 GROUP BY 学号 HAVING COUNT(*)3;,5.4 数据更新语句,5.4.1 数据插入语句 1. 使用常量插入单个元组 格式为: INSERT INTO表名(属性列1,属性列2) VALUES (常量1,常量2);,例子,【例5-35】将一个新学生记录(学号:98010,姓名:张三,年龄:20,所在系:计算机系 )插入到学生表中。 INSERT INTO 学生 VALUES (98010,张三,20,计算机系); 【例5-36】插入一条选课记录(学号:98011,课程号:C10,成绩不详)。 INSERT INTO 选课 (学号,课程号) VALUES (98011,C10);,2. 在表中插入子查询的结果集,INSERT INTO表名(属性列1,属性列2) 子查询; 【例5-37】求每个系学生的平均年龄,把结果存入数据库中。 CREATE TABLE 系平均年龄 (系名称CHAR(20), 平均年龄SMALLINT); INSERT INTO 系平均年龄 SELECT 所在系,AVG(ALL年龄) FROM 学生 GROUP BY 所在系;,5.4.2 数据修改语句,UPDATE表名 SET列名=表达式,列名=表达式,n WHERE条件; 【例5-38】将学生表中全部学生的年龄加上2岁。 UPDATE 学生 SET 年龄=年龄+2; 【例5-39】将选课表中的数据库课程的成绩乘以1.2。 UPDATE 选课 SET 成绩= 成绩*1.2 WHERE 课程号= (SELECT 课程号 FROM 课程 WHERE 课程名= 数据库 );,5.4.3 数据删除语句,DELETE FROM表名 WHERE条件; 【例5-40】删除艺术系的学生记录及选课记录。 DELETE FROM 选课 WHERE 学号 IN (SELECT 学号 FROM 学生 WHERE 所在系=艺术系); DELETE FROM 学生 WHERE 所在系=艺术系;,5.5 嵌入式SQL,5.5.1 嵌入式SQL的特点 1. 嵌入式SQL应注意的问题 1) SQL和主语言的配合问题。2) 合理选择主语言。 2. SQL嵌入主语言时必须解决的三个问题 (1) 如何区别SQL和主语言 (2) 使数据库的工作单元与程序工作单元之间能够通信 1) 主语言通过主变量向SQL语句提供参数。 2) SQL语句的当前工作状态和运行环境数据要返馈给应用程序。 (3) 使用游标解决SQL一次一集合的操作与主语言一次一记录操作的矛盾,5.5.2 不用游标的SQL语句,1. 几种不需要使用游标的SQL语句 (1) 用于说明主变量的说明性语句 SQL的说明性语句主要有两条: EXEC SQL BEGIN DECLARE SECTION; EXEC SQL END DECLARE SECTION; (2) 数据定义和数据控制语句 (3) 查询结果为单记录的查询语句 (4) 数据的插入语句和某些数据删除、修改语句 独立的数据删除和修改语句不需要使用游标;与查询语句配合,删除或修改查询到的当前记录的操作,与游标有关。,2. 不用游标的查询语句,EXEC SQL SELECT ALL|DISTINCT目标列表达式,n INTO主变量指示变量,n FROM表名或视图名,n WHERE条件表达式; 1) 在语句开始前要加EXEC SQL前缀。 2) 该查询语句中又扩充了INTO子句。 3) 在WHERE子句的条件表达式中可以使用主变量。 4) 由于查询的结果集中只有一条记录,该语句中不必有排序和分组子句。 5) INTO子句中的主变量后面跟有指示变量时:结果列值为NULL,指示变量为负值,结果列不向该主变量赋值;传递正常,指示变量的值为0;主变量宽度不够,则指示变量的值为数据截断前的宽度。,例子,【例5-41】查询学号为主变量givesno、课号为主变量givecno的值的学生选课记录。 EXEC SQL SELECT 学号,课程号,成绩 INTO :Sno,:Cno,:grade :gradeid FROM 选课 WHERE 学号= :givesno AND 课程号= :givecno; 3. 不用游标的数据维护语句 (1) 不用游标的数据删除语句 【例5-42】删除学号由主变量Sno决定的学生记录。 EXEC SQL DELETE FROM 学生 WHERE 学号= :Sno;,(2) 不用游标的数据修改语句,【例5-43】将计算机系所有学生的年龄都加上主变量Raise。 EXEC SQL UPDATE 学生 SET 年龄=年龄+:Raise WHERE 所在系=计算机系; 【例5-44】将计算机系学生的年龄置空。 Raiseid=-1 EXEC SQL UPDATE 学生 SET 年龄=年龄+:Raise :Raiseid; (3) 不用游标的数据插入语句 【例5-45】将学号为主变量Sno、课程号为Cno的选课记录,插到库中。 EXEC SQL INSERT INTO 选课 VALUES (:Sno, :Cno);,5.5.3 使用游标的SQL,(1) 定义游标命令 EXEC SQL DECLARE游标名CURSOR FOR子查询 FOR UPDATE OF字段名1,n; 删除和修改数据的语句中,WHERE为: WHERE CURRENT OF游标名 【例5-46】定义按主变量DEPT查询系里学生的游标。 EXEC SQL DECLARE SX CURSOR FOR SELECT * FROM 学生 WHERE 所在系= :DEPT;,(2) 打开、推进和关闭游标命令,EXEC SQL OPEN 游标名; 执行对应的查询语句,并将游标指向结果集的第一条记录前。打开的游标处于活动状态,可以被推进。 EXEC SQL FETCH游标名INTO主变量组; 将游标下移一行,读出当前的记录,将当前记

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论