东北大学,数据库开发技术,课件,第3章 SQL Server 与结构化查询语言SQL.ppt
东北大学东北大学,数据库开发数据库开发技术技术,课件课件,第第3章章 SQL Server 与结构化查询与结构化查询语言语言SQL3.1 SQL Server 2000数据库的特点 SQL Server 2000数据库是典型的服务器类型数据库,是开发C/S结构数据库应用系统常采用的数据库类型之一。 SQL Server 2000服务器提供了强有力的数据库管理功能,开发者可以使用企业管理器以可视界面的方式实现数据库,使用查询分析器运行调试SQL脚本,使用事件探查器监控对数据库的存取操作 SQL Server 2000数据库以逻辑名的方式进行标识,通过服务器名称(IP地址或主机名称)和数据库逻辑名称存取数据库,例如,如果服务器名称是BYTESERVER,数据库名称是GSCoreMS,可使用BYTESERVER.GSCoreMS存取数据库。存取SQL Server 2000数据库还需要网络协议和客户端网络库文件的支持 .3.1.1 数据类型 类别类别性质性质数据类型数据类型精确数精确数字字整数整数bigintintsmallinttinyint位位bitdecimal(p,s) numeric(p,s)货币数值货币数值moneysmallmoney近似近似数字数字float(n)real日期日期时间时间datetimesmalldatetime字符串字符串定长定长char(n)char(n)变长变长varchar(n)varchar(n)大量大量texttextUnicodeUnicode字符串字符串定长定长nchar(n)nchar(n)变长变长nvarchar(n)nvarchar(n)大量大量ntextntext二进制二进制数据数据定长定长binarybinary变长变长varbinaryvarbinary大量大量imageimage其它数其它数据类型据类型uniqueidentifieruniqueidentifiertabletabletimestamptimestampsql_variantsql_variantcursorcursor3.1.1 数据类型 不同数据库数据类型之间的转换关系 !使用BDE作为数据库引擎时Delphi的字段对象能够存取的数据类型(长度和精度)与Paradox数据库的相应数据类型相同,使用BDE存取SQL Server 2000数据库时必须注意这样的转换关系。例如,SQL Server 2000数据库中将某字段的数据类型设计为varchar(2000),从数据库设计和实现本身的角度来看这种设计是正确的,但从开发应用程序的角度来看就未必是正确的,使用BDE存取SQL Server 2000数据库时,BDE只能处理1-255个字符,剩余字符全部截断 3.1.2 完整性约束 SQL Server 2000提供了全面的数据库完整性实现支持,不仅提供了以声明方式实现大多数约束的功能,还提供了使用触发器机制和编写存储过程实现复杂业务规则的功能 SQL Server 2000声明方式实现的约束类型如下: 实体完整性实体完整性 参照完整性参照完整性 用户定义的完整性用户定义的完整性实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性不变性,应该由关系系统自动支持。3.1.2 完整性约束 实体完整性实体完整性: 若属性A是基本关系R的主属性,则属性A不能取空值例SAP(SUPERVISOR,SPECIALITY,POSTGRADUATE)POSTGRADUATE属性为主码(假设研究生不会重名),则其不能取空值关系模型必须遵守实体完整性规则的原因:关系模型必须遵守实体完整性规则的原因:(1) 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集或多对多联系。的一个实体集或多对多联系。(2) 现实世界中的实体和实体间的联系都是可区分的,即它们具有某种唯一现实世界中的实体和实体间的联系都是可区分的,即它们具有某种唯一性标识。性标识。(3) 相应地,关系模型中以主码作为唯一性标识。相应地,关系模型中以主码作为唯一性标识。(4) 主码中的属性即主属性不能取空值。主码中的属性即主属性不能取空值。 空值就是空值就是“不知道不知道”或或“无意义无意义”的值。的值。 主属性取空值,就说明存在某个不可标识的实体,即存在不可主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性。)点相矛盾,因此这个规则称为实体完整性。3.1.2 完整性约束 参照完整性:参照完整性:若属性(或属性组)F是基本关系R的外码与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为: 或者取空值(F的每个属性值均为空值) 或者等于S中某个元组的主码值。3.1.2 完整性约束 用户定义的完整性:用户定义的完整性:用户定义的完整性是针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求。关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不要由应用程序承担这一功能。例: 课程(课程号,课程名,学分) “课程名”属性必须取唯一值 非主属性“课程名”也不能取空值 “学分”属性只能取值1,2,3,43.1.3 SQL支持 SQL Server提供的SQL语言称为Transact-SQL与 SQL Server 通讯的所有应用程序都通过向服务器发送 Transact-SQL 语句来进行通讯,而与应用程序的用户界面无关如果能够充分利用Transact-SQL的特性,不仅能够减少开发工作量,而且能够开发出高质量的数据库应用程序。SQL Server的联机帮助中详细地介绍了Transact-SQL的语法和应用示例,请读者务必花足够时间学习并掌握Transact-SQL的程序设计方法 先花少量时间全面地了解(不是掌握是了解)所采用的开发技术或开发工具能够提供的开发和应用能力,勾画出关键的技术点并拟定各点的实践顺序,然后拿一个小规模但足够复杂的题目逐步实践,直到关键技术都掌握了为止 3.1.4 数据库安全 数据库安全包括存储安全和存取安全两个方面。存储安全涉及数据库的备份和恢复技术,存取安全涉及数据库存取权限技术 SQL Server 2000提供了比较完整的备份和恢复功能,例如完整备份、差异备份和相应的恢复功能,同时还能够使用检查点技术恢复数据库 SQL Server 2000提供的数据库存取安全机制分为两个层次,第一层是数据库的登录用户控制,第二层是登录用户对数据库对象的存取权限控制。SQL Server 2000的数据库登录用户有两种类型,一种是Windows局域网内的操作系统域用户,第二种是SQL Server服务器的登录用户。ADO支持两种类型的登录用户存取数据库,而BDE则只能支持服务器的登录用户这一种类型 3.2 SQL Server 2000数据库运用设计 安全设计 登录用户和密码。数据库的脚本安全保证:所有存储过程都加密 为了保护软件产品必须授权才能使用,将系统运行参数,如使用单位名称、部门等报表打印时必须打印的系统参数,以及软件是否已经注册的标识存储在一个加密的存储过程中。3.2 SQL Server 2000数据库运用设计 系统参数存储过程的名称为ap_RegInfo -从存储过程中读取系统运行参数CREATE PROCEDURE dbo.ap_RegInfo WITH ENCRYPTIONASBEGIN SELECT A = XX医学院,- 学校名称:XX医学院 B = 研究生部,- 使用部门:研究生部 C = CAST(0 AS BIT) - 0未注册,1已注册END3.2 SQL Server 2000数据库运用设计 数据字典(典型示例) 属性字段数据类型码可空约束代号UCodeSmallintPKN自动生成,种子0姓名UNamechar(8) N 口令PWchar(10) N默认值:0操作限制: 有一条初始记录:管理员用户0(装载实现)。 不能删除代号为0的管理员用户(使用触发器实现)。只有管理员用户登录程序可管理用户信息(应用程序实现)。 u 触发器实现约束 - 不能删除0用户(管理员用户)CREATE TRIGGER dbo.DelON dbo.UsersFOR DELETE AS BEGIN -删除代号为0,回滚 IF (SELECT UCode FROM deleted) = 0 ROLLBACKEND3.3 实现SQL Server 2000数据库 1) 确定数据库数据文件和日志文件存储路径,创建数据库。2) 创建数据库登录用户。3) 创建或修改表,创建表并设置字段的基本属性。4) 设置主码、惟一约束、Check约束和参照完整性约束。5) 装载必需的初始数据。6) 设置索引。v创建视图等其他数据库对象。7) 8) 如果数据库比较复杂,应标识出未实现的约束列表,以便在应用程序中实现。 3.3.1 创建数据库 在SQL Server 2000的企业管理器中创建数据库的过程如下 :右键单击所选服务器下的【数据库】节点,从上下文菜单中选择【新建数据库】菜单命名,然后在弹出的对话框中设置数据库的逻辑名称、数据文件的存储路径和文件属性以及日志文件的存储路径和文件属性 业务简单的小型数据库不需要设置过多的参数,只要指定一个数据文件和一个日志文件就足够了。如果数据库规模很大,则需要考虑多方面的因素,认真规划数据库的设置和配置。 3.3.2 创建数据库登录用户 如果服务器中已经存在登录用户,则直接将该登录用户设置为存取数据库的用户。设置方法是:在企业管理器的控制台树中打开所创建的数据库节点,如GScoreMS。右键单击该数据库节点下的【用户】节点,从上下文菜单中选择【新建数据库用户】菜单命令,在弹出的对话框中选择登录用户并将设置该登录用户存取数据库时的用户名和该用户存取数据库的角色(权限),通常应勾选“db_owner”角色 如果服务器中还未存在登录用户则打开服务器节点下的【安全性】节点,右键单击该节点下的【登录】节点,从上下文菜单中选择【新建登录】菜单命令,在弹出的对话框中设置登录用户名和密码,选择该登录用户存取的数据库 3.3.2 创建数据库登录用户 登录用户的身份验证有Windows身份验证方式和SQL Server登录验证两种模式,如果使用BDE数据库引擎存取数据库应选择SQL Server登录验证模式,使用ADO或dbExpress数据库引擎则选择Windows身份验证方式 选择【数据库访问】页 ,设置登录用户存取数据库的角色 3.3.3 创建或修改表,设置字段的基本属性 通过两种方式创建表 如果将现有的其他类型数据库移植到SQL Server 2000中,可使用企业管理器中的导入工具移植表和视图等数据库对象,导入后按照运用设计修改表和约束 如果将数据库运用设计规格说明直接实现为SQL Server 2000数据库,直接使用企业管理器中的窗口界面创建和修改表及约束 在企业管理器中创建或修改表的方法很简单:右键单击所选数据库下的【表】节点,然后从上下文菜单中选择【新建表】,然后在弹出的对话框中即可设置表的字段(列)名以及字段的基本属性(数据类型、是否允许空和默认值等),同时还可以设置表的主码、惟一约束、Check约束和参照完整性约束。 3.3.3 创建或修改表,设置字段的基本属性 3.3.4 设置表的属性和声明式约束 可直接在表设计窗口中提供的【属性】对话框设置表的基本属性和主码与惟一约束、Check约束以及外码约束等声明式约束 在表设计窗口中单击工具栏中的【表和索引属性】、【管理关系】、【管理索引/键】或【管理约束】按钮都可以激活【属性】对话框,该对话框提供了个页面,分别用于管理表的基本属性、表之间的关系、表的索引和候选码(主码与惟一约束)以及表的约束 3.3.5 数据库关系图 SQL Server 2000提供查看表之间关系图的工具 关系图工具虽然有点缺陷(不能生成关系图文档等),但还是比较好用的,使用关系图工具能够查看表之间的外码约束(关系图),在关系图界面中还可以创建和修改表、管理索引/键以及Check约束。 右键单击数据库的【关系图】节点,从上下文菜单中选择【新建数据库关系图】菜单命令,然后在弹出的表选择向导对话框中选择需要创建到关系图中的表,按照操作要求逐步操作即可创建所选表的关系图。 充分利用关系图工具设计表及其关系3.3.5 数据库关系图 3.3.6 在Visio中使用反向工程技术生成数据库关系图 Microsoft Visio工具是一个综合性质的建模工具,使用该工具可以创建数据库的关系图模型 在Visio中通过反向工程技术功能可以获取SQL Server 2000中数据库的模式信息,也可以直接在Visio中创建数据库的ER模型,然后将数据库模型创建到SQL Server 2000中 建模工具对于设计经验比较丰富的设计者比较好用,但对入门者却帮助很少,建议设计经验不够丰富的设计者尽量在纸张上设计数据库的ER模式,有了丰富的经验之后再使用建模工具辅助设计。 3.3.6 在Visio中使用反向工程技术生成数据库关系图 反向工程建立的数据库模型图TLevelPK,I2PK,I2UCodeUCodeI1I1UNameUNameCoursePK,I1PK,I1UCodeUCodeStudentPK,I1PK,I1UCodeUCodeFK5FK5SpecUCodeSpecUCodeFK3FK3PolityUCodePolityUCodeFK2FK2NationUCodeNationUCodeFK4FK4ProvinceUCodeProvinceUCodeFK1FK1DeptUCodeDeptUCodeDeptPK,I2PK,I2UCodeUCodeI1I1UNameUNameNationPK,I2PK,I2UCodeUCodeI1I1UNameUNamePolityPK,I2PK,I2UCodeUCodeI1I1UNameUNameProvincePK,I2PK,I2UCodeUCodeI1I1UNameUNameTchCrsFK1,I1FK1,I1CourseUCodeCourseUCodeFK2,I1FK2,I1TeacherUCodeTeacherUCodeTeacherPK,I1PK,I1UCodeUCodeFK2LevelUCodeFK1FK1DeptUCodeDeptUCodeSpecialtyPK,I2PK,I2UCodeUCodeI1I1UNameUNameStdCrsTchFK2,I1FK2,I1StudentUCodeStudentUCodeFK1,U1,I1FK1,U1,I1CourseUCodeCourseUCodeU1U1LYearLYearFK3FK3TeacherUCodeTeacherUCodeU1LTermu:Cd:Ru:Cd:Cu:Cd:Ru:Cd:Ru:Cd:Ru:Cd:Ru:Cd:Ru:Rd:Ru:Cd:Ru:Cd:Ru:Cd:Cu:Cd:R一、SQL的发展史 1974年IBM圣约瑟实验室的Boyce和Chamberlin为关系数据库管理系统System-R设计的一种查询语言,当时称为SEQUEL语言(Structured English Query Language),后简称为SQL。 1981年IBM推出关系数据库系统SQL/DS后,SQL得到了广泛应用。 1986年美国国家标准协会(ANSI)公布了第一个SQL标准SQL86。 1987年,ISO通过SQL86标准。3.4 SQL语言基本知识 1989年,ISO制定SQL89标准,SQL89标准在SQL86基础上增补了完整性描述。 1990年,我国制定等同SQL89的国家标准。 1992年,ISO制定SQL92标准,即SQL2。 1999年,ANSI制定SQL3标准。 在许多软件产品中,软件厂商都对SQL的基本命令集进行了扩充,将其扩展成嵌入式SQL语言。SQL Server 2000中使用Transact-SQL语言与数据库服务器打交道。 二、 SQL的特点SQL具有如下特点:1SQL(Structured Query Language)全称是结构化查询语言,是一种关系数据库语言,提供数据的定义、查询、更新和控制等功能。功能强大、能够完成各种数据库操作。2SQL语言不是一个应用程序开发语言,它只提供对数据库的操作能力,不能完成屏幕控制、菜单管理、报表生成等功能。3有利于各种数据库之间交换数据、有利于程序的移植、有利于实现程序和数据间的独立性;有利于实施标准化;3.书写简单、易学易用。 三、SQL的分类1、数据定义语言(DDL:Data Definition Language)创建、修改或删除数据库中各种对象,包括表、视图、索引等。2、查询语言(QL:Query Language)按照指定的组合、条件表达式或排序检索已存在的数据库中的数据,但并不改变数据库中数据。3、数据操纵语言(DML:Data Manipulation Language )对已经存在的数据库进行记录的插入、删除、修改等操作4、数据控制语言(DCL:Data Control Language)用来授予或收回访问数据库的某种特权、控制数据操纵事务的发生时间及效果、对数据库进行监视注意:在书写各种SQL 命令时,命令中所涉及的标点符号,如括号、逗号、分号、圆点(英文句号)等都应是英文半角,如果写成中文全角符号,则会在执行命令时出错。 数据定义命令用于建立数据库和建立、修改、删除基本表。数据定义命令用于建立数据库和建立、修改、删除基本表。一、 建立数据库ANSI标准SQL中建立数据库(SCHEMA:模式)的命令是:CREATE SCHEMA AUTHORIZATION ;例如:创建者是温翠灵,则上面命令写作:CREATE SCHEMA AUTHORIZATION 温翠灵;大多数的关系数据库管理系统(RDBMS),所使用的命令格式于ANSI SQL不同,这些RDBMS更常用下面命令格式:CREATE DATABASE ;例如建立学费管理数据库的命令是:CREATE DATABASE xfgl;3.5 数据定义命令二、 建立数据表建立基本表的命令格式为:CREATE TABLE (NOT NULL,NOT NULL,);其中:NOT NULL指的是该列的值不能为空值。例1:在SQL SERVER中建立如表4-2所示学生基本情况表的命令是:create table jbqk(number char(8)not null,name char(8)not null,sex char(2)not null,birthday datetime,department char(12);SQL Server 2000中常用的数据类型:Int或integer:整数,占用4个字节Decimal或numeric:数字数据类型,格式Decimal(数据长度,小数位数)float 和 real:浮点数,float更灵活一些datetime:代表日期和一天内的时间的日期和时间数据类型。从1753年1月1日到9999年12月31日的日期和时间数据,如:1998-01-01 23:59:59.993char:固定长度字符数据类型:格式:char(n)n 必须是一个介于 1 和 8,000 之间的数值,当使用字符型数据时需要用或”括起来。 建立的命令是:create table course(c_number char(4)not null,c_name char(20)not null,period decimal(3,0),t_number char(4) not null);建立教师表(teacher)的命令是::create table teacher(t_number char(4) not null,t_name char(8),title char(10);建立选课表(sle_course)的命令是::create table sle_course(number char(8) not null,c_number char(4),score decimal(3,0); 三、 数据表的修改1添加新列命令:ALTER TABLE ADD 列名 数据类型;例2:下面命令在jbqk表中添加“score”列。alter table jbqk add score decimal(3,0);2删除表中的列ALTER TABLE DROP COLUMN 列名;例3:下面命令在jbqk表中添加“成绩”列之后,再删除“score”列。alter table jbqk add 成绩 decimal(3,0);alter table jbqk drop column score;四、 数据表的删除DROP TABLE ;例4:删除刚才所建的jbqk表,使用如下命令格式:drop table jbqk; 五、 索引的建立与删除索引是对数据库表中一个或多个列的值进行排序的结构。可以利用索引快速访问数据库表中的特定信息。1建立索引语句CREATE UNIQUE INDEX 索引名 ON 基本表名(列名次序,列名次序);说明:索引可以建立在一列和多列之上,索引顺序可以是ASC(升序)或DESC(降序),缺省值是升序。UNIQUE表示每一个索引值对应唯一的数据记录。例5:在学生基本情况表jbqk之上建立一个关于学生表的索引文件。索引文件名为“学生索引”,索引建立在学号之上,按学号降序排序。Create index 学生索引 on jbqk(name desc);2删除索引语句DROP INDEX .;注意:该命令不能删除由CREATE TABLE或者ALTER TABLE命令创建的主键和唯一性约束索引,也不能删除系统表中的索引。例6:删除索引“学生索引”。程序如下:DROP INDEX JBQK.学生索引3.6 数据查询语言一、 查询语句格式SQL语言的查询语句一般格式是:SELECT ALL|DISTINCT, FROM ,WHERE GROUP BY HAVING ORDER BY ASC|DESC;下面对该命令进行一些说明: 1命令含义 从FROM子句指定基本表或视图中,根据WHERE子句的条件表达式查找出满足该条件的记录,按照SELECT子句指定的目标列表达式,选出元组中的属性值形成结果表。如果有GROUP BY子句,则将结果按“列名1”的值进行分组,该属性列值相等的元组为一个组;如果GROUP BY子句带有短语HAVING,则只有满足短语指定条件的分组才会输出。如果有ORDER BY子句,则结果表要按照的值进行升序和降序排列。SELECT ALL|DISTINCT实现的是对表的投影操作,WHERE 中实现的是选择操作。 2目标列表达式列表达式可以是“列名1,列名2”的形式;如果FROM子句指定了多个表,则列名应是“表名.列名”的形式。列表达式可以使用SQL提供的库函数形成表达式,常用的函数如下:COUNT(*):统计记录条数。COUNT(列名):统计一列值得个数。SUM(列名):计算某一数值型列的值的总和。AVG(列名):计算某一数值型列的值的平均值MAX(列名):计算某一数值型列的值的最大值MIN(列名):计算某一数值型列的值的最小值DISTINCT参数:表示在结果集中,查询出的内容相同的记录只留下一条。 二、 单表查询单表查询是指仅设计一个表的查询。1选择表中的列例1:选择jbqk表中的所有列。select * from jbqk;例2:选择jbqk表中的number、name、department列。select number,name,department from jbqk;例3:选择jbqk中所有各个系的名字,去掉重复行。select distinct department from jbqk;select 2003-year(birthday) from jbqk2选择表中的记录选择表中的记录是通过where子句实现的。例4:选择jbqk中所有计算机系的学生。Select * from jbqk where department=计算机系3条件表达式的构成查询查询条件条件运运 算算 符符说说 明明比比 较较,=,=,字符串比较从左向字符串比较从左向右进行右进行确定确定范围范围BETWEEN AND,NOT BETWEEN ANDBETWEEN后是下后是下限,限,AND后是上限后是上限确定确定集合集合IN,NOT IN检查一个属性值是检查一个属性值是否属于集合中的值否属于集合中的值字符字符匹配匹配LIKE,NOT LIKE用于构造条件表达用于构造条件表达式中的字符匹配式中的字符匹配空空 值值IS NULL,IS NOT NULL当属性值内容为空当属性值内容为空时,要用此运算符时,要用此运算符逻辑逻辑运算运算AND,OR,NOT用于构造复合表达用于构造复合表达式式例5:查询考试成绩不及格学生的学号。SELECT DISTINCT number FROM sle_course WHERE score 60;例6:查询学时在6070之间的课程名称和学时。SELECT c_name,period FROM course WHERE period BETWEEN 60 AND 70例7:查询学时不在在6070之间的课程名称和学时。SELECT c_name,period FROM course WHERE period NOT BETWEEN 60 AND 70;例8:假设当前的系统年份为2002,查询计算机系、电子系学生的学号、姓名、年龄。Select number,name,2002-year(birthday) from jbqk where department in(计算机系,电子系);例9:查询所有姓“王”的学生信息。Select * from jbqk where name like 王%;此例中,使用了谓词LIKE。在使用时,应注意下面几点:LIKE前的列名必须是字符串类型。可以使用通配符:_(下划线)表示任一单个字符;%(百分号)表示任意长度字符。 3.查询中集函数的使用说明:DISTINCT:取消列中的重复值ALL:为默认状态,表示不取消重复值。 函数名称函数名称函数功能函数功能COUNT(DISTINCT|ALL *)统计元组个数统计元组个数COUNT(DISTINCT|ALL)统计一列重值的个数统计一列重值的个数SUM(DISTINCT|ALL)计算数值型一列值的总和计算数值型一列值的总和AVG(DISTINCT|ALL)求一列值的平均值求一列值的平均值MAX(DISTINCT|ALL)求一列值的最大值求一列值的最大值MIN(DISTINCT|ALL)求一列值的最小值求一列值的最小值例10:查询学生总人数。SELECT COUNT(*) FROM jbqk;例11:计算0052201学生的平均成绩。SELECT AVG(score) FROM jbqk WHERE number = 0052201; 5查询结果的分组与排序 GROUP BY子句将查询结果表按某一列或多列值分组,值相等的为一组。分组的目的是为了将集函数的作用对象细化,分组后集函数将作用在每一个组上,也就是说每个组都有一个函数值。 例12:查询选修了2门以上课程的学生学号,并且查询结果按照升序排列。 SELECT number FROM sle_course GROUP BY number HAVING COUNT(*) 2 ORDER BY number ASC; WHERE与HAVING的区别在于作用的对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的记录;HAVING短语作用于分组,从中选出满足条件的组。 三、 多表查询例13:查询所有选修课程的学生信息,包括所学的课程名、授课教师和成绩。Select jbqk.number,jbqk.name,course.c_name,sle_course.score,teacher.t_nameFrom jbqk,course,sle_course,teacherwhere jbqk.number=sle_course.number andsle_course.c_number=course.c_number andcourse.t_number=teacher.t_number 四、 嵌套查询 在SQL语言中,一个SELECTFROMWHERE语句成为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句(或HAVING短语)的条件中的查询称为嵌套查询。处于内层的查询称为子查询。嵌套查询命令在执行时,每个子查询在上一级查询处理之前求解,即由里向外查。 例14:查询选修了“数据库技术”课程的学生姓名。Select jbqk.name from jbqk Where jbqk. number in(Select sle_course.number from sle_course Where sle_course.c_number in ( Select course.c_number from course Where course.c_name=数据库技术);在一些嵌套查询中WHERE之后可以使用ANY和ALL这两个谓词,ANY表示子查询结果中的某个值,而ALL表示子查询结果中的所有值。 谓词形式谓词形式语语 义义谓词形式谓词形式语语 义义ANY大于子查询结果中的某个大于子查询结果中的某个值值ALL大于子查询结果中的所有大于子查询结果中的所有值值ANY大于等于子查询结果中的大于等于子查询结果中的某个值某个值ALL大于等于子查询结果中的大于等于子查询结果中的所有值所有值ALL小于等于子查询结果中的所有小于等于子查询结果中的所有值值ALL等于子查询结果中的所有等于子查询结果中的所有值值=ANY等于子查询结果中的某个值等于子查询结果中的某个值!=(或或) ALL不等于子查询结果中的所不等于子查询结果中的所有值有值!=(或或) ANY不等于子查询结果中的某个值不等于子查询结果中的某个值例15:查询所有课程成绩在95分以上的学生的学号、姓名。Select number,name from jbqk where number=any( select number from sle_course Where score=95)3.7 数据操纵语言一、 插入数据INSERT INTO ( , , ) VALUES ( , , , )例1:向学生基本情况表(jbqk)中插入一条记录。INSERT INTO jbqk VALUES(0051101,王云丽,女,1981-12-18,电子系,85);例2:向教师表(teacher)中插入一条记录。INSERT INTO teacher VALUES (T509,安志远,副教授);注意:在SQL SERVER 2000 插入数据时在VALUES子句中必须将所有列值写出,否则会出现“插入错误: 列名或所提供值的数目与表定义不匹配。”错误。 二、 删除数据删除命令比较简单,删除是对记录操作,不能删除记录的部分属性。一次可以删除一条和若干条记录,甚至将整个表的内容删空,只保留表的结构定义。删除命令格式为:DELETE FROM WHERE 例3:删除jbqk表中学号为“0051101”的学生。DELETE FROM jbqk WHERE number = 0051101; 三、 修改数据修改数据的语句格式一般是:UPDATE SET = = WHERE 例4:将课程表(course)中所有课程的学时减少5学时。UPDATE course SET period = period - 5;例5:将jbqk表中“袁更旭”同学的所在系改为“管理系”UPDATE jbqk SET department = 管理系 WHERE name = 袁更旭; 3.8 视图 视图是关系数据库系统提供给以多种角度观察数据库中数据的重要机视图是关系数据库系统提供给以多种角度观察数据库中数据的重要机制。它就象一个窗口,透过它可以看到数据库中用户感兴趣的数据及其变制。它就象一个窗口,透过它可以看到数据库中用户感兴趣的数据及其变化。化。一、一、 视图的特点视图的特点视图是一种虚表,是逻辑表,不是物理存在;基本表中的数据发生变化,从视图中查询出的数据也随之改变。视图中的数据是从现有的一个或多个表中提取出来的,可以屏蔽表中的某些信息,有利于数据库的安全性视图在数据库中是作为查询来保存的,当引用一个查询时,DBMS就执行这个查询,然后将查询结果作为视图来用;一个基本表可以建立多个视图,一个视图也可以在多个表上建立。拥有表的几乎所有操作。有利于应用程序的独立性、数据一致性。 二、 视图的建立和撤销1视图的建立建立视图的语句格式:CREATE VIEW (,)AS WITH CHECK OPTION;其中查询子句可以是任意复杂的SELECT 语句,但通常不允许含有ORDER BY和DISTINCT短语。WITH CHECK OPYION子句是为了防止用户通过视图对数据进行增加、删除、修改时,对不属于视图范围内的基本表数据进行误操作。加上该子句后,当对视图上的数据进行增、删、改时,DBMS会检查视图中定义 的条件,若不满足,则拒绝执行。例1:建立所有计算机系学生信息(学号、姓名、性别、出生日期)视图。Create view 计算机系 as select number,name,sex,birthday,department from jbqk Where department=计算机系2删除视图删除视图语句格式:DROP VIEW ;例2:删除上例建立的视图“计算机系”。DROP VIEW 计算机系; 三、 视图数据操作1查询视图当视图被定义之后,就可以象对基本表一样对视图进行查询了。例3:查询“计算机系”视图中年龄小于20岁的学生。Select * from 计算机系 where 2002-year(birthday)20;2更新视图由于视图是不实际存储数据的虚表,因此对视图的更新,最终是通过转换为对基本表的更新进行的。UPDATE 计算机系 SET department = 管理系 WHERE name = 袁更旭; 在数据库系统中实现安全性除了通过物理方法对数据库进行加密等方法外,主要是通过授予和检验权限的手段。SQL有授权语句,通过该语句可以实现对数据库的使用控制。一、 授权SQL语句通过GRANT语句向用户授予操作权限,GRANT语句的格式为:GRANT ,ON TO ,WITH GRANT OPTION;说明:此授权语句是指:将某作用在指定操作对象上的操作权限,授予指定的用户。 3.9 数据控制对象名对象名对象类型对象类型操操 作作 权权 限限属性列属性列TABLESELECT,INSERT,UPDATE,DELETE,ALL PRIVILEGERS视视 图图TABLESELECT,INSERT,UPDATE,DELETE,ALL PRIVILEGERS基本表基本表TABLESELECT,INSERT,UPDATE,DELETE,ALTER,INDEX,ALL PRIVILEGERS(所有权限)(所有权限)数据库数据库DATABASECREATETAB(建表权限)(建表权限)如果指定WITH GRANT OPTION子句,则获得某种权限的用户可以把这种权限在授予其他用户。如没有指定该子句,获得授权的用户将不能传播权限。例1:将查询jbqk表的权限授予用户sa。GRANT SELECT ON TABLE jbqk TO sa;例2:将在sle_course表上进行UPDATE的权限授予用户s1,并允许他传