版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 关系数据库标准语言sql本 章 要 点1. 用结构化查询语言sql对数据库进行查询,是本书的重要内容,也是本章的重点。简单查询只涉及一个关系,是学习sql的基础。要求熟练掌握简单查询的选择条件、排序输出、聚合运算、分组处理等基本内容。2. 大量的查询要求涉及到两个或两个以上的关系,一种常用的方法是使用连接查询,所用的sql语句和关系代数表达式不仅完全等价,而且思路也完全一致。对不同的关系通过公共属性进行并、交、差的运算,是对多个关系进行查询的又一种方法。3. 嵌套查询类似于结构化程序设计中的多重循环,是对多个关系进行查询的有效方法。其中,相关子查询,因内外层相互关联,而略显复杂,应加深
2、理解。4. 对数据库中的数据进行插入、删除、修改操作,统称为更新。其格式简单,均不难掌握。5. 定义关系模式是sql语言的一个重要功能。重点应掌握表的定义。6视图是为便于应用而提出的逻辑上的关系。在理解视图概念的基础上,学会定义和查询视图。3.1 sql概述早在20世纪70年代,ibm公司san jose research laboratory研制了一个关系dbms原型系统system r。system r在发展关系数据库技术方面做了一系列具有重要性和创造性的贡献。其中之一,就是发展了一种非过程关系数据库语言,当时称之为sequel(structured english query langu
3、age)。1981年,在system r的基础上,ibm公司推出商品化的关系dbms sql/ds,并用sql缩名(structured query language)取代sequel。从此以后,sql不但用于ibm的db2,sql/400,qmf等dbms产品中,而且也广泛地用于许多非ibm公司的dbms产品中,例如oracle,informix,sybase,ms sql server等。1986年10月美国国家标准局(american national standard institute,简称ansi)的数据库委员会x3h2批准了sql作为关系数据库语言的美国标准。同年公布了sql标准
4、(简称sql-86)。1987年国际标准化组织(international organization for standardization,简称iso)也通过了这一标准。此后ansi不断修改和完善sql标准,并于1989年公布了sql-89标准,1992年又公布了sql-92标准。目前ansi即将公布正在酝酿的新标准sql-99,亦称sql3。自sql成为国际标准语言以后,各个数据库厂家纷纷推出各自的sql软件或与sql的接口软件。这就使大多数数据库均用sql作为共同的数据存放语言和标准接口,使不同数据库系统之间的互相操作有了共同的基础。sql成为国际标准,对数据库以外的领域也产生了很大影响
5、,有不少软件产品将sql语言的数据查询功能与图形功能、软件工程工具、软件开发工具、人工智能程序结合起来。sql已成为数据库领域中一个主流语言,被广泛应用在商用系统中。3.1.1 sql语言的特点sql是介于关系数据库与关系演算之间的一种结构化查询语言。尽管说sql是一个“查询语言”,但实际上,它的功能远非查询信息这么简单,主要包括数据查询(data query)、数据操纵(data manipulation)、数据定义(data definition)和数据控制(data control)功能,是一种通用的、功能强大同时又简单易学的关系数据库语言,其主要特点包括:1. 综合统一非关系模型的数据
6、语言一般都分为模式数据定义语言(schema data definition language,简称模式ddl)、外模式数据定义语言(subschema data definition language,简称外模式ddl或子模式ddl)、与数据存储有关的描述语言(data storage description language,简称dsdl)及数据操纵语言(data manipulation language,简称dml),分别用于定义模式、外模式、内模式和进行数据的存取与处置。其缺点是:当用户数据库投入运行后,如果需要修改模式,必须停止现有数据库的运行,转储数据,修改模式,编译后再重新装载
7、数据库,非常麻烦。sql语言集数据定义语言ddl、数据操纵语言dml、数据控制语言dcl的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动。用户在数据库系统投入运行后,还可以根据需要随时地逐步地修改模式,且并不影响数据库的运行,从而使系统具有良好的可扩展性。这就为数据库应用系统的开发提供了良好的环境。2. 高度非过程化非关系数据模型的数据操纵语言是面向过程的语言,若要完成某项请求时,必须指定正确的存储路径。sql语言是高度非过程化语言,当进行数据操作时,只要指出“做什么”,无须指出“怎么做”,存储路径对用户来说是透明的。因此无须了解存取路径,存储路径的选择以及sql语句的操作过
8、程由系统自动完成,减轻了用户负担,有利于提高数据独立性。3. 面向集合的操作方式非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。例如查询所有年龄在2022岁之间的学生姓名,用户必须一条一条地把满足条件的学生记录找出来(通常要说明具体处理过程,即按照哪条路径,如何循环等),而sql语言采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。4. 以同一种语法结构提供两种使用方式第一种方式是用户可以在终端键盘上键入sql命令,对数据库进行操作,能够独立地用于联机交互的使用方式,故称之为自含式语言;第二种方式是将sql语句嵌入到高
9、级语言(例如c,cobol,fortran,pl/1)程序中,供程序员设计程序时使用,所以又是嵌入式语言。而在两种不同的使用方式下,sql语言的语法结构基本上是一致的。这种以统一的语法结构提供两种不同的使用方式的做法,提供了极大的灵活性与方便性。5. 语言简洁,易学易用sql语言功能极强,语言十分简捷,完成核心功能只用了9个动词,分别如下四类:a) 数据查询:selectb) 数据定义:create、drop、alterc) 数据操纵:insert、update、deleted) 数据控制:grant、revoke3.1.2 sql语言的基本概念sql语言支持关系数据库三级模式结构,如图3.1
10、所示:用户4用户1用户3用户2sql用户 外模式视图1视图2view 模式基本表4基本表3基本表2基本表1 base table存储文件4存储文件3存储文件2存储文件1 内模式stored file图3.1 sql对关系数据库模式的支持其中外模式对应于视图(view)和部分基本表(base table),模式对应于基本表,内模式对应于存储文件(stored file)。一个sql模式(schema)是表和约束的集合。一个表(table)是行(row)的集合,每行是列(column)的序列,每列对应一个数据项。一个表可以是一个基本表,也可以是一个视图。基本表是本身独立存在的表,是实际存储在数据库
11、中的表。在sql中,一个关系就对应一个表。视图是从基本表或其他视图中导出来的表,它本身不独立存储在数据库中,也就是说数据库中只存放视图的定义而不存放视图的数据,这些数据仍存放在导出视图的基本表中。因此视图是一个虚表。一个基本表可以跨一个或多个存储文件,一个存储文件也可以存放一个或多个基本表,一个表可以带若干索引,索引也存放在存储文件中。每个存储文件与外部存储器上一个物理文件对应。存储文件的逻辑结构组成了关系数据库的内模式。用户可以用sql语句对视图和基本表进行查询等操作。在用户看来,视图和基本表是一样的,都是关系(即表格)。sql用户可以是应用程序,也可以是终端用户。sql语句可嵌入在宿主语言
12、的程序中使用,也能作为独立的用户接口,供交互环境下的终端用户使用。3.2 sql的数据定义功能关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有表、视图和索引。因此sql的数据定义功能包括定义表、定义视图和定义索引,如表3.1所示:操作对象操作方式创 建删 除修 改表create tabledrop tablealter table视图create viewdrop view索引create indexdrop index 表3.1 sql的数据定义语句从表3.1可以看出,sql通常不提供修改视图定义和修改索引定义的操作,这是因为视图是基于基本表的虚表,索引是依附于基本表的。
13、用户如果想修改视图定义或索引定义,只能先将它们删除掉,然后再重建。但有些关系数据库产品如oracle 允许直接修改视图定义。本节只介绍如何定义基本表和索引,视图的概念及其方法将在3.4节进行详细阐述。3.2.1基本表的定义、修改与删除1. 基本表的定义建立数据库最基本最重要的一步就是定义一些基本表。定义基本表,也就是定义基本表的结构。sql语言使用create table语句定义基本表,其一般格式如下:create table (列级完整性约束条件 ,列级完整性约束条件 ,);其中,是所要定义的基本表的名字,它可以由一个或多个属性(列)组成。建立的同时通常还可以定义与该表有关的完整性约束条件,
14、这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由dbms自动检查该操作是否违背这些完整性约束条件。如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。 【例3.1】建立一个“学生”表student,它由学号sno,姓名sname,性别ssex,年龄sage,入学时间sdate五个属性组成。其中学号、入学时间不能为空,值是惟一的,并且姓名取值也惟一。create table student(sno char(10) not null unique, /*列级完整性约束条件,sno取值惟一,不 许取空值*/sname char(20)
15、 unique,ssex char(1),sage int,sdate date not null unique);系统执行上面的create table语句后,就在数据库中建立一个新的空“学生”表student,并将有关“学生”表的定义及有关约束条件存放在数据字典中。定义表的各个属性时需要指明其数据类型及长度。不同的数据库系统支持的数据类型不完全相同。下面是sql提供的一些主要数据类型: 数值型integer 长整数(也可写成int)smallint 短整数real 取决于机器精度的浮点数double precision 取决于机器精度的双精度浮点数float(n) 浮点数,精度至少为n位数
16、字numeric(p,d) 定点数,由p位数字(不包括符号、小数点)组成,小数点后面有d位数字(也可写成decimal(p,d)或dec(p,d)) 字符串型char(n) 长度为n的定长字符串varchar(n) 具有最大长度为n的变长字符串graphic(n) 长度为n的定长圆形字符串vargraphic(n) 最大长度为n的变长图形字符串 位串型bit(n) 长度为n的二进制位串bit varying(n) 最大长度为n的变长二进制位串 时间型date 日期型,格式为yyyy-mm-ddtime 时间型,格式为hh.mm.sstimestamp 日期加时间2. 基本表的修改在基本表建立后
17、,可以根据实际需要对基本表的结构进行修改。sql语言用alter table语句修改基本表,其一般格式为:alter table add 完整性约束drop modify ;其中,是要修改的基本表,add子句用于增加新列和新的完整性约束条件,drop子句用于删除指定的完整性约束条件,modify子句用于修改原先的列定义,包括修改列名和数据类名。 增加列alter table . add ;在上述的命令中,方括号中的内容为任选项。如果用户本身就是被修改的表的创建者,则可略去表的创建者名,否则不可略去。【例3.2】向student表增加“所在系(sdept)”列,数据类型为char型。alter
18、table student add sdept char(15);不论基本表中原来是否已有数据,新增加的列一律为空值。 补充定义主码由于sql并不要求每个表都定义主码,因此提供了一个补充定义主码的命令,在需要时定义主码。alter table add primary key();当然,被定义为主码的列名表必须满足not null和惟一性条件。【例3.3】把student表中的“学号”定义为主码。alter table student add primary key(sno); 撤消主码定义如果定义了主码,系统一般在主码上自动建立索引,并在插入新行时,进行主码惟一性检查。这在插入大批数据时,会严
19、重地影响系统的性能。利用下面的命令,可以暂时撤消主码定义。alter table drop primary key; 补充定义外码alter table add foreign key()refernceson deleterestrict|cascade|set null;在上述命令中,花括号表示任选三项中的一项;restrict为默认项。 撤消外码定义定义了外码,须做引用完整性检查,这在有些情况下会影响系统的性能。为此,sql提供了撤消外码的命令,供必要时暂时撤消外码之用。alter table drop ;【例3.4】将年龄的数据类型改为半字长整数alter table student
20、modify sage smallint;修改原有的列定义有可能会破坏已有数据。【例3.5】删除学生姓名必须取惟一值的约束。alter table student drop unique(sname);sql没有提供删除属性列的语句,用户只能间接实现了这一功能,即先把表中要保留的列及其内容复制到一个新表中,然后删除原表,再将新表重命名为原表名。3. 基本表的删除当某个基本表不再需要时,可以使用drop table语句删除它。其一般格式为:drop table【例3.6】删除student表drop table student基本表一旦删除,表中的数据、此表上建立的索引和视图都将自动被删除掉。因
21、此执行删除基本表的操作一定要格外小心。3.2.2 索引的建立与删除索引属于物理存储的路径概念,而不是逻辑的概念。在定义基本表时定义索引,就会把数据库的物理结构和逻辑结构混在一起。建立索引是加快查询速度的有效手段。用户可以根据应用环境的需要,在基本表上建立一个或多个索引,以提供多种存取路径,加快查找速度。一般来说,建立与删除索引由数据库管理员dba或表的属主(即建立表的人)负责完成。系统在存取数据时会自动选择合适的索引作为存取路径,用户不必也不能选择索引。1. 索引的建立在sql语言中,建立索引使用create index语句,其一般格式为:create uniquecluster index
22、on (,);其中,是要建索引的基本表的名字。索引可以建立在该表的一列或多列上,各列名之间用逗号分隔。每个后面还可以用指定索引值的排列次序,可选asc(升序)或desc(降序),缺省值为asc。unique表明此索引的每一个索引值只对应惟一的数据记录。cluster表示要建立的索引是聚簇索引。所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。 【例3.7】 在student表中的sname(姓名)列上建立一个聚簇索引,并且student表中的记录将按照sname值的降序存放。create cluster index stusname on student (sname) desc
23、;用户可以在最常查询的列上建立聚簇索引以提高查询效率。显然在一个基本表上最多只能建立一个聚簇索引。建立聚簇索引后,更新索引列数据时,往往导致表中记录的物理顺序的变更,代价较大,因此对于经常更新的列不宜建立聚簇索引。【例3.8】 为学生课程数据库中的student,course,sc三个表建立索引。其中student表按学号升序建惟一索引,course表按课程号升序建惟一索引,sc表按学号升序和成绩降序建惟一索引。create unique index stusno on student(sno asc);create unique index coucno on course(cno asc)
24、;create unique index scno on sc(sno asc, cgrade desc);2. 索引的删除索引一经建立,就由系统使用和维护它,不需用户干预。建立索引是为了减少查询操作的时间。但如果数据增加删改频繁,系统会花费许多时间来维护索引。这时,可以删除一些不必要的索引。在sql语言中,删除索引使用drop index语句,其一般格式为:drop index ;【例3.9】删除student表的stusname索引。drop index stusname;删除索引时,系统会同时从数据字典中删去有关该索引的描述。 3.3 sql的数据查询功能数据库查询是数据库的核心操作。s
25、ql语言提供了select语句进行数据库的查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:select all|distinct,-需要哪些列from , -来自哪些表where -根据什么条件group by having order by asc|desc;整个select语句的含义是,根据where子句给出的条件表达式,从from子句指定的基本表或视图中找出满足条件的元组,再按select子句中的目标列表达式,选出元组中的属性值形成结果表。如果有group子句,则将结果按的值进行分组,该属性列值相等的元组为一个组。如果group子句带having短语,则只有满足指定条件的组才给
26、予输出。如果有order子句,则结果表还要按的值的升序或降序排序。select语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。select语句能表达所有的关系代数表达式。下面我们仍以学生课程数据库为例说明select语句的各种用法。学生课程数据库中包括三个表。学生表:student(sno,sname,ssex,sage,sdept) student由学号(sno)、姓名(sname)、性别(ssex)、年龄(sage)、所在系(sdept)五个属性组成,其中sno为主码。课程表: course(cno,cname,cpno,ccredit) course由课程号(cno)、
27、课程名(cname)、选修课号(cpno)、学分(ccredit)四个属性组成,其中cno为主码。学生选课表:sc(sno,cno,grade) sc由学号(sno)、课程号(cno)、成绩(grade)三个属性组成,主码为(sno,cno)。3.3.1 简单查询简单查询指数据源只涉及一个基本表或一个视图的查询。本节介绍单表查询,即数据源只涉及一张表的查询。1. 选择表中的若干列选择表中的若干列,既可以是选择表中的全部列,也可以是选择表中的部分列。选择表中的全部列或部分列,这就是投影运算。 查询指定的列在很多情况下,用户只对表中的一部分属性列感兴趣,这时可以通过在select子句的中指定要查询
28、的属性列。【例3.10】查询全体学生的学号、姓名、性别。select sno, sname, ssexfrom student;结果为:snosnamessex9512101李勇男9512102刘晨女9512103王敏女9521101张立男9521102吴宾男9521103张海男9531101钱小平男9531102王大力男【例3.11】查询全体学生的姓名、学号、性别和所在系。select sname,sno,ssex,sdeptfrom student;结果为:snamesnossexsdept李勇9512101男计算机系刘晨9512102女计算机系王敏9512103女计算机系张立952110
29、1男信息系吴宾9521102男信息系张海9521103男信息系钱小平9531101男数学系王大力9531102男数学系中各个列的先后顺序可以与表中的顺序不一致。用户可以根据应用的需要改变列的显示顺序。 查询全部列如果要查询表中的所有属性列,可以有两种方法:一种是在目标列名序列中列出所有的列名;另一种是如果列的显示顺序与其在表中定义的顺序相同,则可以简单地在目标列名序列中写星号*。【例3.12】查询全体学生的记录。select sno,sname,ssex,sage,sdeptfrom student等价于:select * from student结果为:snosnamessexsagesde
30、pt9512101李勇男19计算机系9512102刘晨女21计算机系9512103王敏女20计算机系9521101张立男18信息系9521102吴宾男21信息系9521103张海男22信息系9531101钱小平男20数学系9531102王大力男21数学系 查询经过计算的值:select子句中的可以是表中存在的属性列,也可以是表达式、常量或者函数。【例3.13】查询全体学生的姓名及其出生年份。在student表中只记录了学生的年龄,而没有记录学生的出生年份,但我们可以经过计算得到出生年份,即用当前年减去年龄,得到出生年份。因此实现此功能的查询语句为:select sname,2004-sagef
31、rom student;查询结果为:sname2004-sage李勇1985刘晨1983王敏1984张立1986吴宾1983张海1982钱小平1984王大力1983【例3.14】查询全体学生的姓名和出生年份,并在出生年份列前加入一个列,此列的每行数据均为year of birth常量值。select sname, year of birth, 2004-sagefrom student;查询结果为:snameyear of birth2004-sage李勇year of birth1985刘晨year of birth1983王敏year of birth1984张立year of birth
32、1986吴宾year of birth1983张海year of birth1982钱小平year of birth1984王大力year of birth1983注意:选择列表中的常量和计算是对表中的每行进行的。【例3.15】查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。select sname, year of birth:, 2004-sage, islower(sdept)from student;结果为:snameyear of birth2004-sageislower(sdept)李勇year of birth1985cs刘晨year of birth1983
33、cs王敏year of birth1984cs张立year of birth1986is吴宾year of birth1983is张海year of birth1982is钱小平year of birth1984ma王大力year of birth1983ma我们看到经过计算的列、函数的列和常量列的显示结果都没有列标题,通过指定列的别名可以改变查询结果的列标题,这对于算术表达式、常量、函数名的目标列尤为有用。改变列标题的语法格式为:列名|表达式 as 列标题或:列标题=列名|表达式例如,对于例3.15,可以定义如下列别名: select sname name, year of birth bi
34、rth, 2004-sage birthday, islower(sdept) department from student;结果为:namebirthbirthdayislower(sdept)李勇year of birth1985cs刘晨year of birth1983cs王敏year of birth1984cs张立year of birth1986is吴宾year of birth1983is张海year of birth1982is钱小平year of birth1984ma王大力year of birth1983ma2. 选择表中的若干元组前边我们介绍的例子都是选择表中的全部记
35、录,而没有对表中的记录行进行任何有条件的筛选。实际上,在查询过程中,除了可以选择列之外,还可以对行进行选择,使查询的结果更加满足用户的要求。 消除取值相同的行本来在数据库表中不存在取值全部相同的元组,但在进行了对列的选择后,在查询结果中就有可能出现取值完全相同的行了。取值相同的行在结果中是没有意义的,因此应消除掉。【例3.16】在选课表中查询有哪些学生选修了课程,要求列出学生的学号。select sno from sc查询结果如表所示:sno95121019512101951210195121029512102952110295211029521102952110295211039521103
36、953110195311019531102在这个结果中有许多重复的行(实际上一个学生修了多少门课程,其学号就在结果中重复几次)。如果想去掉结果表中的重复行,必须指定distinct短语:select distinct snofrom sc;执行结果为: sno95121019512102952110295211039531101distinct关键字在select的后边,目标列名序列的前边。如果没有指定distinct短语,则缺省为all,即保留结果表中取值重复的行。select sno 等价于: select all sno from sc; from sc; 查询满足条件的元组查询满足条件
37、的元组是通过where子句实现的。where子句常用的查询条件表如表3.2所示:查询条件谓 词比较(比较运算符)=,,=,=,!=,!,!; not+上述比较运算符确定范围between and, not between and确定集合in, not in字符匹配like, not like空 值is null, is not null多重条件(逻辑谓词)and, or表3.2 常用的查询条件(1)比较大小的查询【例3.17】查询电子工程系全体学生的学号、姓名。select sno, sname, from student where sdept=电子工程系结果为:snosname951203
38、梁栋951305李远【例3.18】查询所有年龄在20岁以下的学生姓名及其年龄。select sname, sage select sname, sagefrom student 或 from studentwhere sage=20;结果为:snamesage李勇19张立18【例3.19】查询考试成绩在70分以上(包括70分)的学生的学号。select distinct snofrom coursewhere grade=70;(2)确定范围的查询between.and和not between.and是一个逻辑运算符,可以用来查找属性值在或不在指定范围内的元组,其中between后边指定范围的
39、下限,and后边指定范围的上限。使用betweenand的格式为:列名|表达式not between 下限值 and 上限值between.and一般用于对数值型数据进行比较。列名或表达式的类型要与下限值或上限值的类型相同。“between 下限值 and 上限值”的含义是:如果列或表达式的值在下限值和上限值范围内,则结果为true,表明此记录符合查询条件。“not between 下限值 and 上限值”的含义正好相反:如果列或表达式的值在下限值和上限值范围内,则结果为false ,表明此记录不符合查询条件。【例3.20】查询年龄在2023岁之间的学生的姓名、系别和年龄。select sna
40、me, sdept, sagefrom studentwhere sage between 20 and 23;此句等价于:select sname, sdept, sage, from studentwhere sage=20 and sage=23;结果为: snamesdeptsage刘晨计算机系21王敏计算机系20吴宾信息系21张海信息系22钱小平数学系20王大力数学系21【例3.21】查询年龄不在2023之间的学生姓名、所在系和年龄。select sname, sdept, sagefrom studentwhere sage not between 20 and 23;此句等价于:
41、select sname, sdept, sage, from studentwhere sage23;结果为:snamesdeptsage李勇计算机系19张立信息系18(3)确定集合的查询in是一个逻辑运算符,可以用来查找属性值属于指定集合的元组。使用in的格式为: 列名 not in (常量1,常量2,常量n)用in进行比较的数据多数为字符型数据,当然也可以是数值数据。in的含义为:当列中的值与in中的某个常量值相同时,则结果为true,表明此记录为符合查询条件的记录;not in的含义正好相反:当列中的值与某个常量相同时,则结果为false,表明此记录为不符合查询条件的记录。【例3.22
42、】查询数学系和计算机系学生的姓名和性别。select sname, ssexfrom studentwhere sdept in (数学系,计算机系)此句等价于:select sname, ssexfrom studentwhere sdept=数学系 or sdept=计算机系【例3.23】查询既不是数学系,也不是计算机系学生的姓名和学号。select sname, snofrom studentwhere sdept not in (数学系,计算机系)此句等价于:select sname, snofrom studentwhere sdept!=数学系 and sdept!=计算机系(4)
43、字符匹配的查询like用于查找指定列名与匹配串常量匹配的元组。匹配串是一种特殊的字符串,其特殊之处在于它不仅可以包含普通字符,而且还可以包含通配符。通配符用于表示任意的字符或字符串。在实际应用中,如果需要从数据库中检索一批记录,但又不能给出精确的字符查询条件,这时就可以使用like运算符和通配符来实现模糊查询。在like运算符前边也可以使用not运算符,表示对结果取反。其一般格式如下:not like escape 其含义是查找指定的属性列值与相匹配的元组。可以是一个完整的空符串,也可以含有通配符%和_。其中:%(百分号)代表任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b结尾的
44、任意长度的字符串。如acb,addgb,ab等都满足该匹配串。_(下横线)代表任意单个字符,例如a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串。【例3.24】查询计算机系的学生的详细情况。select * select *from student 等价于: from studentwhere sdept like 计算机系; where sdept=计算机系;如果like后面的匹配串中不含通配符,则可以用=(等于)运算符取代like谓词,用!=或(不等于)运算符取代not like 谓词。【例3.25】查询所有姓张的学生姓名、学号和性别。select sn
45、ame, sno, ssexfrom studentwhere sname like 张%;【例3.26】查询名字中第二个字为“林”字的学生的姓名和学号。select sname, snofrom studentwhere sname like _ _林%;注意:一个汉字要占两个字符的位置,所以匹配串林前面需要跟两个“_”.【例3.27】查询所有不姓张的学生姓名。select snamefrom studentwhere sname not like 张%;如果用户要查询的字符串本身就含有%或_,这时就要使用escape短语对通配符进行转义了。【例3.28】查询db_design课程的课程号和
46、学分。select cno,ccreditfrom coursewhere cname like db_designescape;escape短语表示“”为换码字符,这样匹配串中紧跟在“”后面的字符“_”不再具有通配符的含义,转义为普通的“_”字符。(5)涉及空值的查询空值(null)在数据库中有特殊的含义,它表示不确定的值。例如,某些学生选修课程后还没有参加考试,所以这些学生是有选课记录,但没有考试成绩,因此考试成绩为空值。判断某个值是否为null值,不能使用普通的比较运算符(=、!=等)。而只能使用专门的判断null值的子句来完成。判断取值为空的语句格式为:列名 is null判断取值不为
47、空的语句格式为:列名 is not null【例3.29】查询无考试成绩的学生的学号和相应的课程号。select sno, cnofrom scwhere grade is null(6) 多重条件查询在where子句中可以使用逻辑运算符and和or来组成多条件查询。用and连接的条件表示必须全部满足所有的条件的结果才为true,用or连接的条件表示只要满足其中一个条件结果即为true。and的优先级高于or,但用户可以用括号改变优先级。【例3.30】查询计算机系年龄在20岁以下的学生姓名、学号。select sname,snofrom studentwhere sdept=cs and sa
48、ge20;3. 对查询结果进行排序有时我们希望查询结果能按一定的顺序显示出来,比如按考试成绩从高到低排列学生的考试情况。sql语句支持将查询的结果按用户指定的列进行排序的功能,而且查询结果可以按一个列排序,也可以按多个列进行排序,排序可以是从小到大(升序),也可以是从大到小(降序)。排序子句的格式为:order by asc|desc,n其中为排序的依据列,可以是列名或列的别名。asc表示对列进行升序排列,desc表示对列进行降序排列。如果没有指定排序方式,则默认的排序方式为升序排序。如果在order by子句中使用多个列进行排序,则这些列在该子句中出现的顺序决定了对结果集进行排序的方式。当指
49、定多个排序依据列时,首先按排在最前面的列进行排序,如果排序后存在两个或两个以上列值相同的记录,则对这些值相同的记录再依据排在第二位的列进行排序,依次类推。【例3.31】查询选修了“2”号课程的学生学号及其成绩,查询结果按成绩降序排列。select sno,gradefrom scwhere cno=2 order by grade desc结果为:snograde951210186951210278952110275952110368【例3.32】查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列。select * from studentorder by sdep
50、t, sage desc结果为:snosnamessexsagesdept9512102刘晨女21计算机系9512103王敏女20计算机系9512101李勇男19计算机系 (续表)9531102王大力男21数学系9531101钱小平男20数学系9521101张立男18信息系9521102吴宾男21信息系9521103张海男22信息系对于空值,若按升序排,含空值的元组将最后显示。若按降序排,空值的元组将最先显示。3.3.2连接查询前面介绍的查询都是针对一个表进行的,但有时需要从多个表中获取信息,因此,就会涉及到多张表。若一个查询涉及到两个或两个以上的表,则称之为连接查询。连接查询是关系数据库中最主要的查询,主要包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询。1. 等值与非等值
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026秋季国家管网集团华中公司高校毕业生招聘笔试备考试题(浓缩500题)含答案详解(夺分金卷)
- 2026秋季国家管网集团广西公司高校毕业生招聘笔试模拟试题(浓缩500题)附答案详解(突破训练)
- 2026秋季国家管网集团西北公司高校毕业生招聘考试参考试题(浓缩500题)含答案详解ab卷
- 2025国网辽宁省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解
- 2026国网天津市电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题及答案详解(夺冠)
- 2026秋季国家管网集团华南公司(广东省管网公司)高校毕业生招聘考试备考题库(浓缩500题)及答案详解(全优)
- 国家管网集团山东分公司2026届秋季高校毕业生招聘笔试参考题库(浓缩500题)附答案详解(精练)
- 2025国网天津市电力校园招聘(提前批)笔试模拟试题浓缩500题附答案详解(典型题)
- 2026国网山东省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解(预热题)
- 国家管网集团湖南公司2026届秋季高校毕业生招聘笔试备考试题(浓缩500题)及一套完整答案详解
- 行政执法三项制度培训会
- 2025至2030中国己二腈行业发展趋势分析与未来投资战略咨询研究报告
- 男生主题班会课件
- 初中美术课堂中绘画艺术与情感教育的结合实践论文
- 中医专科护理技术中医辨证施护制度
- 2025至2030中国军用无人机行业市场发展分析及发展趋势分析与未来投资战略咨询研究报告
- 人机交互技术及应用版课件完整版
- D级压力容器质量管理体系内审资料符合TSG07-2019附录M
- 环境表面清洁与消毒管理规范
- 农村私下卖房协议书
- 游泳馆转让店铺合同协议
评论
0/150
提交评论