第4章结构化查询语言—SQL(StructuredQueryLanguage)结构化查询语言—SQL数据库模式的建立和删除表结构的建立、修改和删除表内容的插入、修改和删除视图的建立、修改和删除SQL查询SQL概述SQL是美国国家标准局(ANSI)从1986年首次推出的一种关系数据库语言。它的版本变更有:SQL86-SQL89-SQL2-SQL3,普遍使用的版本是:SQL2。注意将本章介绍的SQL与第8、9章介绍的SQLServer2000相区别,我们这一章介绍的是标准SQL,而后面介绍的是根据这个标准实现的一个具体的关系数据库管理系统,它根据本身的特点对标准SQL进行了修改和扩充,增强了数据处理和有关方面的功能。SQL具有数据定义(DDL)、数据操纵(DML)、数据控制(DCL)等功能。SQL的数据定义功能能够定义数据库的三级模式结构,即外模式、全局模式和内模式结构。外模式又叫视图(View)、全局模式简称模式(Schema)或数据库(Database),内模式由系统根据数据库模式自动实现,一般无需用户过问。在SQL中,每个关系又叫做基本表或表(Table),每个关系中的属性又叫字段或列,元组又叫行。一个数据库由若干基本表组成,通常一个基本表对应存储在外存数据库空间的一个存储文件中。SQL概述每个视图也是一个关系,它由基本表产生出来,有自己独立的结构定义,但没有独立的数据存在,它的数据来自基本表,间接地来自存储基本表的数据存储文件,所以又称视图为虚表,而基本表为实表。SQL的数据操纵功能包括对基本表和视图的数据查询、插入、删除和修改,特别是具有很强的数据查询功能。SQL的数据控制主要是对用户的访问权限加以控制,以保证系统的安全性。由DBA负责进行控制和管理。SQL概述数据库模式的建立建立数据库模式的命令:CREATE{SCHEMA|DATABASE}数据库名[AUTHORIZATION所有者名]例:createdatabaseSC//建立SC数据库语句说明:标识符/大小写等效数据库的所有者必须为数据库系统的合法用户,且具有建立数据库的权限打开数据库:USE数据库名数据库模式的删除删除数据库模式的命令:DROP{SCHEMA|DATABASE}数据库名例:DROPdatabaseSC//删除SC数据库在实际操作中建立和删除数据库模式通常是通过窗口界面实现的表结构的建立CREATETABLE表名(…请看书…)每个列后面的完整性约束称为列级完整性约束,它给出对该列数据的完整性约束条件;列级完整性约束有六种。表级完整性约束在所有列定义后给出,它包括四种(主码约束PRIMARYKEY、单值约束UNIQUE、外码约束FOREIGNKEY…REFERENCES…和检查约束CHECK)表结构的数据类型数据类型1、char(n):定长字符型2、int/integer:整型/整数型,占用4个字节3、float:浮点型/实数型,占用4或8个字节4、date/datetime:日期型,占用4或8个字节,格式为yyyy-mm-dd或yyyy/mm/dd字符数据和日期数据在书写时用单引号括起来表结构的列级完整性约束列级完整性约束—对该列数据的完整性约束条件,有六种:1、DEFAULT常量表达式:默认值约束2、NULL/NOTNULL:空值/非空值约束3、PRIMARYKEY:主码约束4、UNIQUE:单值约束/惟一值约束5、REFERENCES父表名(主码):外码约束6、CHECK(逻辑表达式):检查约束当一个列规定为主码时,就隐含规定该列为非空和单值。当一个列虽然没有规定为主码,但若同时规定为非空和单值,则它是一个候选码。表结构的表级完整性约束表级完整性约束—对数据表的完整性约束条件,有四种:1、PRIMARYKEY(列名,…):主码约束2、UNIQUE(列名,…):单值约束3、FOREIGNKEY(列名,…)REFERENCES父表名(主码列名,…):外码约束4、CHECK(逻辑表达式):检查约束除默认值约束和空值/非空值约束外,对于其他约束,若只涉及到一个列时,则既可以作为列级完整性约束,又可以作为表级完整性约束,当然只能取其一使用,若涉及到多个列时,则只能作为表级完整性约束来定义表结构的修改ALTERTABLE表名{…请看书…}向已定义过的表中添加(ADD)一些列的定义或一些表级完整性约束,或者从已定义过的表中删除(DROP)一些列或一些完整性约束。语句说明表结构的删除DROPTABLE[…]表名从当前或给定的数据库中删除一个表。语句说明:必须先删除与该表关联的所有子表,或者删除所有相应的外码约束表内容的插入单行插入INSERT[INTO]表名(列名,…)VALUES(列值,…)多行插入INSERT[INTO]表名(列名,…)SELECT子句SELECT子句说明表内容的修改UPDATE[…]表名SET列名=表达式,…[FORM源表名,…][WHERE逻辑表达式]语句说明:FROM选项(给出非当前表),WHERE选项(若省略该选项,则修改目的表中的所有记录)职工表职工1表职工号姓名性别年龄基本工资010405李鱼女281560职工号姓名性别年龄职务基本工资职务津贴010203李英女32副处1750450010408刘秀男25科员1650300010506王强男52处长2100550010526赵红女38科长1800400010715朱阳男40科长1900400表内容的删除DELETE[FROM]表名[FROM源表名…][WHERE逻辑表达式]语句功能:删除表中满足条件的所有行语句说明:FROM选项(给出非当前表),WHERE选项(给出删除记录的条件,若省略则删除表中的所有记录)视图的概念视图(View)是在基本表之上建立的表,它的结构和内容都来自基本表,它依据基本表存在而存在广义地说,视图可以在任何一个或多个表上建立,这些表包括基本表和称作逻辑表的视图在内视图的建立和删除只影响视图本身,不影响对应的表,而对视图内容的更新(插入、删除、修改)直接影响基本表当视图来自多个基本表时,通常只允许对视图作适当的修改(如对非主属性的修改),不允许做插入和删除数据的操作对视图进行查询,和对基本表进行查询完全一样,没有差别视图的建立CREATEVIEW视图名(列名,…)ASselect子句语句功能:在当前数据库中,根据SELECT子句的查询结果建立一个视图,包括视图的结构和内容语句说明语句举例表4-1学生基本表学生号姓名性别专业0101001王明男计算机0102005刘芹女电子0202003张鲁男电子0303001赵红女电气0304006刘川男通信表4-2课程基本表课程号课程名课程学分C001C++语言4C004操作系统3E002电子技术5X003信号原理4表4-3选课基本表学生号课程号成绩0101001C001780101001C004620102005E002730202003C001940202003C004650202003X003800303001C001760304006E00272使用视图的好处数据库规范化是逐步分解的过程,而视图是把分解的关系按需要连接起来的过程使用视图还能够增强数据库的安全性,既让某些用户只能访问数据库的一部分内容使用视图还可根据用户的习惯命名视图中的列名在设计表时考虑到关系的规范化要求,不能把通过计算得到的属性作为关系的属性,因为那将产生传递依赖,但为了日常查询的方便,这些属性完全可以在视图中定义视图内容的修改UPDATE视图名SET列名=表达式,…[FORM源表名,…][WHERE逻辑表达式]语句功能:按照一定的条件,对当前视图或指定数据库中视图的一些列值进行修改语句说明:与表内容的修改语句的格式一样视图定义的修改ALTERVIEW视图名(列名,…)ASselect子句语句功能:在当前数据库中修改已知视图的列,它与SELECT子句的查询结果相对应语句说明语句举例视图的删除DROPVIEW视图名语句功能:删除当前数据库中的一个视图语句举例SQL查询(重点)SELECT查询语句具有丰富的数据查询功能,能够实现关系运算中的大多数运算,如选择、投影、连接、并等,并且还带有分组、排序、统计等数据处理功能。SELECT查询语句的结果有多种可能,有可能为空、单值元组、一个多值元组等,若为单值元组时,此查询可以作为一个数据项出现在任何表达式中。SELECT语句可以作为一个语句成分(即子查询)出现在各种语句中,若在SELECT语句的WHERE选项中仍使用一个SELECT语句,则称为SELECT语句的嵌套。SQL查询只对应一条语句,即SELECT语句。该语句带有丰富的选项(子句),每个选项都由一个特定的关键字标识,后跟一些需要用户指定的参数。SQL查询(重点)SELECT语句格式SELECT…规定结果中的列等INTO…将查询结果写入到一个基本表中FROM…指定要查询的基本表或视图WHERE…指定查询的条件或源表的连接条件GROUPBY…指定将查询结果分组的依据HAVING…筛选出符合条件的分组统计信息ORDERBY…将查询结果进行排序SELECT选项规定在查询结果中每一行(即查询结果中的每一条记录)所包含的列规定在查询结果中是否允许出现重复的行(即内容完全相同的记录)Select表达式中允许使用字段函数做“投影”运算Select[all|distinct]{表达式1[[as]列名]…|*|表别名.*}例:selectall分类名from商品表1SELECT语句中使用的列函数COUNT([all|distinct]列名|*)个数MAX(列名)最大值MIN(列名)最小值AVG(列名)平均值SUM(列名)和FROM选项提供用于查询的基本表和视图,并可以为每个基本表取一个别名。别名的作用:作为列名的前缀限定符,以区别于其他源表中相同的列名。如果源表的表名较长,取个简单的别名方便使用。做“连接”运算例:…from商品表1asx,商品表2asy…例:…from学生x,课程y,选课zwherex.学生号=z.学生号FROM选项的新功能新版SQL中,FROM选项可实现表的连接功能。中间连接from表名1innerjoin表名2on表名1.连接列名1比较符表名2.连接列名2双重循环:外循环依次扫描第一个表中的每个元组,内循环依次扫描每二个表中的每个元组,当满足连接条件时就连接起来形成中间表中的一个新元组。FROM选项的新功能左连接from表名1leftjoin表名2on表名1.连接列名1比较符表名2.连接列名2双重循环:外循环依次扫描第一个表中的每个元组,内循环依次扫描每二个表中的每个元组,当满足连接条件时就连接起来形成中间表中的一个新元组。左表处理:第一个表中没有形成连接的所有元组也加入到中间表中,这些元组在第二个表上所对应的列值被自动置为空。FROM选项的新功能右连接from表名1rightjoin表名2on表名1.连接列名1比较符表名2.连接列名2双重循环:外循环依次扫描第一个表中的每个元组,内循环依次扫描每二个表中的每个元组,当满足连接条件时就连接起来形成中间表中的一个新元组。右表处理:第二个表中没有形成连接的所有元组也加入到中间表中,这些元组在第一个表上所对应的列值被自动置为空。WHERE选项该子句的功能是指定对记录的筛选条件和源表之间的连接条件。格式:where逻辑表达式做“选择”运算例:…where单价2000…例:…where商品表1.商品号=商