《关系数据库标准语言SQL.pdf》由会员分享,可在线阅读,更多相关《关系数据库标准语言SQL.pdf(110页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2013年4月24日2013年4月24日1 1关系数据库标准语言SQL2013年4月24日2013年4月24日2 2要点SQL 语言简介SQL 语言及其使用方式独立式 SQL嵌入式 SQL2013年4月24日2013年4月24日3 33.1 SQL 概述Structured Query Language,1974 年被提出关系数据库的国际标准语言:大多数数据库均用SQL 作为共同的数据存取语言和标准接口,实现不同数据库系统之间的互操作目前仍被不断扩充介于关系代数和关系演算之间,三者可相互转换2013年4月24日2013年4月24日4 4SQL 的特点综合统一:集 DDL、DML、DCL 功能于
2、一体,可独立完成数据库生命周期中的全部活动,语言风格统一高度非过程化:用户只需提出“做什么”,而无需指明“怎么做”面向集合的操作方式:操作对象、查询结果、更新数据均可以是元组的集合提供两种使用方式:自含式、嵌入式语言简捷,易学易用SQL 功能关键动词数据查询SELECT数据定义CREATE,DROP,ALTER数据操纵INSERT,UPDATE,DELETE数据控制GRANT,REVOKE2013年4月24日2013年4月24日5 5SQL 语言的基本概念SQL 支持关系数据库的三级模式结构 存储文件:组成关系数据库的内模式,对用户透明 基表(Base Table):组成关系数据库的模式,一个
3、关系对应一个基表,一或多个基表对应一个存储文件 视图(View):组成关系数据库的外模式,从一个或多个基表中导出,不独立存储在数据库中SQL视图 1视图 2基本表 1基本表 2基本表 3基本表 4存储文件 1存储文件 2外模式模式内模式2013年4月24日2013年4月24日6 63.2 数据定义SQL 的数据定义语言(DDL)操作对象操作方式创建删除修改基表CREATE TABLEDROP TABLEALTER TABLE视图CREATE VIEWDROP VIEW索引CREATE INDEXDROP INDEX2013年4月24日2013年4月24日7 7定义基表数据类型:不同的数据库系统
4、有自己的数据类型规定,但一般都包括 INTEGER,FLOAT,CHAR(n),VARCHAR(n)等完整性约束条件列级完整性约束条件:涉及表的某一列如对数据类型的约束,对数据格式的约束,对取值范围或集合的约束,对空值 NULL(空值,不知道或不能用的值)的约束,对取值的唯一性 UNIQUE 约束,对列的排序说明等表级完整性约束条件:涉及表的一个或多个列如订货关系中规定发货量不得超过订货量,如教授工资不得低于 1000 元等CREATE TABLE (列级完整性约束 ,列级完整性约束 ,);2013年4月24日2013年4月24日8 8SQL 支持的数据类型SMALLINT 半字长的整数INT
5、 全字长的整数FLOAT 浮点数CHAR(n)长度为n的定长字符串VARCHAR(n)最大长度为n的变长字符串DEC(p,q)十进制数,共p位,小数点后有 q 位DATE 日期型,格式 YYYY-MM-DDTIME 时间型,格式为 HH.MM.SSTIMESTAMP 日-时戳(日期加时间)2013年4月24日2013年4月24日9 9完整性约束CREATE TABLE 的完整性约束NOT NULL 属性值禁止为空UNIQUE 取值唯一PRIMARY KEY(A1,.,An)主码-若干属性列CHECK(P)P为条件表达式SQL-92 以后版本中,一个属性若有 PRIMARY KEY 声明则隐含有
6、 NOT NULL 约束2013年4月24日2013年4月24日1010例:建立学生管理的相关基表CREATE TABLE Student(Sno CHAR(5)NOT NULL UNIQUE,Sname CHAR(20)UNIQUE,Ssex CHAR(1),Sage INTEGER,Sdept CHAR(15);CREATE TABLE SC(Sno CHAR(5)NOT NULL UNIQUE,Cno CHAR(8)NOT NULL UNIQUE,Grade INTEGER);CREATE TABLE Course (Cno CHAR(8)NOT NULL UNIQUE,Cname CH
7、AR(20),Cpno INTEGER,Ccredit INTEGER);2013年4月24日2013年4月24日1111例:建立图书管理的相关基表CREATE TABLE Borrows(CardNo INTEGER NOT NULL UNIQUE,Name CHAR(10),Dept CHAR(20);CREATE TABLE Books(BookNo INTEGER NOT NULL UNIQUE,SortNo CHAR(10),Title CHAR(30),Author CHAR(12),Price FLOAT,LoanNo INTEGER);CREATE TABLE Loans(Ca
8、rdNo INTEGER NOT NULL UNIQUE,BookNo INTEGER NOT NULL UNIQUE,Title CHAR(30),Date CHAR(10);2013年4月24日2013年4月24日1212例:完整性约束CREATE TABLE branch(branch-name char(15)not null,branch-city char(30),assets integer);CREATE TABLE branch(branch-name char(15),branch-city char(30),assets Integer,PRIMARY KEY (bran
9、ch-name),CHECK(assets=0);2013年4月24日2013年4月24日1313修改基表ALTER TABLE ADD 列级完整性约束 DROP MODIFY ;例ALTER TABLE LoansMODIFY Cardno SMALLINT;ALTER TABLE LoansDROP UNIQUE(BookNo);ALTER TABLE Loans ADD XX INT;2013年4月24日2013年4月24日1414删除基本表DROP TABLE ;例DROP TABLE Loans;2013年4月24日2013年4月24日1515建立索引加快检索速度UNIQUE 表示索
10、引的每一个索引值只对应唯一的数据记录CLUSTER:建聚簇索引,即索引项顺序与表中记录的物理顺序一致,一个基表只能建一个聚簇索引ASC(升序,缺省)、DESC(降序)索引建立后由系统使用和维护,不需用户干预CREATE UNIQUE CLUSTER INDEX ON (,);CREATE UNIQUE INDEX IB ON Borrows(CardNo);例CREATE UNIQUE INDEX IS ON Student(Sno);CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);2013年4月24日2013年4月24日1616删除索引DRO
11、P INDEX ;例DROP INDEX IB;DROP INDEX SCno;2013年4月24日2013年4月24日17173.3 查询数据库查询是数据库的核心操作,SQL 提供了基于集合和关系的查询操作,具有丰富的功能和灵活的使用方式一个 SQL 查询的结果是一个关系查询可分为单表查询:查询只涉及一个表连接查询:查询同时涉及两个以上的表嵌套查询:一个查询块嵌套在另一个查询块中视图查询:在视图基础上的查询2013年4月24日2013年4月24日1818SQL 查询语句的格式查询语句的典型格式这个查询与下面的关系代数表达式 等价:A1,A2,.,An(P(r1r2.rm)SELECT ALL
12、|DISTINCT ,FROM,WHERE GROUP BY HAVING ORDER BY ASC|DESC;select A1,A2,.,Anfrom r1,r2,.,rmwhere P2013年4月24日2013年4月24日1919SELECT*FROM Student;3.3.1 单表查询一、选择表中若干列查询指定列:在中指定预查属性查询全部列:在中使用*查询经计算的值:在中可使用常量、表达式、函数等SELECT Sname,Year of Birth is,2013-SageFROM Student;SELECT Sno,SnameFROM Student;2013年4月24日201
13、3年4月24日2020查询实例SELECT Sname,Year of Birth is,2013-Sage,ISLOWER(Sdept)FROM Student;结果为:Sname year of Birth:2013-Sage ISLOWER(Sdept)李勇 Year of Birht:1993 cs 刘晨 Year of Birht:1994 is 王敏 Year of Birht:1995 ma 张立 Year of Birht:1994 is2013年4月24日2013年4月24日2121定义别名用户可以通过指定别名来改变查询结果的列标题,这对于含算术表达式、常量、函数名的目标列表
14、达式尤为有用。例如对于上例,可以定义如下列别名:SELECT Sname NAME,Year of Birth:BIRTH,2013-Sage YEAR,ISLOWER(Sdept)DEPARTMENT FROM Student;结果为:NAME BIRTH YEAR DEPARTMENT -李勇 Year of Birth:1993 cs 刘晨 Year of Birth:1994 if 王敏 Year of Birth:1995 ma 张立 Year of Birth:1994 if2013年4月24日2013年4月24日2222ACCESS 数据库中 SQL 例别名表示:字段 as 别名
15、注:ISLOWER()函数在 access 中无法识别 SELECT Sname as NAME,Year of Birth:as BIRTH,2013-Sage as YEAR,Sdept as DEPARTMENTFROM Student;2013年4月24日2013年4月24日2323二、选择表中若干元组取消取值重复的列:指定 DISTINCT 短语查询满足条件的元组:在 WHERE 子句中指定条件对查询结果排序:使用 ORDER BY使用集函数:COUNT,SUM,AVG,MAX,MIN对查询结果分组:使用 GROUP BY,HAVING2013年4月24日2013年4月24日2424
16、DISTINCT 短语SQL 允许重复的元组/行存在,如果需要去掉重复的元组/行,必须指定 DISTINCT 短语,缺省为 ALL例:查询选修了课程的学生学号结果为:结果为:Sno Sno 95001 95001 95001 95002 95001 95002 95002SELECT DISTINCT SnoFROM SC;SELECT Sno FROM SC;或 SELECT ALL Sno FROM SC;2013年4月24日2013年4月24日2525WHERE 子句查询满足条件的元组:在 WHERE 子句中指定条件WHERE 子句常用的查询条件:查询条件谓 词比较=,=,=,!=,!,
17、!;NOT+上述比较运算符确定范围BETWEEN AND,NOT BETWEEN AND 确定集合IN,NOT IN字符匹配LIKE,NOT LIKE空值IS NULL,IS NOT NULL多重条件AND,OR2013年4月24日2013年4月24日2626Where 子句比较大小SELECT Sname FROM Student WHERE Sdept=CS;SELECT DISTINCT Sno FROM SC WHERE Grade 60;例 查询计算机系全体学生的名单例 查询考试成绩有不及格的学生的学号例 查询所有年龄在 20 岁以下的学生姓名及其年龄SELECT Sname,Sag
18、e SELECT Sname,SageFROM Student FROM StudentWHERE Sage=20;2013年4月24日2013年4月24日2727Where 子句确定范围SELECT Sname,Sdept,SageFROM StudentWHERE Sage BETWEEN 20 AND 40;例 查询年龄在 2040 岁之间的学生姓名、系别和年龄SELECT Sname,Sdept,SageFROM StudentWHERE Sage NOT BETWEEN 20 AND 23;例 查询年龄不在 2023 岁之间的学生姓名、系别和年龄2013年4月24日2013年4月24
19、日2828Where 子句确定集合SELECT Sname,SsexFROM StudentWHERE Sdept IN(IS,MA,CS);例 查询信息系(IS)、数学系(MA)和计算机系(CS)学生的姓名和性别SELECT Sname,SsexFROM StudentWHERE Sdept NOT IN(IS,MA,CS)例 查询除信息系(IS)、数学系(MA)和计算机系(CS)以外其它系学生的姓名和性别2013年4月24日2013年4月24日2929Where 子句字符串匹配谓词 LIKE 可以用来进行字符串的匹配格式:NOT LIKE ESCAPE 匹配串中%代表任意长度的字符串,如
20、a%b:acb,addgb,ab 匹配串中 _ 代表任意单个字符,如 a_b:acb afb例 查询学号为95001 的学生的详细情况:相当于SELECT *FROM StudentWHERE Sno LIKE 95001;SELECT *FROM StudentWHERE Sno=95001;2013年4月24日2013年4月24日3030通配符例子SELECT*FROM StudentWHERE Sname LIKE 刘%;SELECT*FROM StudentWHERE Sname LIKE _ _ 明 _ _;例 查询所有姓刘的学生的详细信息例 查询所有全名为三个字且中间汉字为“明”的
21、学生的详细信息2013年4月24日2013年4月24日3131换码字符例 查询 DB_Design 课程的课程号和学分例 查询以“DB_”开头,且倒数第 3 个字符为 i 的课程的详细情况SELECT Cno,CreditFROM CourseWHERE Cname LIKE DB_Design ESCAPE ;SELECT *FROM CourseWHERE Cname LIKE DB_%i_ _ ESCAPE ;注:ESCAPE 表示 为转义换码字符,紧跟其后的 _ 转义为普通 _ 字符2013年4月24日2013年4月24日3232Where 子句涉及空值的查询SELECT Sno,Cn
22、oFROM SCWHERE Grade IS NULL;SELECT Sno,CnoFROM SCWHERE Grade IS NOT NULL;例:某些学生选修课程后没有参加考试,所以有选修课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号:例 查询所有有成绩的学生学号和课程号注意这里的“IS”不能用等号代替2013年4月24日2013年4月24日3333Where 子句多重条件查询SELECT SnameFROM StudentWHERE Sdept=CS AND Sage 20;SELECT Sname,SsexFROM StudentWHERE Sdept=IS OR Sd
23、ept=MA OR Sdept=CS;例 查询计算机系年龄在 20 岁以下的学生姓名例 查询信息系(IS)、数学系(MA)和计算机系(CS)学生的姓名和性别2013年4月24日2013年4月24日3434练习关系:图书(书号,书名,作者,出版社,单价)BOOK(Bno,Bname,Author,Press,Price)查询“数据库”一书的书号和单价查询单价在 20 至 50 元之间的图书信息查询北京某出版社出版的图书信息查询作者是张一,王二,刘三的书的信息查询所有图书的书号,书名和半价信息查询缺少出版社信息的图书的书号和书名2013年4月24日2013年4月24日3535三、对查询结果排序SE
24、LECT Sno,Grade FROM SCWHERE Cno=3 ORDER BY Grade DESC;SELECT*FROM StudentORDER BY Sdept,Sage DESC;例 查询选修了 3 号课程的学生的学号及其成绩,查询结果按分数的降序排列例 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列(见 mdb 示例)ORDER BY 子句 可对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,缺省值为升序2013年4月24日2013年4月24日3636四、使用集函数COUNT(DISTINCT|ALL*)统计元组个数COUN
25、T(DISTINCT|ALL)统计一列中值的个数SUM(DISTINCT|ALL)计算一列值的总和AVG(DISTINCT|ALL)计算一列值的平均值MAX(DISTINCT|ALL)求一列值中的最大值MIN(DISTINCT|ALL)求一列值中的最小值2013年4月24日2013年4月24日3737实例SELECT COUNT(*)FROM Student;SELECT COUNT(DISTINCT Sno)FROM SC;SELECT AVG(Grade)FROM SCWHERE Cno=1;SELECT MAX(Grade)FROM SCWHERE Cno=1;例 查询学生总人数例 查询
26、选修了课程的学生人数例 计算选修了 1 号课程的学生平均成绩例 查询选修 1 号课程的学生最高分数2013年4月24日2013年4月24日3838五、对查询结果分组GROUP BY 子句将查询结果按某一列或多列分组,值相等的为一组。对查询结果分组的目的是为了细化集函数的作用对象,分组后每个组都有一个函数值如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以是使用 HAVING 短语指定筛选条件2013年4月24日2013年4月24日3939分组实例SELECT Cno,COUNT(Sno)FROM SCGROUP BY Cno;SELECT SnoFROM SCGR
27、OUP BY SnoHAVING COUNT(*)3;例 查询选修了 3 门以上课程的学生学号例 求各个课程号及相应的选课人数2013年4月24日2013年4月24日4040练习数据库模式如下:仓库(仓库号,负责人)货物(货物号,货物名,货物描述)入库记录(货物号,仓库号,数量,入库日期,经办人号)用 SQL 实现以下查询要求:查询仓库中有多少种不同的货物查询每天入库数量的最大值统计 2003 年 3 月 20 日以后每天入库的货物总数量按货物号统计每一种货物在仓库中的总数量查询“A-001”号经办人当日经办的入库记录数2013年4月24日2013年4月24日4141SELECT COUNT(
28、*)FROM 货物;或SELECT COUNT(DISTINCT 货物号)FROM 入库记录;SELECT 入库日期,MAX(数量)FROM 入库记录GROUP BY 入库日期;SELECT 入库日期,SUM(数量)FROM 入库记录GROUP BY 入库日期 HAVING 入库日期 “2003/03/20”;2013年4月24日2013年4月24日4242SELECT 货物号,SUM(数量)FROM 入库记录GROUP BY 货物号;SELECT COUNT(*)FROM 入库记录 WHERE 入库日期=Today()GROUP BY 经办人号 HAVING 经办人号=“A-001”;201
29、3年4月24日2013年4月24日43433.3.2 连接查询 连接(Join)查询 查询涉及两个以上的表(在 FROM 子句中体现)From 子句 对应于关系代数中笛卡儿乘积运算,它给出待扫描的关系/表(指定多个表),给出连接条件 连接查询的类型 等值连接查询 非等值连接查询 自然连接查询 自身连接查询 外连接查询 符合条件连接查询2013年4月24日2013年4月24日4444一、等值与非等值连接查询连接条件的形式.比较运算符:=(等值连接)、=、=、!=连接字段必须是可比的.BETWEEN.AND.连接查询的执行过程 首先在表 1 中找到第一个元组,然后从头开始扫描表 2,逐一查找满足连
30、接条件的元组,找到后就将表 1 中的第一个元组与该元组拼接起来,形成结果表中的一个元组。表 2 全部查找完后,再找表 1中第二个元组,然后再从头开始扫描表 2。重复上述操作,直至表1 中的全部元组都处理完毕为止。2013年4月24日2013年4月24日4545SELECT Student.*,SC.*FROM Student,SCWHERE Student.Sno=SC.Sno;例子例 32 查询每个学生及其选修课程的情况 学生情况存放 Student 表中,学生选课情况存放在SC 表中,所以本查询实际上涉及 Student 与 SC 两个表。通过公共属性 Sno 实现联系表名前缀等值连接使用
31、表名前缀为避免混淆,若属性名在各表中唯一,则可省略连接谓词2013年4月24日2013年4月24日4646自然连接和广义笛卡尔积连接自然连接等值连接的特例在等值连接的基础上将目标列中重复的属性去掉广义笛卡尔积连接不带连接条件的连接结果是两表中元组的交叉乘积2013年4月24日2013年4月24日4747SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROM Student,SCWHERE Student.Sno=SC.Sno;SELECT Student.*,SC.*FROM Student,SC;例 查询每个学生及其选修课程的情况自然连接
32、广义笛卡尔积连接2013年4月24日2013年4月24日4848二、自身连接一个表与其自己进行连接SELECT FIRST.Cno,SECOND.CpnoFROM Course FIRST,Course SECONDWHERE FIRST.Cpno=SECOND.Cno;别名例 查询每一门课的间接先修课见 P104 表2013年4月24日2013年4月24日4949实例SELECT S1.SnameFROM Student S1,Student S2WHERE S1.Sdept=S2.Sdept AND S2.Sname=刘晨;例 查询与“刘晨”在同一个系学习的学生2013年4月24日2013
33、年4月24日5050三、复合条件连接WHERE 子句中有多个连接条件SELECT Student.Sno,SnameFROM Student,SCWHERE Student.Sno=SC.Sno AND SC.Cno=2 AND SC.Grade 90;例 查询选修了 2 号课程且成绩在 90 分以上的学生学号和姓名2013年4月24日2013年4月24日5151多表连接两个以上的表的连接SELECT Student.Sno,Sname,CnameFROM Student,Course,SCWHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;例 查询每
34、个学生的学号、姓名、选修的课程名及成绩2013年4月24日2013年4月24日52523.3.3 嵌套查询在 SQL 语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块。一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询。SELECT Sname FROM StudentWHERE Sno IN(SELECT Sno FROM SC WHERE Cno=2);如其等效不嵌套的查询语句?2013年4月24日2013年4月24日5353嵌套查询允许多层嵌套,体现了 SQL 的结构化特色术语父查询&子查询不相关子查询:子查询的查询条件不依赖于父查询
35、相关子查询:子查询的查询条件依赖于父查询的某个属性值SELECT Sname FROM StudentWHERE Sno IN(SELECT Sno FROM SC WHERE Cno=2);SELECT SnameFROM StudentWHERE EXISTS(SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=1);(不相关子查询)(相关子查询)2013年4月24日2013年4月24日5454嵌套查询 不相关子查询的求解方法 由里向外。子查询只执行一次,其结果用于父查询。相关子查询的求解方法 内层查询与外层查询反复求值。首先取外层查询中表的第一条元组
36、,根据它与内层查询相关的属性值处理内层查询,如果 where 子句返回值为真,则取此元组放入结果表中;然后再取外层查询中表的第二条元组;重复这一过程,直至外层查询中表的全部元组都被检查完为止。子查询中通常不含 ORDER BY 子句和 DISTINCT 短语,因为它们只对最终结果有意义。2013年4月24日2013年4月24日5555一、带有 IN 谓词的子查询嵌套查询中,子查询的结果往往是一个集合,所以经常使用谓词 IN使用嵌套实现此查询SELECT Sno,Sname,SdeptFROM StudentWHERE Sdept IN(SELECT Sdept FROM Student WHE
37、RE Sname=刘晨);例 查询与“刘晨”在同一个系学习的学生先分步实现此查询(1)SELECT Sdept FROM student WHERE Sname=刘晨 结果为 IS(2)SELECT Sno,Sname,Sdept FROM Student WHERE Sdept=IS;(不相关子查询)2013年4月24日2013年4月24日5656例子SELECT Sno,Sname(3)FROM StudentWHERE Sno IN(SELECT Sno(2)FROM SC WHERE Cno IN(SELECT Cno(1)FROM Course WHERE Cname=信息系统);例
38、 查询选修了课程名为“信息系统”的学生学号和姓名 使用连接查询实现 使用嵌套查询实现SELECT Sno,SnameFROM Student,SC,CourseWHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname=信息系统;(不相关子查询)2013年4月24日2013年4月24日5757二、带有比较运算符的子查询当用户能确切知道内层查询返回的是单值时,可以使用比较运算符(,=,=,ANY(ALL)大于子查询结果中的某个(所有)值=ANY(ALL)大于等于子查询结果中的某个(所有)值=ANY(ALL)小于等于子查询结果中的
39、某个(所有)值=ANY(ALL)等于子查询结果中的某个(所有)值!=ANY(ALL)不等于子查询结果中的某个(任何)值2013年4月24日2013年4月24日5959例 1SELECT Sname,SageFROM StudentWHERE Sage ANY(SELECT Sage FROM Student WHERE Sdept=IS)AND Sdept IS;SELECT Sname,SageFROM StudentWHERE Sage (SELECT MAX(Sage)FROM Student WHERE Sdept=IS)AND Sdept IS;例 查询其他系中比信息系某一学生年龄小
40、的学生姓名和年龄也可以用集函数来实现2013年4月24日2013年4月24日6060例 2SELECT Sname,SageFROM StudentWHERE Sage ALL(SELECT Sage FROM Student WHERE Sdept=IS)AND Sdept IS;例 查询其他系中比信息系所有学生年龄都小的学生姓名和年龄SELECT Sname,SageFROM StudentWHERE Sage (SELECT MIN(Sage)FROM Student WHERE Sdept=IS)AND Sdept IS;也可以用集函数来实现2013年4月24日2013年4月24日61
41、61转换关系事实上,用集函数实现子查询通常比直接用ANY 或 ALL 查询效率要高ANY、ALL 与集函数及 IN 的等价转换关系=!=ANYINMAXMIN=MINALLNOT INMINMAX=MAX2013年4月24日2013年4月24日6262四、带有 EXISTS 谓词的子查询不需要返回具体数据,而只关心是否有返回值,即返回逻辑真或假SELECT SnameFROM StudentWHERE EXISTS(SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=1);例 查询所有选修了一号课程的学生姓名(相关子查询)SELECT SnameFROM
42、Student,SCWHERE SC.Sno=Student.Sno AND Cno=1;(可以用连接查询来实现)2013年4月24日2013年4月24日6363例子SELECT SnameFROM StudentWHERE NOT EXISTS(SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=1);例 查询没有选修一号课程的学生姓名(相关子查询)SELECT SnameFROM Student,SCWHERE SC.Sno=Student.Sno AND Cno!=1);X(无法用简单的连接查询来实现)2013年4月24日2013年4月24日6464
43、替换关系一些带 EXISTS 或 NOT EXISTS 谓词的子查询不能被其他形式的子查询替换,但所有带 IN 谓词、比较运算符、ANY 和 ALL 谓词的子查询都能用EXISTS 谓词等价替换SELECT Sno,Sname,SdeptFROM StudentWHERE Sdept IN(SELECT Sdept FROM Student WHERE Sname=刘晨);例 查询与“刘晨”在同一个系学习的学生SELECT Sno,Sname,SdeptFROM Student S1WHERE EXISTS(SELECT*FROM Student S2 WHERE S2.Sdept=S1.Sd
44、ept AND S2.Sname=刘晨);(相关子查询)(不相关子查询)2013年4月24日2013年4月24日6565全称量词SQL 语言中没有全称量词 (for all),但可使用存在量词 进行转换后实现:SELECT SnameFROM StudentWHERE NOT EXISTS(SELECT*FROM Course WHERE NOT EXISTS(SELECT*FROM SCWHERE Sno=Student.Sno AND Cno=Course.Cno);例 查询选修了全部课程的学生姓名(可理解为:查询没有一门课程不选修的学生姓名))()(PxPxx 表示课程,P 表示谓词“选
45、修”(相关子查询)2013年4月24日2013年4月24日66663.3.4 集合查询SELECT 语句的查询结果是元组的集合,所以多个 SELECT 语句的查询结果可进行集合操作集合操作运算符并 UNION,交 INTERSECT,差 MINUS(EXCEPT)SELECT*FROM StudentWHERE Sdept=CSUNIONSELECT*FROM StudentWHERE Sage=19;例 查询计算机科学系的学生及年龄不大于 19 岁的学生2013年4月24日2013年4月24日6767例子查询有贷款帐户或有存款帐户的客户:(select customer-name from
46、depositor)union(select customer-name from borrower);查询同时有贷款帐户和存款帐户的客户:(select customer-name from depositor)intersect(select customer-name from borrower);查询有存款帐户但没有贷款帐户的客户:(select customer-name from depositor)except(select customer-name from borrower);2013年4月24日2013年4月24日6868说明UNION 将多个查询结果合并,并自动去掉重复
47、元组。但系统要求参加 UNION 操作的各结果表的列数和对应数据类型必须相同标准 SQL 中没有直接提供 INTERSECT 和 EXCEPT操作,但可以用其他方法来实现SELECT*FROM StudentWHERE Sdept=CS AND Sage19;例 查询计算机系的学生与年龄不大于 19 岁的学生的差集即:查询计算机系中年龄大于 19 岁的学生2013年4月24日2013年4月24日7070例子查询同时有贷款帐户和存款帐户的客户查询有存款帐户但没有贷款帐户的客户SELECT customer-nameFROM depositor,borrowWHERE o=o;SELECT cus
48、tomer-nameFROM depositorWHERE o IN (SELECT cno FROM borrower);SELECT customer-nameFROM depositorWHERE o NOT IN (SELECT cno FROM borrower);或2013年4月24日2013年4月24日71713.4 数据更新插入数据修改数据删除数据2013年4月24日2013年4月24日72723.4.1 插入数据 一、插入单个元组INTO 子句中没有出现的属性列,新记录在该列上将取空值,但注意说明了 NOT NULL的列不能取空值如果 INTO 子句中没有指明任何列名,则新记
49、录的每个属性列必须有值INSERT INTO (,)VALUES(,);2013年4月24日2013年4月24日7373例子INSERT INTO Student VALUES(95002,陈冬,男,IS,18);INSERT INTO Student VALUES(95002,陈冬,男);INSERT INTO SC(Sno,Cno)VALUES(95002,1);例 将一个新学生记录插入到 Student 表中例 插入一条选课记录(95020,1)新插入的记录 Grade 取空值例 将一个新学生记录插入到 Student 表中没有赋值的属性取空值2013年4月24日2013年4月24日74
50、74二、插入子查询结果(可能是一组元组)INSERT INTO (,)子查询;例 对每一个系,求学生的平均年龄,并把结果存入数据库 先建立一个新表,存放系名和学生平均年龄,然后插入数据CREATE TABLE Deptage(Sdept CHAR(15),Avgage SMALLINT);INSERT INTO Deptage(Sdept,Average)SELECT Sdept,AVG(Sage)FROM Student GROUP BY Sdept;2013年4月24日2013年4月24日75753.4.2 修改数据修改一个或一组元组的值UPDATE SET =,=WHERE ;UPDAT