数据库系统原理-第六章 数据库语言SQL_第1页
数据库系统原理-第六章 数据库语言SQL_第2页
数据库系统原理-第六章 数据库语言SQL_第3页
数据库系统原理-第六章 数据库语言SQL_第4页
数据库系统原理-第六章 数据库语言SQL_第5页
已阅读5页,还剩134页未读 继续免费阅读

下载本文档

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

文档简介

1、第第6章章 数据库语言数据库语言SQL 6.1 SQL中的简单查询6.2 多关系查询6.3 子查询6.4 全关系操作6.5 数据库更新6.6 SQL中的事务Page 1第六章第六章 数据库语言数据库语言SQL SQL:Structured Query Language SQL与关系代数之间的关系:与关系代数之间的关系: SQL的多数特性可对应关系代数的特性,如投影、选择、的多数特性可对应关系代数的特性,如投影、选择、自然连接等;自然连接等; SQL也超越关系代数,如聚合运算和数据更新;也超越关系代数,如聚合运算和数据更新; 关系代数可实现的计算,标准关系代数可实现的计算,标准SQL都可实现。都

2、可实现。 SQL标准:标准: ANSI(American National Standard Institute) SQL ; SQL-92 或或 SQL2; 较新的较新的 SQL-99 或或 SQL3。 Page 2第六章第六章 数据库语言数据库语言SQL 商业数据库管理系统符合的标准:商业数据库管理系统符合的标准: 都支持都支持ANSI SQL; 很大程度支持很大程度支持SQL2标准;标准; 支持支持SQL3的部分标准;的部分标准; 都有自己的方言。都有自己的方言。 SQL的主要内容:的主要内容: DQL数据查询数据查询(select) DML数据操纵数据操纵(insert, delete

3、, update) DDL数据定义数据定义(create, drop, alter) DCL数据控制数据控制(grant, revoke)Page 3第六章第六章 数据库语言数据库语言SQL 数据库服务器、数据库和表之间的关系:数据库服务器、数据库和表之间的关系: 一个数据库服务器一个数据库服务器Database Server是一个驱动引擎程是一个驱动引擎程序,当驱动起来之后,可提供序,当驱动起来之后,可提供SQL服务。服务。 一个数据库一个数据库database是一组语义相关的关系模式。通是一组语义相关的关系模式。通常可对应某一个或几个文件。常可对应某一个或几个文件。 一个数据库服务器可支持

4、一个数据库服务器可支持1个或多个数据库运行。个或多个数据库运行。 一个表一个表table是一个关系。是一个关系。 一个数据库可包含多个表,相互间可建立参照完整性一个数据库可包含多个表,相互间可建立参照完整性约束。约束。 要访问某个表,必须由数据库服务器先启动该表所在要访问某个表,必须由数据库服务器先启动该表所在的数据库。的数据库。Page 4第六章第六章 数据库语言数据库语言SQL 表的定义:表的定义: 表名表名 一组属性一组属性(列列columns): 列名,数据类型,缺省列名,数据类型,缺省值,约束值,约束(主键、允许空值、唯一值主键、允许空值、唯一值)等。等。 一组外键一组外键Forei

5、gn keys 一组约束一组约束constraints 一组权限一组权限permissions 一组索引一组索引indexes 一组触发器一组触发器triggers等等Page 5第六章第六章 数据库语言数据库语言SQL 常用数据类型:常用数据类型: 字符型:字符型: Char, Varchar, 需确定字符串长度。用单引号标注。需确定字符串长度。用单引号标注。 数值型:数值型: 整数:整数: Tinyint 1字节字节 Smallint 2字节字节 Int | Integer 4字节字节 BigInt 8字节字节 浮点数:浮点数: 精确浮点数:精确浮点数:Decimal | Dec (pre

6、cision, scale) (数字总位数数字总位数, 小数点小数点后位数后位数) Numeric (precision, scale) 近似浮点数:近似浮点数:Real, Double, Float(小数点后位数小数点后位数)日期型日期型 Date yyyy-mm-dd 每一个属性每一个属性(列列)必须确定一种数据类型。必须确定一种数据类型。Page 6第六章第六章 数据库语言数据库语言SQL 用用SQL查询或更新数据查询或更新数据 大多大多DBMS均提供交互操作界面,方便用户定义均提供交互操作界面,方便用户定义数据库,完成查询及数据更新等操作。数据库,完成查询及数据更新等操作。 SQL语句

7、计算正确性语句计算正确性的验证:验证:分析计算要求分析计算要求构造构造SQL语句语句准备试验数据准备试验数据手工计算结果手工计算结果运行运行SQL得到结果得到结果结果是否一致结果是否一致?Page 7 SQL中最简单的查询是找出关系中满足特定条件的元组,这和关系代数中选择操作()类似。简单查询使用了代表SQL特点的三个保留字:SELECT、FROM、WHERE来表示。 最典型SQL的查询格式:select-from-where 形式6.1 简单查询简单查询Page 8举例从students表中查询刘梦同学的学生信息:name=刘梦(students)SQL语句:语句:SELECT * FROM

8、 studentsWHERE name= 刘梦刘梦; ;sidnamesexB12070101刘梦女B12070102朱正洁女B12070103闫文柯女B12070104季晓倩女B12070105吴尘女B12070106曹雪宁女studentsPage 9如何使用SQL 普通用户通过DBMS提供的用户界面访问数据库,如:psql DBA(database administrator,数据库管理员)通过DBMS提供的DBA界面访问数据库,如:pgAdmin 在应用程序中通过主语言(如C+、JAVA)提供的数据库接口访问数据库(客户端编程) 存储过程、触发器(服务器编程) 无论哪一种方式都使用SQ

9、L语句对数据库查询和修改Page 10阅读和书写查询语句的小技巧 首先查看FROM子句:从哪些关系中查询信息 接着查看WHERE子句:把满足哪些条件的元组查询出来 最后查看SELECT子句:把哪些属性查询出来Page 116.1 简单查询简单查询 对单个关系的查询。对单个关系的查询。SELECT ALL | DISTINCT select-listFROM R WHERE cond ORDER BY expression | integer ASC | DESC ,;其中:其中:select-list :* | column-name | expression AS alias-name ,

10、. 读写的顺序:读写的顺序:FROM - WHERE - SELECT 所有所有SQL语句的关键词、表名、列名大小写无关。语句的关键词、表名、列名大小写无关。 SQL语句可多行书写。语句可多行书写。 SQL语句用分号语句用分号(英文英文)结尾。结尾。 Page 126.1.1 投影投影 SELECT子句的构成:子句的构成: *表示所有属性,按缺省次序排列。表示所有属性,按缺省次序排列。SELECT * FROM customer; 可投影到若干属性:可投影到若干属性:SELECT custid, name FROM customer; AS 别名别名 (改名运算,改变列名,改名运算,改变列名,

11、AS可省略可省略)SELECT custid, name AS custname FROM customer; 表达式表达式SELECT orderno, lineno, singlecost * quantity AS accountFROM salesitem; 常量也可作为一列常量也可作为一列SELECT orderno, lineno, singlecost * quantity AS account, Yuan AS “RMB”FROM DBA.salesitem; Page 136.1.2 选择选择 用用 WHERE 子句表示条件子句表示条件 condition: 运算对象:属性、

12、常量、别名运算对象:属性、常量、别名 算术运算符:数值运算:算术运算符:数值运算: + - * / 比较运算符:比较运算符: = = =5000 OR quantity=3000;Page 14举例 查询由中国电影集团有限公司生产的电影名称,并且它们要么是2010年生产,要么是片长大于140分钟。 SELECT title FROM MoviesWHERE studioName= 中国电影集团有限公司 AND (year=2010 or length140);Page 156.1.3 字符串比较字符串比较 字符串比较:字符串比较: = = A0053; 当两个字符串里的字符序列完全相同时称两个

13、字符串相等当两个字符串里的字符序列完全相同时称两个字符串相等。 如如a1a2an和和b1b2bm分别是两个字符串,进行比较。分别是两个字符串,进行比较。Page 16位串的表示 由B打头后跟0、1组成的符号串,如:B 101011表示二进制位串101011 由X打头后跟十六进制数字组成的符号串,如:X 7ff表示12位二进制位串011111111111Page 176.1.4 SQL中的模式匹配中的模式匹配 字符串模式匹配字符串模式匹配 : s LIKE p其中其中 s 是字符属性或字符串,是字符属性或字符串,p 是包含是包含 % 或下划线或下划线_的字符串模式的字符串模式匹配规则:匹配规则:

14、 p 中普通字符只和中普通字符只和 s 中完全相同的字符匹配;中完全相同的字符匹配; p 中中% 可与可与 s 中中 0 个或多个字符匹配;个或多个字符匹配; p 中一个下划线可与中一个下划线可与 s 中一个任意字符匹配。中一个任意字符匹配。SELECT * FROMsalesman WHERE name LIKE 王王%;SELECT * FROMsalesman WHERE name LIKE 王王_;Page 18举例 查询电影名称中含有所有格s的电影:select * from movieswhere title like %s%;Page 19Longs Run or Alices

15、RestaurantLIKE表达式中的转义字符 如果要在LIKE表达式中的模式中直接使用%和_字符怎么办? 方法是通过在模式后面跟一个保留字ESCAPE和一个用单引号括起来的字符指定转义字符,如:s LIKE x%x% ESCAPE x该模式表示以%号打头并以%结尾的字符串。s matches %asd% or %y%Page 206.1.5 日期和时间日期和时间 日期和时间:日期和时间: 日期类常量:日期类常量: Date yyyy-mm-dd 时间类常量:时间类常量: Time hh:mm:ss.sssss 日期和时间的比较:日期和时间的比较: = = = d1d2 表示表示d1早于早于d

16、2。Select * from salesorder where signdate =d1 AND d =d2select * from salesorder where signdate between 2005-10-1 and 2005-10-31; Page 21 时间戳数据类型TIMESTAMP,是将日期和时间组合起来。 通过保留字TIMESTAMP后跟日期和时间组合起来的字符串表示,日期和时间之间用空格隔开。如:TIMESTAMP1979-01-18 12:30:01表示1979年1月18日12点30分01秒。 可以使用比较运算符对日期和时间数据类型进行比较。6.1.5 日期和时间

17、日期和时间Page 226.1.6 空值和涉及空值的比较空值和涉及空值的比较 SQL允许属性有一个特殊值NULL(空值) NULL值的常见解释为: 未知值:即知道它有一个值,但不知道是什么。 例如:一个未知的生日。 不适用的值:“任何值在这里都没有意义”。 例如:对于Moviestar关系如果有一个spouse属性表示其配偶。对于一个未婚的影星这个属性值可能为NULL值。Page 236.1.6 空值和涉及空值的比较空值和涉及空值的比较 保留的值:“属于某对象但无权知道的值。例如:未公布的电话号码在phone属性中显示为NULL值。 WHERE子句中要考虑元组中的空值可能带来的影响。Page

18、246.1.6 空值和涉及空值的比较空值和涉及空值的比较 空值空值NULL表示未知或不存在的信息。表示未知或不存在的信息。 只有允许为空的属性才可能有空值。只有允许为空的属性才可能有空值。 需要对空值进行计算、比较和判断。需要对空值进行计算、比较和判断。 外连接是一种特殊的连接方式。外连接是一种特殊的连接方式。 外连接会产生空值结果。外连接会产生空值结果。 空值运算规则:空值运算规则: NULL值与任何值的任何算术运算结果都为值与任何值的任何算术运算结果都为 NULL值。值。 NULL值与任何值的任何比较结果都为值与任何值的任何比较结果都为 Unknown 布尔布尔值。值。Page 256.1

19、.6 空值和涉及空值的比较空值和涉及空值的比较 注意:注意:NULL不是常量,不是常量,SQL语句中,不能显式将语句中,不能显式将 NULL作为操作数使用,例如:作为操作数使用,例如:NULL是错误的是错误的表达式表达式 判断表达式的值是否为判断表达式的值是否为 NULL 表示为:表示为: Expression IS NOT NULL 运算结果为布尔值运算结果为布尔值 True 或或 False 。例:例:Select * From salesman Where deptid IS NULL 注意:聚合函数注意:聚合函数 Sum, Avg 等可作用于允许空值等可作用于允许空值 NULL 的属性

20、上,计算时,所有空值的行不参与聚的属性上,计算时,所有空值的行不参与聚合运算。合运算。Page 266.1.7 布尔值布尔值 Unknown 布尔值布尔值 Unknown 如何参与逻辑运算?如何参与逻辑运算? Unknown 值作为一个逻辑值,与值作为一个逻辑值,与 True 和和 False 构成三值构成三值逻辑。逻辑。 三值逻辑运算:三值逻辑运算:NOT非、非、AND与、与、OR或或ANDTrueFalseUnknownTrueFalseUnknownTrueFalseUnknownFalseFalseFalseUnknownFalseUnknownORTrueFalseUnknownTr

21、ueFalseUnknownTrueTrueTrueTrueFalseUnknownTrueUnknownUnknown设:设:True=1; False=0; Unknown=0.5 那么那么 a AND b = Min(a,b) a OR b = Max(a,b)Page 276.1.7 布尔值布尔值 Unknown SQL语句如何支持三值逻辑值的比较?语句如何支持三值逻辑值的比较? Expression IS NOT True Expression IS NOT False Expression IS Unknown运算结果是运算结果是 True 或或 False。NOTTrueFals

22、eUnknownFalseTrueUnknownNOT a = 1- aPage 286.1.7 布尔值布尔值 Unknown 注意:在注意:在 Select 语句中,语句中,WhereHaving子句中的子句中的条件表达式可能为条件表达式可能为 True, False, Unknown三种值,三种值,但只有使条件为但只有使条件为 True 的元组才符合要求。的元组才符合要求。 例如:例如: Select * from salesorder where signdate = 2005-10-1 ;Page 296.1.7 布尔值布尔值 UnknownWhere length IS NOT NU

23、LLPage 306.1.8 输出排序输出排序 ORDER BY子句子句 ORDER BY expression | integer ASC | DESC , 当输出结果为多行时,往往需要按某次序输出结果。当输出结果为多行时,往往需要按某次序输出结果。即改变行顺序。即改变行顺序。 ASC 表示升序表示升序(缺省缺省);DESC 表示降序。表示降序。例如:例如:SELECT * FROM salesorder ORDER BY signdate DESC;Page 31举例 SELECT * FROM MoviesWHERE studioName= 中国电影集团有限公司 ORDER BY yea

24、r, length; 注意:ORDER BY子句中的属性和SELECT子句中的属性一样也可以是表达式。Page 32练习练习 P152 6.1.3 a) e) f) SELECT model, speed, hd FROM PC WHERE price1000;e) SELECT * FROM Printer WHERE color = true;Page 33练习练习 P152 6.1.3 a) e) f)f) SELECT model, hd FROM PC WHERE speed = 3.2 AND price2000;Page 3435 关系代数中的连接、笛卡儿积、并、交和差可以组合多

25、个关系。在SQL中也可以实现相同的操作。6.2 多关系查询多关系查询6.2 多关系查询多关系查询 SQL 用简单的方式在一个查询中处理多个用简单的方式在一个查询中处理多个关系:在关系:在 From 子句中列出每个关系,然子句中列出每个关系,然后在后在Select和和Where子句中引用任何出现子句中引用任何出现在在From子句中关系的属性。子句中关系的属性。Select a1, a2, From R1, R2, Where condOrder By b1, Page 366.2.1 乘积和连接乘积和连接Select a1, a2, From R1, R2, Where cond实现关系代数运算

26、:实现关系代数运算: a1,a2,(R1 cond R2) 即即 a1,a2,(cond (R1 R2 ) 注意:结果是一个包,而不是集合注意:结果是一个包,而不是集合 ( 除非显式确除非显式确定定 Select distinct . ) Select 子句和子句和 Where 子句中可包含子句中可包含 From 子句中子句中的的 R1,R2 等关系的属性。等关系的属性。Page 3738 查询电影手机导演的姓名。其对应的查询语句为:SELECT name FROM Movies, MovieExec WHERE title=手机 AND producerC=cert;Movies(title

27、, year, length, genre, studioName, producerC) 名称名称 年份年份 长度长度(分钟分钟) 流派流派 电影公司名称电影公司名称 导演证书号导演证书号MovieExec(name, address, cert, netWorth) 导演姓名导演姓名 住址住址 导演证书号导演证书号 净资产净资产6.2.1 乘积和连接乘积和连接6.2.1 乘积和连接乘积和连接例:计算员工号为例:计算员工号为“A0043”的销售员所经办的客户的销售员所经办的客户的姓名及其电话号码的姓名及其电话号码 Salesorder (orderno, signdate, empid, c

28、ustid) Customer (custid, name, prov, city, phone, unit)Step1. Select * From salesorder, customer;Step2. Select * From salesorder, customer Where salesorder.custid = customer.custid AND empid=A0043;Step3. Select name, phone From salesorder, customer Where salesorder.custid = customer.custid AND empid

29、=A0043;Page 396.2.1 乘积和连接乘积和连接 例:计算员工号为例:计算员工号为“A0044”的销售员所销售的商品的销售员所销售的商品的种类和规格。的种类和规格。 Salesitem (orderno, lineno, prodid, unitprice, quantity) Salesorder (orderno, signdate, empid, custid) Product (prodid, factory, type, spec, price, desc)Select type, specFrom salesitem, salesorder, productWhere

30、salesitem.orderno = salesorder.orderno AND did = didAND salesorder.empid = A0044;Page 406.2.1 乘积和连接乘积和连接 例:计算员工号为例:计算员工号为“A0044”的销售员所销售的商品的销售员所销售的商品的种类和规格。的种类和规格。 Salesitem (orderno, lineno, prodid, unitprice, quantity) Salesorder (orderno, signdate, empid, custid) Product (p

31、rodid, factory, type, spec, price, desc) 自然连接方法:自然连接方法:( SQL Server 中不支持中不支持 )Select type, specFrom salesitem Natural Join salesorder Natural Join productWhere salesorder.empid = A0043;Page 416.2.2 避免歧义避免歧义(二义性二义性) 属性歧义:属性歧义: 一个查询所涉及的多个关系中有两个或两个以上的一个查询所涉及的多个关系中有两个或两个以上的属性同名。属性同名。 此时在此时在Select、Where等

32、子句中就不能简单引用属性等子句中就不能简单引用属性名。名。 消除歧义:消除歧义: 关系名关系名.属性名,限定关系和属性。属性名,限定关系和属性。 若表名或列名与若表名或列名与SQL关键词关键词(keywords)相同:相同: 把表名或列名用双引号标注,以区别于关键词。把表名或列名用双引号标注,以区别于关键词。例如:例如:SELECT name FROM “user” ; Page 4243 查询住址相同的影星和导演的姓名。 SELECT MovieS, MovieE FROM MovieStar, MovieExecWHERE MovieStar.address

33、=MovieExec.address;MovieStar(name, address, gender, birthdate) 姓名姓名 住址住址 性别性别 生日生日MovieExec(name, address, cert, netWorth) 导演姓名导演姓名 住址住址 导演证书号导演证书号 净资产净资产6.2.2 避免歧义避免歧义(二义性二义性)44 查询同一家庭的影星和导演的姓名。 SELECT MovieS, MovieE FROM MovieStar, MovieExecWHERE MovieStar.address=MovieExec.address

34、 AND MovieSMovieE;MovieStar(name, address, gender, birthdate) 姓名姓名 住址住址 性别性别 生日生日MovieExec(name, address, cert, netWorth) 导演姓名导演姓名 住址住址 导演证书号导演证书号 净资产净资产6.2.2 避免歧义避免歧义(二义性二义性)45 即使属性没有二义性,在它前面加上关系名前缀也是允许的。如:SELECT MovieE FROM Movies, MovieExec WHERE Movies.title=手机 AND Movies

35、.producerC=MovieExec.cert;6.2.2 避免歧义避免歧义(二义性二义性)Movies(title, year, length, genre, studioName, producerC) 名称名称 年份年份 长度长度(分钟分钟) 流派流派 电影公司名称电影公司名称 导演证书号导演证书号MovieExec(name, address, cert, netWorth) 导演姓名导演姓名 住址住址 导演证书号导演证书号 净资产净资产6.2.3 元组变量元组变量 元组变量:元组变量: 对关系的改名对关系的改名(别名别名)。Select a1, a2From R AS S, Wh

36、ere cond Select、Where等子句中必须使用改过的表名,即等子句中必须使用改过的表名,即“元元组变量组变量”。 例:计算例:计算“所有重名的销售员的员工号及其姓名所有重名的销售员的员工号及其姓名”Select s1.empid, From salesman as s1, salesman as s2Where s1.empids2.empid AND =Order by s1.empid; Page 4647 查找具有相同地址的影星。SELECT S, SFROM MovieStar Star1, Mo

37、vieStar Star2WHERE Star1.address=Star2.address;MovieStar(name, address, gender, birthdate) 姓名姓名 住址住址 性别性别 生日生日6.2.3 元组变量元组变量48 查找具有相同地址的两个影星。SELECT S, SFROM MovieStar Star1, MovieStar Star2WHERE Star1.address=Star2.address AND SS;6.2.3 元组变量元组变量49 查找具有相同地址的两个影星。SEL

38、ECT S, SFROM MovieStar Star1, MovieStar Star2WHERE Star1.address=Star2.address AND S100000000);6.2.5 查询的并、交、差查询的并、交、差58 查询不是导演的影星的姓名和地址。(SELECT name, address FROM MovieStar)EXCEPT(SELECT name, address FROM MovieExec);6.2.5 查询的并、交、差查询的并、交、差59 查询所有影星或导演的姓名和地址。(SELECT name, a

39、ddress FROM MovieStar)UNION(SELECT name, address FROM MovieExec);6.2.5 查询的并、交、差查询的并、交、差60 注意:和关系代数中的并、交、差运算一样,在SQL中进行UNION、INTERSECT、EXCEPT操作时,也要求查询提供的关系具有相同的属性名和数据类型。6.2.5 查询的并、交、差查询的并、交、差61 将Movies表中的电影名称、年份和StarsIn表中的电影名称、年份进行并操作。(SELECT title, year FROM Movies)UNION(SELECT movieTitle AS title, m

40、ovieYear AS year FROM StarsIn);Movies(title,year,length,genre,studioName,producerC) 名称名称 年份年份 长度长度(分钟分钟) 流派流派 电影公司名称电影公司名称 导演证书号导演证书号StarsIn(movieTitle, movieYear, starName) 影片名称影片名称 年份年份 主演姓名主演姓名6.2.5 查询的并、交、差查询的并、交、差6.2.5 查询的并、交、差查询的并、交、差Page 626.2.5 查询的并、交、差查询的并、交、差Page 636.2.5 查询的并、交、差查询的并、交、差Pa

41、ge 64练习练习 P158 6.2.2 a) e);a) Select maker, speedFrom Product P, Laptop LWhere hd = 30 And P.model = L.model;Page 65练习练习 P158 6.2.2 a) e);e) Select P1.model, P2.modelFrom PC P1, PC P2Where P1.speed = P2.speed And P1.ram = P2. ram And P1.model ANY( Select 成绩成绩 From 选修选修 Where 课号课号 = c1 ) ;对于每个选修对于每个选

42、修c1课的学生,若该成绩大于子查课的学生,若该成绩大于子查询结果中的某一个值,则该元组满足条件。询结果中的某一个值,则该元组满足条件。Page 766.3.2 涉及关系的条件涉及关系的条件expression compare ALL (Subquery):比较子查询结果中的所有值。比较子查询结果中的所有值。例:求例:求 c1 成绩最高的学生学号。成绩最高的学生学号。Select 学号学号 From 选修选修 Where 课号课号 = c1 AND 成绩成绩 = ALL( Select 成绩成绩 From 选修选修 Where 课号课号 = c1 ) ;对于每个选修对于每个选修c1课的学生,若该

43、成绩大于等于课的学生,若该成绩大于等于子查询结果中的每个值,则该元组满足条件。子查询结果中的每个值,则该元组满足条件。Page 776.3.2 涉及关系的条件涉及关系的条件expression NOT IN (Subquery):当且仅当表达式的值出现在子查询的结果中当且仅当表达式的值出现在子查询的结果中时,条件为真。时,条件为真。等价的表示:(等价的表示:(表示等价)表示等价)expression IN (Subquery) expression = ANY (Subquery)expression NOT IN (Subquery) expression ALL (Subquery) Pa

44、ge 786.3.2 涉及关系的条件涉及关系的条件例:求没有订单的销售员的员工号及其姓名。例:求没有订单的销售员的员工号及其姓名。Select empid, name From salesmanWhere empid ALL( Select empid From salesorder );等价运算:等价运算:Select empid, name From salesmanWhere empid NOT IN( Select empid From salesorder );Page 796.3.2 涉及关系的条件涉及关系的条件例:求货号为例:求货号为MT2226的产品的订单号及日期。的产品的订单

45、号及日期。Select orderno, signdateFrom salesorder Where orderno IN ( Select orderno from salesitem where prodid = MT2226 );等价计算:等价计算:Select orderno, signdateFrom salesorder Where orderno =ANY ( Select orderno from salesitem where prodid = MT2226);Page 806.3.2 涉及关系的条件涉及关系的条件等价计算:等价计算:Select salesorder.ord

46、erno, signdateFrom salesorder, salesitem Where salesorder.orderno = salesitem.orderno AND prodid = MT2226;等价计算:等价计算:Select orderno, signdate From salesorder as sWhere Exists ( Select * from salesitem where salesitem.orderno = s.orderno AND prodid = MT2226 );Page 816.3.2 涉及关系的条件涉及关系的条件子查询亦可实现集合的减运算和交

47、运算。子查询亦可实现集合的减运算和交运算。R S表示为:表示为: R ALL (S) 或或 R NOT IN (S)R S表示为:表示为: R = ANY (S) 或或 R IN (S)例:求与某客户同名的销售员姓名。例:求与某客户同名的销售员姓名。Select nameFrom salesmanWhere name IN ( Select name From customer );Page 8283 元组的表示:用括号括起来的标量值序列表示。如:(123,foo)(name, address, networth) 如果一个元组t和关系R的元组有相同的组成分量个数,那么使用6.3.2节的运算符

48、对t和R进行比较是有意义的。例如:t IN R, tANY R等6.3.3 涉及元组的条件涉及元组的条件6.3.3 涉及元组的条件涉及元组的条件 若若 t 是元组,是元组,R 是与是与 t 有相同分量的元组的集合,则有相同分量的元组的集合,则 t IN R 或或 t ANY R 可表达特定的查询条件。可表达特定的查询条件。 例如:计算影星例如:计算影星Harrison Ford所主演的所有影片的制片人所主演的所有影片的制片人姓名。姓名。 Select name From MovieExec Where cert# IN ( Select producerC# From Movie Where

49、(title, year) IN ( Select movieTitle, movieYear From StarsIN Where starName=Harrison Ford ) ); 多数多数 DBMS 要求子查询中的要求子查询中的 Select-list 为单个属性,即不支为单个属性,即不支持元组条件的表示。持元组条件的表示。 Page 8485 查询葛优演过的电影的导演姓名。SELECT nameFROM MovieExecWHERE cert IN (SELECT producerC FROM Movies WHERE (title, year) IN (SELECT movieT

50、itle, movieYear FROM StarsIn WHERE starName=葛优);6.3.3 涉及元组的条件涉及元组的条件86 不用子查询也可以查出葛优演过的电影的导演的姓名。SELECT nameFROM MovieExec, Movies, StarsInWHERE starName=葛优 AND movieTitle=title AND movieYear=year AND producerC=cert;6.3.3 涉及元组的条件涉及元组的条件87 最简单的子查询只需计算一次,它返回的结果用于外层查询; 复杂的嵌套子查询要求一个子查询计算多次,每次根据外层查询的某个元组变量

51、的值执行子查询。这种类型的子查询叫做关联子查询。6.3.4 关联子查询关联子查询6.3.4 关联子查询关联子查询 子查询条件中含有对外层关系的引用子查询条件中含有对外层关系的引用 对外层关系的每个元组,计算一次子查询对外层关系的每个元组,计算一次子查询例:计算例:计算“所有重名的销售员的员工号及其姓名所有重名的销售员的员工号及其姓名” Select empid, name From salesman as s Where empid ANY ( Select empid From salesman Where name= );等价于:等价于: Select s1.empid, s1

52、.name From salesman as s1, salesman as s2 Where s1.empids2.empid AND =;Page 886.3.5 FROM 子句中的子查询子句中的子查询 子查询结果可作为关系,直接用于子查询结果可作为关系,直接用于 FROM 子句子句 此时,子查询应当括起并给予别名此时,子查询应当括起并给予别名例:求货号为例:求货号为MT2226的产品的订单号及日期。的产品的订单号及日期。Select orderno, signdateFrom salesorder,( Select orderno from salesitem

53、 where prodid = MT2226 ) as tWhere salesorder.orderno=t.orderno; 复杂的子查询用于复杂的子查询用于 FROM 子句会影响语句的可理子句会影响语句的可理解性解性Page 8990 查询葛优演过的电影的导演,也可这样查询:SELECT nameFROM MovieExec, ( SELECT producerC FROM Movies, StarsIn WHERE title=movieTitle AND year=movieYear AND starName=葛优 ) RWHERE cert=producerC;6.3.5 FROM

54、 子句中的子查询子句中的子查询6.3.6 连接表达式连接表达式 通过特定的连接运算符作用在两个关系上,通过特定的连接运算符作用在两个关系上,产生一个新关系。产生一个新关系。 连接表达式可直接用于连接表达式可直接用于 FROM 子句。子句。 连接表达式的一般形式包括:连接表达式的一般形式包括: R1 CROSS JOIN R2笛卡尔积笛卡尔积 R1 JOIN R2 ON cond连接连接 R1 NATURAL JOIN R2自然连接自然连接 R1 KEY JOIN R2键连接键连接Page 916.3.6 连接表达式连接表达式 R1 CROSS JOIN R2 笛卡尔积。笛卡尔积。例如:例如:

55、Select * From salesman CROSS JOIN salesorder等价于:等价于: Select * From salesman, salesorder注意:注意:CROSS JOIN 不能用不能用 ON 增加连接条件。增加连接条件。 R1 JOIN R2 ON cond 连接。连接。例如:例如: Select * From salesman JOIN salesorder ON salesman.empid = salesorder.empid等价于:等价于: Select * From salesman, salesorder Where salesman.empid

56、 = salesorder.empidPage 926.3.7 自然连接自然连接 自然连接隐含特定的连接条件。自然连接隐含特定的连接条件。 R1 NATURAL JOIN R2 自然连接。自然连接。 R1 和和 R2 之间应至少有一对同名属性,否则连之间应至少有一对同名属性,否则连接无效。接无效。 默认的连接条件是:默认的连接条件是:R1 和和 R2 的所有同名属性的所有同名属性值对应相等。值对应相等。例如:例如:Select * From salesman Natural Join salesorder 自然连接的结果中不包含同名属性的副本自然连接的结果中不包含同名属性的副本Page 936

57、.3.7 自然连接和键连接自然连接和键连接 自然连接可用自然连接可用 ON 增加连接条件。增加连接条件。例:计算员工号为例:计算员工号为“A0043”的销售员所经办的客户的销售员所经办的客户的姓名及其电话号码的姓名及其电话号码Select name, phoneFrom salesorder Natural Join customer ON empid=A0043;比较:比较: Select name, phone From salesorder Natural Join customer Where empid=A0043;Page 946.3.8 外连接外连接 外连接外连接 Outer J

58、oin: 参与连接的一方参与连接的一方(左方或右方左方或右方)的所有元组,即的所有元组,即使不满足条件,也要出现在结果中。使不满足条件,也要出现在结果中。 不满足条件的元组的另一方属性值均置为空不满足条件的元组的另一方属性值均置为空值值(NULL)。 外连接的形式:外连接的形式: 左外连接左外连接 Left Outer Join:左面关系的所有元:左面关系的所有元组将出现在结果中。组将出现在结果中。 右外连接右外连接 Right Outer Join:右面关系的所有元:右面关系的所有元组将出现在结果中。组将出现在结果中。 全外连接全外连接 Full Outer Join:两面关系的所有元:两面

59、关系的所有元组均出现在结果中。组均出现在结果中。Page 956.3.8 外连接外连接 例:求所有客户的订单号及签单日期。例:求所有客户的订单号及签单日期。 Select customer.custid, name, orderno, signdate From salesorder Natural Right Outer Join customer; 这是一个这是一个“自然右外连接自然右外连接”。 有订单的客户有对应的有订单的客户有对应的 orderno, signdate 值。值。 没有订单的客户所对应的没有订单的客户所对应的 orderno, signdate 值为值为NULL。 右面关

60、系右面关系(customer)中的所有元组都出现在结果中。中的所有元组都出现在结果中。 Page 966.3.8 外连接外连接 外连接可用外连接可用 ON 增加条件,但应区别于增加条件,但应区别于 Where 条条件。件。例:求所有销售员在例:求所有销售员在2005年年10月之后的订单号及月之后的订单号及签单日期。签单日期。Select salesman.empid, name, orderno, signdateFrom salesman Natural Left Outer Join salesorder ON signdate =2005-10-1对比:对比:Select salesma

温馨提示

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

评论

0/150

提交评论