第3章关系数据库标准语言SQL2020/4/83.1SQL概述3.2数据定义3.3数据查询3.4数据更新3.5视图3.6案例2:活期储蓄管理系统数据库上的查询第3章关系数据库标准语言SQL2020/4/83.1SQL概述SQL(StructuredQueryLanguage)的字面意思是结构化的查询语言,但它的功能并不仅仅是查询,它是关系数据库管理系统的标准语言。3.1.1SQL的主要功能SQL语言按照功能可以分为3大类:DDL(DataDefinitionLanguage)数据定义语言用于定义关系数据库的模式、外模式和内模式,以实现对数据库基本表、视图及索引文件的定义、修改和删除等操作。最常用的DDL语句是CREATE、DROP和ALTER命令。DML(DataManipulationLanguage)数据操纵语言用于完成数据查询和数据更新操作。其中数据更新指对数据进行插入、删除和修改操作。最常使用的DML语句是SELECT、INSERT、UPDATE和DELETE命令。第3章关系数据库标准语言SQL2020/4/8DCL(DataControlLanguage)数据控制语言用于控制对数据库的访问,服务器的关闭、启动等操作。常使用的DCL命令有:GRANT、REVOKE等。3.1.2SQL的特点语言简洁,风格统一,易学易懂SQL语言接近英语,只用几个英文单词的组合就能完成所有功能,因此初学者非常容易上手。既是自含式语言,又是嵌入式语言作为自含式语言,SQL能够独立地用于联机交互的使用方式。当作为嵌入式语言使用时,SQL语句几乎可以不加修改地嵌入到如VB、PB这样的前端开发平台上,利用前端工具的计算能力和SQL的数据库操纵能力,可以快速地建立数据库应用程序。高度非过程化用SQL语言进行数据操作,只要提出“做什么”,而无须知道“怎么做”,SQL语句的实现过程由系统自动完成。第3章关系数据库标准语言SQL2020/4/83.1.3SQL对象命名约定SQL对象包括数据库、表、视图、属性名等。这些对象名必须符合一定规则或约定,一般应遵守下列规则。数据对象名可以为1-30个字符(在MSAccess为64个字符),但有些DBMS限制为8个字符,例如:Oracle数据库就是如此。数据对象名应以字母开头,其余字符可以由字母、数字、下划线组成。3.1.4SQL语句结构和书写准则在SQL语句语法格式中的一些约定符号:尖括号“”中的内容为实际语义。中括号“[]”中的内容为任选项。[,...]意思是“等等”,即前面的项可以重复。第3章关系数据库标准语言SQL2020/4/8大括号“{}”与竖线“|”表明此处为选择项,在所列出的各项中仅需选择一项。例如:{A|B|C|D}意思是A、B、C、D中取其一。SQL中的数据项(包括列项、表和视图)分隔符为“,”;其字符串常数的定界符用单引号“′”表示。在编写SQL语句时,遵从某种准则以提高语句的可读性,使其易于编辑,是很有好处的。以下是一些通常的准则:SQL语句对大小写不敏感为了提高SQL语句的可读性,子句开头的关键字通常采用大写形式。SQL语句可写成一行或多行,习惯上每个子句占用一行。关键字不能在行与行之间分开,并且很少采用缩写形式。SQL语句的结束符为分号“;”,分号必须放在语句中的最后一个子句后面,但可以不在同一行。第3章关系数据库标准语言SQL2020/4/83.2数据定义SQL语言的数据定义功能包括定义数据库、定义基本表、定义索引和定义视图。其基本语句如表3-1所示。表3-1SQL的数据定义语句操作对象操作方式创建语句删除语句修改语句数据库CREATEDATABASEDROPDATABASEALTERDATABASE基本表CREATETABLEDROPTABLEALTERTABLE索引CREATEINDEXDROPINDEX视图CREATEVIEWDROPVIEW第3章关系数据库标准语言SQL2020/4/8基本表是独立存储在数据库中的表在SQL中一个关系对应一个基本表,一个(或多个)基本表对应一个存储文件,基本表对应的数据必须在数据库中存放。存储文件的物理结构对用户而言是透明的,用户无需关心。一个基本表可以根据需要带一个或多个索引,索引也存放在存储文件中。视图是由一个或几个基本表导出的,它的外部形式也是一个表,是由基本表中选取的行和列组成的视图本身不独立,它依附于基本表,在数据库中不存放视图对应的数据,而只存放关于视图的定义,因此视图只是一个虚表。第3章关系数据库标准语言SQL2020/4/83.2.1数据库的创建与删除创建数据库SQL使用命令CREATEDATABASE创建数据库,其一般语法如下:CREATEDATABASE数据库名;【例3-1】创建一个简单数据库。CREATEDATABASEMyDb;删除数据库SQL使用命令DROPDATABASE删除一个或多个数据库,其一般语法如下:DROPDATABASE数据库名1[,数据库名2][,…];【例3-2】删除数据库MyDb。DROPDATABASEMyDb;第3章关系数据库标准语言SQL2020/4/83.2.2表的创建与删除创建基本表创建基本表的结构是建立数据库最重要的一步,其一般语法如下:CREATETABLE表名(列名数据类型[列级完整性约束条件][,列名数据类型[列级完整性约束条件]][,…][,表级完整性约束条件][,…]);说明:表名是指要创建的基本表的名称,该名称应符合具体DBMS的标识符的命名规则。列名指的是表的属性名称。第3章关系数据库标准语言SQL2020/4/8定义表的各个属性时应指出其相应的数据类型和长度,不同DBMS支持的数据类型不完全相同,表3-2列出的是IBMDB2SQL支持的主要数据类型:类型表示类型说明数值型SMALLINT半字长二进制整数INT或INTEGER全字长二进制整数DECIMAL(p[,q])十进制数,共p位(含小数点),其中小数点后q位FLOAT双字长浮点数字符型CHAR(n)或CHARTER(n)长度为n的定长字符串,如果省略n,字符串长度被假定为1VARCHAR(n)最大长度为n的可变长字符串日期时间型DATE日期型,格式为YYYY-MM-DDTIME时间型,格式为HH.MM.SSTIMESTAMP日期加时间第3章关系数据库标准语言SQL2020/4/8关于完整性约束条件,需要说明以下几点:完整性约束条件分为列级完整性约束条件和表级完整性约束条件,它们之间的区别在于:列级完整性约束条件只能用于列,而表级完整性约束条件能够用于一张表中的多列。SQL的完整性约束条件有以下几种:•NOTNULL或NULL约束这个约束条件为列级完整性约束条件。NOTNULL为不允许该列存在空值,而NULL为允许该列存在空值。•UNIQUE约束UNIQUE约束是惟一性约束。即不允许表中的某一列或者某几列有重复的属性值。•DEFAULT约束DEFAULT约束为默认值约束,是列级完整性约束条件。当向表中插入一个新行时,如果对于特定列没有指定数值,则使用DEFAULT子句指定的默认值。第3章关系数据库标准语言SQL2020/4/8•CHECK约束CHECK约束是检验约束,为插入列中的数据指定约束条件。•PRIMARYKEY约束PRIMARYKEY约束即主键约束,是表级完整性约束条件。表中的主键可以是一列或列组,PRIMARYKEY约束可以使得主键的数值在每一行中各不相同。注意:PRIMARYKEY约束类似于UNIQUE约束,差别在于PRIMARYKEY约束中的列不可以为空。•FOREIGNKEY约束FOREIGNKEY约束是参照完整性约束,是用于约束外键的,也是表级完整性约束条件。第3章关系数据库标准语言SQL2020/4/8【例3-3】创建“学生表”student,它由学号id、姓名name、性别sex、班级号class、出生日期birthday等5个属性组成。其中学号不能为空,值必须惟一,且姓名也必须惟一和非空。CREATETABLEstudent(idCHAR(8)NOTNULLUNIQUE,nameVARCHAR(20)NOTNULLUNIQUE,sexCHAR(1)DEFAULT‘男’NOTNULL,classCHAR(4),birthdayDATE,sumintconstraintc2checksum2000,CONSTRAINTC1CHECK(sexIN(‘男’,‘女’)));第3章关系数据库标准语言SQL2020/4/8【例3-4】创建“班级信息表”class,它由班级号id、班级名name、班长monitor等3个属性组成,其中班级号是主键,班长是外键,它是【例3-3】学生表中学号的某个值。CREATETABLEclass(idCHAR(4)NOTNULL,nameVARCHAR(50)NOTNULL,monitorCHAR(8)CONSTRAINTC2PRIMARYKEY(id),CONSTRAINTC3FOREIGNKEY(monitor)REFERENCESstudent(id));说明:本例定义了2个列级约束、2个表级约束。CONSTRAINT子句定义的是表级约束,C2、C3是约束名,分别将id定义为主键,monitor定义为外键。第3章关系数据库标准语言SQL2020/4/8删除基本表当某个基本表不再需要时,可以使用DROPTABLE语句将它删除。其一般语法为:DROPTABLE表名;【例3-5】删除student表。DROPTABLEstudent;该语句一旦执行,基本表的定义、数据、此表上建立的索引和视图都将自动被删除掉。第3章关系数据库标准语言SQL2020/4/83.2.3表结构的修改SQL语言用ALTERTABLE命令修改基本表,其基本语法为:ALTERTABLE表名[ADD(新列名数据类型[完整性约束][,…])][DROP完整性约束名][MODIFY(列名数据类型[,…])];基本表的修改分3种情况:使用ADD子句增加新列和新的完整性约束条件【例3-6】在student表中增加“籍贯native_place”列,数据类型为字符型。ALTERTABLEstudentADDnative_placeVARCHAR(50);11第3章关系数据库标准语言SQL2020/4/8使用DROP子句删除指定的完整性约束条件【例3-7】删除student表学生姓名必须取惟一值的约束条件。ALTERTABLEstudentDROPUNIQUE(name);使用MODIFY子句修改基本表的列定义【例3-8】将student表name列的数据类型改为定长字符串型。ALTERTABLEstudentMODIFYnamechar(8)NOTNULL;注意:(1)修改列定义时,要将原来的列级约束条件写上,否则原有的列级约束会不起作用。(2)修改列定义时,有可能会破坏已有的数据,应事先作好备份工作。(3)SQL未提供删除属性列的语句,只能采取间接的方法。第3章关系数据库标准语言SQL2020/4/83.2.4建立索引索引的概念索引是建立在列上的一种数据库对象,它对表中的数据提供逻辑顺序,当在数据库表中搜索某一行时,可以通过使用索引来找到它的物理位置。索引建立后,什么时候使用索引以及使用哪一个索引(当有多个索引存在时),由DBMS内部根据情况自行决定,不需要人员干预。索引是动态的,每当数据库表的数据更新一次,相应的索引也随之更新。第3章关系数据库标准语言SQL2020/4/8建立索引在SQL语言中,建立索引使用CREATEINDEX命令,其一般语法为:CREATE[UNIQUE][CLUSTER]INDEX索引名ON表名(列名[次序][,列名[次序]][,…]);说明:(1)表名是要建立索引的基本表的名字。(2)列名是被建立索引