数据库原理与设计课件:第4章 SQL_第1页
数据库原理与设计课件:第4章 SQL_第2页
数据库原理与设计课件:第4章 SQL_第3页
数据库原理与设计课件:第4章 SQL_第4页
数据库原理与设计课件:第4章 SQL_第5页
已阅读5页,还剩203页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章 关系数据库标准语言SQL22022/7/184.1 SQL简介结构化查询语言SQL(Structured Query Language)是一种介于关系代数与关系演算之间的语言,是一个通用的、功能极强的关系数据库语言,是关系数据库的标准语言。SQL语言的版本包括:SQL-89,SQL-92, SQL-99(SQL3) 增加了面向对象的概念 SQL2003(SQL4),SQL语言集数据查询、数据操纵、数据定义和数据控制功能于一体,充分体现了关系数据语言的特点和优点32022/7/18SQL的特点综合统一集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体,可以完成数据库

2、生命周期中的全部活动。关系模型中实体和实体间的联系都用关系来表示,使得操作符单一,每种操作只使用一个操作符。高度非过程化使用SQL语言,只需要提出“做什么”,而无需指明“怎么做”,无需了解存取路径,提高了数据的独立性面向集合的操作方式SQL语言采用集合操作方式,查询、插入、删除、修改操作的对象都是集合。42022/7/18SQL的特点以同一种语法结构提供多种使用方式作为独立的语言提供联机交互工具,在终端键盘上直接键入SQL命令对数据库进行操作,由DBMS来进行解释作为嵌入式语言 SQL语句能嵌入到高级语言程序中,使应用程序充分利用SQL访问数据库的能力不同方式下,SQL的语法结构基本上是一致的

3、,提供了极大的灵活性和方便性。52022/7/18第4章 关系数据库标准语言SQL4.1SQL简介 4.2SQL的系统结构4.3SQL的数据定义4.4SQL的数据操纵4.5SQL中的视图4.6SQL的数据控制4.7嵌入式SQL4.8小结62022/7/184.2 SQL的系统结构SQL语言支持数据库的三级模式结构 在SQL中,关系模式称为基本表(Table),基本表的集合形成数据库模式,对应三级模式结构的模式基本表在物理上与存储文件相对应,所有存储文件的集合为物理数据库。外模式由视图(View) 组成视图图存储文件视图基本表基本表基本表SQL存储文件存储文件外模式模式内模式72022/7/18

4、4.3 数 据 定 义SQL的数据定义功能主要包括定义表、定义视图和定义索引,在SQL2中还增加了对SQL数据库模式的定义 82022/7/184.3.1 模式的定义和删除在SQL中,一个SQL模式(SQL Schema)由模式名、权限标识符和模式中元素的描述符组成。权限标识符指明拥有该模式的用户或帐号模式元素包含一个数据库应用的表、视图和索引等属于同一应用的表、视图和索引等可以定义在同一模式中。在定义模式时可先给出模式名和权限标识符,以后再定义其中的元素 ,语法格式:CREATE SCHEMA AUTHORIZATION 如果没有指定,则隐含为92022/7/184.3.1 模式的定义和删除

5、【例4-1】定义学生数据库模式SST,用户为SDBA。 CREATE SHEMA SST AUTHORITHZATION SDBA;例CREATE SCHEMA AUTHORIZATION WANG 没有指定“模式名”,所以“模式名”隐含为用户名WANG102022/7/18关于模式Oracle中:用户帐号拥有的对象集称为用户的模式在SQL Server中,由于架构的原因,User和Schema总有一层隐含的关系,让用户很少意识到其实User和Schema是两种完全不同的概念。在SQL Server2000中,在某一个数据库中创建了用户Bosco,后台默认地创建了Schema 【Bosco】。

6、SQL Server2000中表的名称体现数据库、用户和表名三方面的信息: database_name. owner. table_name在SQL Server2005中这种架构被打破,User和Schema被分开112022/7/18SQL Server2005中的模式用Create User创建数据库用户时,可以为该用户指定一个已经存在的Schema作为默认Schema,如果不指定,则该用户所默认的Schema即为dbo Schema,dbo Schema好比一个大的公共房间在SQL Server2005中创建一个数据库的时候,会有一些Schema包括进去,被包括进去的Schema有:d

7、bo, guest,sys, INFORMATION_SCHEMA, 还有一些角色Schema等等当create table A时,如果没有指定特定的Schema,则A表创建在:1.如果当前操作数据库的用户有默认的Schema(在创建用户的时候指定了),那么表A被创建在了默认的Schema上。2. 如果当前操作数据库的用户没有默认的Schema(即在创建User的时候默认为空),创建在dbo Schema上。3.如果在创建表A的时候指定了特定的Schema做前缀,则表A被创建在了指定的 Schema上122022/7/18SQL Server2005中的模式现在如果登录的用户为Sue,该用户有

8、一个默认Schema也为Sue,那么如果现在有一条查询语句为Select * from mytable, 那么搜寻每个房间(Schema)的顺序是怎样的呢?1. 首先搜寻sys.mytable (Sys Schema)2. 然后搜寻Sue.mytable (Default Schema)3. 最后搜寻 dbo.mytable (Dbo Schema)每个数据库在创建后,有4个Schema是必须的(删不掉),这4个Schema为dbo , guest, sysINFORMATION_SCHEMA132022/7/184.3.1 模式的定义和删除定义模式后,实际上定义了一个命名空间,可以进一步定义

9、该模式包含的数据库对象,如表,视图和索引等可以在创建模式的同时在模式定义中进一步创建基本表、视图、定义授权等CREATE SCHEMA 模式名 AUTHORIZATION 用户名表定义子句视图定义子句授权定义子句例创建相互依赖的 FOREIGN KEY 约束CREATE SCHEMA AUTHORIZATION ross CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT REFERENCES t2(c1) CREATE TABLE t2 (c1 INT PRIMARY KEY, c2 INT REFERENCES t1(c1) 用其它方法完成需要执行多个步

10、骤142022/7/184.3.1 模式的定义和删除删除模式语句:DROP SCHEMA模式名CASCADERESTRICTCASCADE (级联式)方式表示在删除模式的同时把该模式中所有的数据库对象全部一起删除RESTRICT (限制式)方式表示如果该模式中已经定义了下属的数据库对象, 则拒绝该删除语句的执行152022/7/184.3.2 表的定义、删除与修改1. 定义基本表CREATE TABLE ( , , );:所要定义的基本表的名字:组成该表的各个属性(列):涉及相应属性列的完整性约束条件:涉及一个或多个属性列的完整性约束条件 162022/7/181. 定义基本表【例4-3】建立

11、学生表Student,表中属性有:学号Sno,姓名Sname,年龄Sage,性别Ssex,学生所在系SdeptCREATE TABLE Student ( Sno CHAR(6) NOT NULL UNIQUE, Sname CHAR(8), Sage INT, Ssex CHAR(2), Sdept CHAR(12), CONSTRAINT C1 CHECK (Ssex IN(男,女), CONSTRAINT S_PK PRIMARY KEY(Sno);CONSTRAINT子句定义列级或表级约束,其格式为CONSTRAINT 172022/7/181. 定义基本表在SQL2中增加了定义域的语

12、句,可以用域名代替指定列的数据类型。如果有一个或多个表的属性的域是相同的,通过对域的修改可以很容易地改变属性的数据类型。域定义语句的格式为:CREATE DOMAIN ;例 CREATE DOMAIN Sdept_TYPE CHAR(12);域Sdept_TYPE创建后,定义学生表时,对列Sdept的类型定义可以用域名代替:Sdept Sdept_TYPE。 182022/7/181. 定义基本表 【例4-4】 CREATE TABLE Course (Cno CHAR(6) NOT NULL, Cname CHAR(20), Ccredit INT, PRIMARY KEY(Cno);CRE

13、ATE TABLE SC ( Sno CHAR(6) NOT NULL, Cno CHAR(6) NOT NULL, Grade INT CHECK (Grade BETWEEN 0 AND 100), CONSTRAINT SC_PK PRIMARY KEY(Sno,Cno), CONSTRAINT SC_FK1 FOREIGN KEY (Sno) REFERENCES Student(Sno), CONSTRAINT SC_FK2 FOREIGN KEY (Cno) REFERENCES Course(Cno);192022/7/181. 定义基本表例CREATE TABLE Course

14、 ( Cno CHAR(4) PRIMARY KEY, Cname CHAR(40), Cpno CHAR(4), Ccredit SMALLINT, FOREIGN KEY (Cpno) REFERENCES Course(Cno) ); CREATE TABLE SC( Sno CHAR (9) , Cno CHAR (4) , Grade smallint, Primary key (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno);202022/7

15、/181. 定义基本表在定义基本表时,表所属的数据库模式一般被隐式指定,也可以显式地在定义表时指定表所属的数据库模式名。如下语句在定义学生表时,同时指出学生表所在的模式为学生数据库模式SST。CREATE TABLE SST.Student (Sno CHAR(6) NOT NULL UNIQUE,);在创建模式语句中同时创建表212022/7/182. 修改基本表ALTER TABLE ADD DROP CASCADE | RESTRICT ALTER ;ADD子句用于增加新列,包括列名、数据类型和列级完整性约束 DROP子句用于删除指定的列名,CASCADE表示删除列时自动删除引用该列的视

16、图和约束RECTRICT表示没有视图和约束引用时才能删除该列,否则将拒绝删除操作 ALTER子句用于修改列的定义,如修改列的数据类型或修改列的宽度 222022/7/182. 修改基本表【例4-5】在学生表Student中增加一列,列名为班级。ALTER TABLE Student ADD CLASS CHAR(8);不论基本表中原来是否已有数据,新增加的列一律为空值【例4-6】修改学生表Student中姓名列的长度为20。ALTER TABLE Student ALTER Sname CHAR(20) ;修改原有的列定义有可能会破坏已有数据232022/7/183. 删除基本表 DROP T

17、ABLE 表名 RESTRICTCASCADE;若选择RESTRICT,则删除的基本表不能是由 FOREIGN KEY 约束引用的表 , 不能有视图,不能有触发器,不能有存储过程或函数等。如果存在这些依赖该表的对象,则此表不能被删除若选择CASCADE,则该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,例如视图等都将被一起删除。在缺省的情况下,默认为RESTRICT242022/7/183. 删除基本表 SQL Server删除表DROP TABLE 表名 数据、表上的索引都删除,删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述 表上的视图往往仍然保留,但无法引用DR

18、OP TABLE 不能用于删除有 FOREIGN KEY 约束引用的表Oracle删除表时,自动删除表上所有索引,保留视图定义(但失效),保留建立在此表上的存储过程和函数(但失效), CASCADE选项下可以删除有 FOREIGN KEY 约束引用的表 SQL Server 没有 RESTRICT和CASCADE选项Oracle9i 没有RESTRICT选项252022/7/184.3.3 索引的建立与删除索引是一种数据结构,可以提高查询速度。大型关系数据库中的索引的实现技术是数据库管理系统实现中最重要的核心问题。当关系变得很大时,通过扫描所有关系中所有元组来找出那些(可能数量很少)匹配给定条

19、件的元组的操作方式代价太高。例如select * from Movie where studioName=Disneyand year = 1990方法1:取得全部元组,用where子句逐一匹配方法2:取得1990年的元组,判断studio.Name =Disney。在year上创建索引,SQL查询处理器进行年份查询时,仅对指定年份的元组测试 262022/7/184.3.3 建立与删除索引 建立索引是加快查询速度的有效手段可根据需要在一个表上建立一个或多个索引,以提供多种存取路径,加快查找速度。也可不建建立索引DBA或表的属主(即建立表的人)根据需要建立有些DBMS自动建立以下列上的索引 P

20、RIMARY KEY, UNIQUE维护索引: DBMS自动完成使用索引系统在存取数据时会自动选择是否使用索引以或合适的索引作为存取路径,用户不必也不能选择索引272022/7/181. 建立索引 语句格式CREATE UNIQUE CLUSTER INDEX ON (, )指定要建索引的基本表名字索引可以建立在该表的一列或多列上,各列名之间用逗号分隔指定索引值的排列次序,升序ASC,降序DESC。缺省值:ASCUNIQUE表明此索引的每一个索引值只对应唯一的数据记录CLUSTER表示要建立的索引是聚簇索引282022/7/181. 建立索引【例4-8】在学生表Student的列学号上按升序建

21、立惟一索引。 CREATE UNIQUE INDEX S_SNO ON Student(Sno);对于已含重复值的属性列不能建UNIQUE索引对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值【例4-9】在表Student上,班级按降序、年龄按升序建立索引。CREATE INDEX SCLASS_AGE ON Student(CLASS DESC, Sage ASC);以上语句的执行在学生表上建立班级为降序和年龄为升序排列的索引文件SCLASS-AGE,当班级值相同时将按年龄升序排列 ; 292022/7/181. 建立索引依据索引的顺序和数据库的物理存

22、储顺序是否相同,索引分为两类:聚簇索引、非聚簇索引非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置302022/7/181. 建立索引聚簇索引对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上,即聚集索引与数据是混为一体的,它的叶节点中存储的是实际的数据312022/7/181. 建立索引聚簇索引确定表中数据的物理顺序。一个表只能包含一个聚簇索引。但该索引可以包含多个列(组合索引)。聚簇索引适用于: 很少对基表进行增删操作; 很少对其中的变长列进行修改操作 聚簇索引对于那些经常要搜索范围值的列特别有效使用聚集索引找到包含第一个值的

23、行后,便可以确保包含后续索引值的行在物理相邻。有助于提高搜索范围值类查询的性能如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚簇(物理排序),避免每次查询该列时都进行排序322022/7/182. 删除索引 DROP INDEX ;删除索引时,系统会从数据字典中删去有关该索引的描述。【例4-10】删除学生表上建立的S_SNO索引。DROP INDEX S_SNO;332022/7/18索引选择索引为性能所带来的好处却是有代价的。数据库设计者需要对索引作一个折中的选择,这种选择是衡量数据库设计成败的重要因素对某个属性使用索引能极大提高对该属性上的值的检索效率,使用到该属性

24、时,还可以加快连接带索引的表在数据库中会占据更多的空间。维护索引的代价,对数据进行插入、更新、删除操作的命令所花费的时间会更长。应评估两个因素:数据的性质和基于表的查询的性质,来决定是否创建索引,应确保对性能的提高程度大于在存储空间和处理资源方面的代价342022/7/18索引选择索引的选择是数据库设计中最困难的部分之一,需要估计对数据库上使用什么样的查询组合以及其他操作如果某个关系的查询操作对它的更新操作多,那么建立在该关系上的索引具有较高的效率。对于经常和查询where子句中的常量作比较的属性,以及频繁出现在连接条件中的属性应该建立索引更新操作频繁,创建索引要谨慎。需要仔细估算更新和查询数

25、量的相对比例来决定索引的使用。352022/7/184.4 SQL的数据操纵SQL的数据操纵包括数据的查询、插入、修改和删除4.4.1 数据查询1. 单表查询2. 连接查询3. 嵌套查询4. 集合查询4.4.2 数据更新362022/7/184.4.1 查 询语句格式SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC ;SELECT子句:指定要显示的属性列FROM子句:指定查询对象(基本表或视图)WHERE子句:指定查询条件 GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常

26、会在每组中作用集函数。HAVING短语:筛选出只有满足指定条件的组ORDER BY子句:对查询结果表按指定列值的升序或降序排序 372022/7/184.4.1 查 询数据查询是数据库应用的核心功能 基本结构Select A1, A2, ., An From R1, R2, ., Rm Where P关系代数中基于关系是一个集合这样的数学概念,因此,重复的元组不会在关系中出现。但在实践中,要删除查询结果中的重复元组是相当费时的,所以在商用数据库产品中,允许在关系和SQL表达式的结果中出现重复元组。SelectWhereFrom A1, A2, ., An(p(R1R2.Rm)382022/7/

27、181. 单表查询【例4-11】查询计算机系学生的学号和姓名。SELECT Sno, Sname FROM Student WHERE SD=CS;【例4-12】查询选修了课的学生学号,并按学号升序排列。SELECT DISTINCT Sno FROM SC ORDER BY Sno;【例4-13】查询年龄在18到25岁之间的学生信息。SELECT * FROM Student WHERE Sage BETWEEN 18 AND 25;392022/7/181. 单表查询查询经过计算的值SELECT子句的不仅可以是表中的属性列,也可以是表达式算术表达式 、字符串常量、函数、列别名等 【例4-1

28、4】查全体学生的姓名及其出生年份。 SELECT Sname,2000-Sage FROM Student;输出结果: Sname 2000-Sage - - 李勇 1976 刘晨 1977 王名 1978 张立 1978 402022/7/181. 单表查询查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECT Sname, Year of Birth:, 2000-Sage, LOWER(Sdept) FROM Student;输出结果: Sname Year of Birth: 2000-Sage LOWER(Sdept) 李勇 Year of Birth: 19

29、76 cs 刘晨 Year of Birth: 1977 is 王名 Year of Birth: 1978 ma 张立 Year of Birth: 1977 is使用列别名改变查询结果的列标题SELECT Sname AS NAME, Year of Birth: BIRTH, 2000-Sage BIRTHDAY, LOWER(Sdept) DEPARTMENT FROM Student;412022/7/181. 单表查询消除取值重复的行在SELECT子句中使用DISTINCT短语假设SC表中有下列数据 Sno Cno Grade - - - 95001 1 92 95001 2 85

30、 95001 3 88 95002 2 90 95002 3 80例 查询选修了课程的学生学号(1)SELECT Sno FROM SC;或(默认 ALL) SELECT ALL Sno FROM SC;结果: Sno - 95001 95001 95001 95002 95002 (2) SELECT DISTINCT Sno FROM SC;结果: Sno - 95001 95002 422022/7/18注意 DISTINCT短语的作用范围是所有目标列例:查询选修课程的各种成绩错误的写法SELECT DISTINCT Cno,DISTINCT GradeFROM SC;正确的写法 SEL

31、ECT DISTINCT Cno,Grade FROM SC;1. 单表查询432022/7/181. 单表查询WHERE子句常用的查询条件比较表达式 比较算符 比较算符:=、=、=、(或!=)逻辑表达式 逻辑算符 逻辑算符:AND、OR、NOTBETWEEN (NOT)BETWEEN AND IN(NOT)IN (常量表列 或 SELECT语句)LIKE(NOT)LIKE 匹配字符串匹配符:“_”表示匹配一个字符,“%”表示匹配任意字符串NULL IS(NOT) NULLEXISTS(NOT)EXISTS (SELECT语句)442022/7/18(1) 比较大小在WHERE子句的中使用比较

32、运算符=,=,=,!= 或 ,!,!, 逻辑运算符NOT + 比较运算符例 查询所有年龄在20岁以下的学生姓名及其年龄 SELECT Sname, Sage FROM Student WHERE Sage = 20; 452022/7/18(2) 确定范围使用谓词 BETWEEN AND NOT BETWEEN AND 例 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23; (WHERE Sage = 20 AND Sage =23)例 查

33、询年龄不在2023岁之间的学生姓名、系别和年龄SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;462022/7/18(3) 确定集合使用谓词 IN , NOT IN :用逗号分隔的一组取值例查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。SELECT Sname,Ssex FROM Student WHERE Sdept IN ( IS,MA,CS ); ( WHERE Sdept = IS OR Sdept = MA OR Sdept = CS )例查询既不是信息系、数学系,

34、也不是计算机科学系的学生的姓名和性别。SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN ( IS,MA,CS )472022/7/18(4) 字符串匹配 NOT LIKE ESCAPE :指定匹配模板匹配模板:固定字符串或含通配符的字符串当匹配模板为固定字符串时,可以用 = 运算符取代 LIKE 谓词,用 != 或 运算符取代 NOT LIKE谓词通配符% 代表任意长度(长度可以为0)的字符串例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串(下横线) 代表任意单个字符例:a_b表示以a开头,以b结

35、尾的长度为3的任意字符串。如acb,afb等都满足该匹配串482022/7/18(4) 字符串匹配 NOT LIKE ESCAPE ESCAPE 短语:当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE 短语对通配符进行转义492022/7/18(4) 字符串匹配匹配模板为含通配符的字符串例 查询所有姓刘学生的姓名、学号和性别。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 刘%;例 查询姓欧阳且全名为三个汉字的学生的姓名。 SELECT Sname FROM Student WHERE Sname LIKE 欧阳_ _

36、;502022/7/18(4) 字符串匹配使用换码字符将通配符转义为普通字符 例 查询DB_Design课程的课程号和学分。 SELECT Cno,Ccredit FROM Course WHERE Cname LIKE DB_Design ESCAPE 例 查询以DB_开头,且倒数第3个字符为 i的课程的详细情况。 SELECT * FROM Course WHERE Cname LIKE DB_%i_ _ ESCAPE 512022/7/18(5) 涉及空值的查询 使用谓词 IS NULL 或 IS NOT NULL “IS NULL” 不能用 “= NULL” 代替例 某些学生选修课程后

37、没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NULL;例 查所有有成绩的学生学号和课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL522022/7/18空值SQL允许属性有一个特殊值NULL称作空值。未知值:有值但是不知道是什么,例如未知生日不适用的值:例如配偶的名字保留的值:无权知道的值,例未公布的电话号码空值的运算空值不同于空白或零值。没有两个相等的空值。空值和任何值进行算术运算,结果仍为空值。执行计算时消除空值很重要

38、,因为包含空值列的某些计算(如平均值)会不准确。 当使用逻辑运算符和比较运算符,有可能返回 结果 UNKNOWN, 是与TRUE 和 FALSE 相同的布尔值空串指的是零长度字符串当 m 为0或负数时,RIGHT(123, m) 返回空字符串RTRIM( ) 返回空字符串。532022/7/18(6) 多重条件查询用逻辑运算符AND和 OR来联结多个查询条件 AND的优先级高于OR 可以用括号改变优先级可用来实现多种其他谓词 NOT IN NOT BETWEEN AND 例 查询计算机系年龄在20岁以下的学生姓名。 SELECT Sname FROM Student WHERE Sdept=

39、CS AND Sage20;542022/7/18对查询结果排序 使用ORDER BY子句 可以按一个或多个属性列排序 升序:ASC;降序:DESC;缺省值为升序空值将作为最大值排序ASC:排序列为空值的元组最后显示DESC:排序列为空值的元组最先显示 552022/7/18对查询结果排序例 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。 SELECT Sno,Grade FROM SC WHERE Cno= 3 ORDER BY Grade DESC; 查询结果Sno Grade - - 95010 95024 95007 92 95003 82 95010 82 9500

40、9 75 95014 61 95002 55562022/7/18使用集函数 主要集函数计数COUNT(DISTINCT|ALL *)COUNT(DISTINCT|ALL )计算总和 SUM(DISTINCT|ALL ) 计算平均值 AVG(DISTINCT|ALL )求最大值 MAX(DISTINCT|ALL )求最小值 MIN(DISTINCT|ALL )DISTINCT短语:在计算时要取消指定列中的重复值ALL短语:不取消重复值; ALL为缺省值572022/7/18使用集函数例 查询学生总人数。 SELECT COUNT(*) FROM Student;例 查询选修了课程的学生人数。

41、SELECT COUNT(DISTINCT Sno) FROM SC;注:用DISTINCT以避免重复计算学生人数例 计算1号课程的学生平均成绩。 SELECT AVG(Grade) FROM SC WHERE Cno= 1 ;例 查询选修1号课程的学生最高分数。 SELECT MAX(Grade) FROM SC WHERE Cno= 1 ; 582022/7/18对查询结果分组 使用GROUP BY子句分组 细化集函数的作用对象 未对查询结果分组,集函数将作用于整个查询结果 对查询结果分组后,集函数将分别作用于每个组 分组方法:按指定的一列或多列值分组,值相等的为一组使用GROUP BY子

42、句后,SELECT子句的列名列表中只能出现分组属性和集函数例 求各个课程号及相应的选课人数。 SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;592022/7/18对查询结果分组SELECT productid, orderid,quantity FROM orderhistSELECT productid,SUM(quantity) AS total_quantity FROM orderhist GROUP BY productidproductidtotal_quantity115235345productidorderidquantity11511

43、102110222531153230productidtotal_quantity235Only rows thatsatisfy the WHERE clause are groupedSELECT productid,SUM(quantity) AS total_quantity FROM orderhist WHERE productid = 2 GROUP BY productid602022/7/18对查询结果分组GROUP BY子句的作用对象是查询的中间结果表使用HAVING短语筛选最终输出结果只有满足HAVING短语指定条件的组才输出例 查询选修了3门以上课程的学生学号。 SEL

44、ECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) 3;612022/7/18对查询结果分组SELECT productid, orderid, quantity FROM orderhistSELECT productid, SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid HAVING SUM(quantity)=30productidtotal_quantity235345productidorderidquantity1151110211022253115323062

45、2022/7/18对查询结果分组HAVING短语与WHERE子句的区别作用对象不同WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组 WHERE子句中不能使用聚集函数;而HAVING短语中可以使用聚集函数632022/7/184.4.1 数据查询1. 单表查询2. 连接查询连接查询是关系数据库中最主要的查询等值连接、自然连接、非等值连接查询、自身连接查询、外联接查询、复合条件连接查询3. 嵌套查询4. 集合查询642022/7/182. 连接查询 同时涉及多个表的查询称为连接查询用来连接两个表的条件称为连接条件或连接谓词 连接谓词中的列名称为

46、连接字段连接条件中的各连接字段类型必须是可比的,但不必是相同的SQL中连接查询的主要类型 (1) 广义笛卡尔积 (2) 等值(含自然连接)与非等值连接查询 (3) 自身连接查询 (4) 外连接查询 (5) 复合条件连接查询652022/7/18(1) 广义笛卡尔积 不带连接谓词的连接(即没有WHERE子句)。广义笛卡尔积是两表元组的交叉乘积,其连接的结果会产生没有意义的元组,实际上很少使用。例: SELECT Student.* , SC.* FROM Student, SC662022/7/18(2) 等值与非等值连接查询 等值连接、自然连接,和非等值连接等值连接连接运算符为 = 的连接操作

47、 . = .任何子句中引用表1和表2中的同名属性时,都必须加表名前缀引用唯一属性名时可以加也可以省略表名前缀。672022/7/18等值连接例 查询每个学生及其选修课程的情况。SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno;Student表 SC表 Sno SnameSsexSageSdept95001 李勇 男 20 CS95002 刘晨 女 19 IS95003 王敏 女 18 MA95004 张立 男 19 ISSno CnoGrade95001 1 9295001 2 859500138895002290

48、95002380结果表 Student.Sno Sname Ssex Sage Sdept SC.Sno Cno Grade 95001 李勇 男 20 CS95001 1 92 95001 李勇 男 20CS95001 2 85 95001 李勇 男 20CS95001 3 88 95002 刘晨 女 19IS 95002 2 90 95002 刘晨 女 19IS95002 3 80 682022/7/18自然连接例 查询每个学生及其选修课程的情况。SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno;Student

49、表 SC表 Sno SnameSsexSageSdept95001 李勇 男 20 CS95002 刘晨 女 19 IS95003 王敏 女 18 MA95004 张立 男 19 ISSno CnoGrade95001 1 9295001 2 85950013889500229095002380结果表 Student.Sno Sname Ssex Sage Sdept SC.Sno Cno Grade 95001 李勇 男 20 CS95001 1 92 95001 李勇 男 20CS95001 2 85 95001 李勇 男 20CS95001 3 88 95002 刘晨 女 19IS 95

50、002 2 90 95002 刘晨 女 19IS95002 3 80 等值连接的一种特殊情况,把目标列中重复属性去掉SELECT Student.Sno,Sname,Ssex,Sage, Sdept,Cno,Grade FROM Student,SC WHERE Student.Sno = SC.Sno;结果表 Student.Sno Sname Ssex Sage Sdept Cno Grade 95001 李勇 男 20 CS 1 92 95001 李勇 男 20 CS 2 85 95001 李勇 男 20 CS 3 88 95002 刘晨 女 19 IS 2 90 95002 刘晨 女

51、19 IS 3 80 692022/7/18自然连接目标列中的属性可能需要加表前缀。SELECT buyer_name, sales.buyer_id, qty FROM buyers , sales WHERE buyers.buyer_id = sales.buyer_idsalesbuyer_idprod_idqty114323151553711421003buyersbuyer_nameAdam BarrSean ChaiEva CoretsErin OMeliabuyer_id1234Resultbuyer_nameAdam BarrAdam BarrErin OMeliaEva C

52、oretsbuyer_idqty11431553711Erin OMelia41003702022/7/18连接查询内连接典型的联接运算,使用像 = 或 之类的比较运算符)。包括相等联接和自然联接。 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行SQL Server 的语法格式,INNER 可以省略SELECT buyer_name, sales.buyer_id, qty FROM buyers INNER JOIN sales ON buyers.buyer_id = sales.buyer_idsalesbuyer_idprod_idqty114323151553711421

53、003buyersbuyer_nameAdam BarrSean ChaiEva CoretsErin OMeliabuyer_id1234Resultbuyer_nameAdam BarrAdam BarrErin OMeliaEva Coretsbuyer_idqty11431553711Erin OMelia41003712022/7/18连接查询(2) 等值与非等值连接查询非等值连接查询 . .比较运算符:、=、 b.buyer_idsales bbuyer_idprod_idqty114323151553711421003sales abuyer_idprod_idqty114323

54、151553711421003Resultbuyer14prod_d_id121b.buyer_d_ida.buyer_id242131311414535321242424752022/7/18(4) 外连接(Outer Join) 外连接与普通连接的区别普通连接操作只输出满足连接条件的元组外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出外连接在表名后面加外连接操作符指定非主体表非主体表有一“万能”的虚行,该行全部由空值组成虚行可以和主体表中所有不满足连接条件的元组进行连接由于虚行各列全部是空值,因此与虚行连接的结果中,来自非主

55、体表的属性值全部是空值 左外连接列出左边关系中所有的元组右外连接列出右边关系中所有的元组762022/7/18(4) 外连接(Outer Join) 例 查询每个学生及其选修课程的情况包括没有选修课程的学生SELECT Student.Sno,Sname,Ssex, Sage,Sdept,Cno,Grade FROM Student LEFT JOIN SC ON (Student.Sno = SC.Sno) Sno SnameSsexSageSdept95001 李勇 男 20 CS95002 刘晨 女 19 IS95003 王敏 女 18 MA95004 张立 男 19 ISSno Cno

56、Grade95001 1 9295001 2 85950019500295002 3 2 3 88 90 80结果: Student.Sno Sname Ssex Sage Sdept Cno Grade 95001 李勇 男 20 CS 1 92 95001 李勇 男 20 CS 2 85 95001 李勇 男 20 CS 3 88 95002 刘晨 女 19 IS 2 90 95002 刘晨 女 19 IS 3 80 95003 王敏 女 18 MA 95004 张立 男 19 IS772022/7/18(4)外连接(Outer Join )外连接SQL Server 2000中左外连接的

57、表示SELECT buyer_name, sales.buyer_id, qty FROM buyers LEFT OUTER JOIN sales ON buyers.buyer_id = sales.buyer_idsalesbuyer_idprod_idqty114323151553711421003buyersbuyer_nameAdam BarrSean ChaiEva CoretsErin OMeliabuyer_id1234Resultbuyer_nameAdam BarrAdam BarrErin OMeliaEva Coretsbuyer_idqty11431553711Er

58、in OMelia41003Sean Chai2NULL782022/7/18(5)复合条件连接WHERE子句中含多个连接条件时,称为复合条件连接复合条件连接可以看作(普通)连接后得到的关系(表)又进行一次选择运算例查询选修2号课程且成绩在90分以上的所有学生的 学号、姓名SELECT Student.Sno, student.Sname FROM Student, SC WHERE Student.Sno = SC.Sno AND /* 连接谓词*/ SC.Cno= 2 AND /* 其他限定条件 */ SC.Grade 90; /* 其他限定条件 */792022/7/18(5)复合条件连

59、接多表连接:连接操作可以是多个表以上的连接例 查询每个学生的学号、姓名、选修的课程名及成绩。 SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno = SC.Sno and SC.Cno = Course.Cno;结果:Student.Sno Sname Cname Grade 95001 李勇 数据库 92 95001 李勇 数学 85 95001 李勇 信息系统 88 95002 刘晨 数学 90 95002 刘晨 信息系统 80 802022/7/18(5)复合条件连接多表连接的结果可以

60、看作是两表连接结果与第三表的连接,并依此类推SELECT buyer_name, prod_name, qty FROM buyers, sales , produce WHERE buyers.buyer_id = sales.buyer_id AND d_id = d_idproduceprod_idprod_name1234ApplesPearsOrangesBananas5Peachesbuyersbuyer_id1234buyer_nameAdam BarrSean ChaiEva CoretsErin OMeliasalesbuyer_id1

温馨提示

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

评论

0/150

提交评论