关系数据库标准语言课件_第1页
关系数据库标准语言课件_第2页
关系数据库标准语言课件_第3页
关系数据库标准语言课件_第4页
关系数据库标准语言课件_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

3.1SQL概述3.2数据定义3.3数据查询3.4数据更新3.5视图3.6案例2:活期储蓄管理系统

数据库上的查询3/14/20233.1SQL概述

SQL(StructuredQueryLanguage)的字面意思是结构化的查询语言,但它的功能并不仅仅是查询,它是关系数据库管理系统的标准语言。3.1.1SQL的主要功能SQL语言按照功能可以分为3大类:DDL(DataDefinitionLanguage)数据定义语言用于定义关系数据库的模式、外模式和内模式,以实现对数据库基本表、视图及索引文件的定义、修改和删除等操作。最常用的DDL语句是CREATE、DROP和ALTER命令。DML(DataManipulationLanguage)数据操纵语言用于完成数据查询和数据更新操作。其中数据更新指对数据进行插入、删除和修改操作。最常使用的DML语句是SELECT、INSERT、UPDATE和DELETE命令。3/14/2023

DCL(DataControlLanguage)数据控制语言用于控制对数据库的访问,服务器的关闭、启动等操作。常使用的DCL命令有:GRANT、REVOKE等。3.1.2SQL的特点语言简洁,风格统一,易学易懂SQL语言接近英语,只用几个英文单词的组合就能完成所有功能,因此初学者非常容易上手。既是自含式语言,又是嵌入式语言作为自含式语言,SQL能够独立地用于联机交互的使用方式。当作为嵌入式语言使用时,SQL语句几乎可以不加修改地嵌入到如VB、PB这样的前端开发平台上,利用前端工具的计算能力和SQL的数据库操纵能力,可以快速地建立数据库应用程序。高度非过程化用SQL语言进行数据操作,只要提出“做什么”,而无须知道“怎么做”,SQL语句的实现过程由系统自动完成。3/14/2023大括号“{}”与竖线“|”表明此处为选择项,在所列出的各项中仅需选择一项。例如:{A|B|C|D}意思是A、B、C、D中取其一。SQL中的数据项(包括列项、表和视图)分隔符为“,”;其字符串常数的定界符用单引号“′”表示。在编写SQL语句时,遵从某种准则以提高语句的可读性,使其易于编辑,是很有好处的。以下是一些通常的准则:SQL语句对大小写不敏感为了提高SQL语句的可读性,子句开头的关键字通常采用大写形式。SQL语句可写成一行或多行,习惯上每个子句占用一行。关键字不能在行与行之间分开,并且很少采用缩写形式。SQL语句的结束符为分号“;”,分号必须放在语句中的最后一个子句后面,但可以不在同一行。3/14/20233.2数据定义

SQL语言的数据定义功能包括定义数据库、定义基本表、定义索引和定义视图。其基本语句如表3-1所示。

表3-1SQL的数据定义语句操作对象操作方式创建语句删除语句修改语句数据库CREATEDATABASEDROPDATABASEALTERDATABASE基本表CREATETABLEDROPTABLEALTERTABLE索引CREATEINDEXDROPINDEX视图CREATEVIEWDROPVIEW3/14/2023基本表是独立存储在数据库中的表在SQL中一个关系对应一个基本表,一个(或多个)基本表对应一个存储文件,基本表对应的数据必须在数据库中存放。存储文件的物理结构对用户而言是透明的,用户无需关心。一个基本表可以根据需要带一个或多个索引,索引也存放在存储文件中。视图是由一个或几个基本表导出的,它的外部形式也是一个表,是由基本表中选取的行和列组成的视图本身不独立,它依附于基本表,在数据库中不存放视图对应的数据,而只存放关于视图的定义,因此视图只是一个虚表。3/14/20233.2.2表的创建与删除

创建基本表创建基本表的结构是建立数据库最重要的一步,其一般语法如下:

CREATETABLE<表名>(<列名><数据类型>[<列级完整性约束条件>][,<列名><数据类型>[<列级完整性约束条件>]][,…][,<表级完整性约束条件>][,…]);说明:<表名>是指要创建的基本表的名称,该名称应符合具体DBMS的标识符的命名规则。<列名>指的是表的属性名称。3/14/2023定义表的各个属性时应指出其相应的数据类型和长度,不同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/14/2023关于完整性约束条件,需要说明以下几点:完整性约束条件分为列级完整性约束条件和表级完整性约束条件,它们之间的区别在于:列级完整性约束条件只能用于列,而表级完整性约束条件能够用于一张表中的多列。SQL的完整性约束条件有以下几种:NOTNULL或NULL约束这个约束条件为列级完整性约束条件。NOTNULL为不允许该列存在空值,而NULL为允许该列存在空值。UNIQUE约束UNIQUE约束是惟一性约束。即不允许表中的某一列或者某几列有重复的属性值。DEFAULT约束DEFAULT约束为默认值约束,是列级完整性约束条件。当向表中插入一个新行时,如果对于特定列没有指定数值,则使用DEFAULT子句指定的默认值。3/14/2023

【例3-3】创建“学生表”student,它由学号id、姓名name、性别sex、班级号class、出生日期birthday等5个属性组成。其中学号不能为空,值必须惟一,且姓名也必须惟一和非空。

CREATETABLEstudent(idCHAR(8)NOTNULLUNIQUE,nameVARCHAR(20)NOTNULLUNIQUE,sexCHAR(1)DEFAULT‘男’NOTNULL,classCHAR(4),birthdayDATE,sumintconstraintc2checksum<2000,CONSTRAINTC1CHECK(sexIN(‘男’,‘女’)));3/14/2023

【例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/14/2023删除基本表当某个基本表不再需要时,可以使用DROPTABLE语句将它删除。其一般语法为:DROPTABLE<表名>;

【例3-5】删除student表。

DROPTABLEstudent;该语句一旦执行,基本表的定义、数据、此表上建立的索引和视图都将自动被删除掉。3/14/2023使用DROP子句删除指定的完整性约束条件

【例3-7】删除student表学生姓名必须取惟一值的约束条件。

ALTERTABLEstudentDROPUNIQUE(name);使用MODIFY子句修改基本表的列定义

【例3-8】将student表name列的数据类型改为定长字符串型。

ALTERTABLEstudentMODIFYnamechar(8)NOTNULL;注意:(1)修改列定义时,要将原来的列级约束条件写上,否则原有的列级约束会不起作用。(2)修改列定义时,有可能会破坏已有的数据,应事先作好备份工作。(3)SQL未提供删除属性列的语句,只能采取间接的方法。3/14/20233.2.4建立索引

索引的概念索引是建立在列上的一种数据库对象,它对表中的数据提供逻辑顺序,当在数据库表中搜索某一行时,可以通过使用索引来找到它的物理位置。索引建立后,什么时候使用索引以及使用哪一个索引(当有多个索引存在时),由DBMS内部根据情况自行决定,不需要人员干预。索引是动态的,每当数据库表的数据更新一次,相应的索引也随之更新。

3/14/2023

建立索引在SQL语言中,建立索引使用CREATEINDEX命令,其一般语法为:CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]][,…]);

说明:(1)表名是要建立索引的基本表的名字。(2)列名是被建立索引的列的名称。索引可以建立在某一列或多个列上。(3)次序是指按照该列名的索引值的排列顺序。次序可以取值ASC(升序)或DESC(降序),默认值是ASC。(4)UNIQUE表示创建的索引是惟一索引,索引列上的数据不能有重复值。(5)CLUSTER表示要建立的是聚簇索引。聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引。3/14/2023

删除索引在SQL语言中,使用DROPINDEX命令删除索引,其语法如下:DROPINDEX<索引名>;

【例3-11】删除为student表建立的索引stu_cluind。

DROPINDEXstu_cluind;

删除索引时,系统会同时从数据库中删去有关该索引的描述。对于数据库系统而言,索引一经建立,一般不应随意删除。SQL没有提供修改索引的语句,对于一些在使用中证明不合适的索引,只能先删除后重建。3/14/20233.3数据查询

3.3.1SELECT语句的结构SQL语言提供的SELECT语句的一般格式如下:SELECT[ALL|DISTINCT]<目标列表达式>[,<目标列表达式>][,…]FROM<表名或视图名>[,<表名或视图名>][,…][WHERE<条件表达式>][GROUPBY<列名1>[HAVING<条件表达式>]][ORDERBY]<列名2>[ASC|DESC]];说明:SELECT语句的含义是,根据WHERE子句指定的条件,从FROM子句后面的基本表或视图中找出满足条件的记录,再按照SELECT子句指定的目标列表达式,选出这些记录相应的列形成结果集返回。其中,SELECT子句和FROM子句是必选的,而WHERE子句、GROUPBY子句、HAVING子句以及ORDERBY子句都是可选的。3/14/20233.3.2选择行和列--选择和投影运算的实现下面以人事工资管理系统的员工表employee和部门表dept为例介绍SELECT语句的使用方法。

Employee(emp_id,ename,job,mgr_id,workdate,sal,comm,dept_id)

员工号姓名职位主管参加工作时间月薪岗位津贴部门号

Dept(dept_id,dname,tel)部门号,部门名称,电话用下面语句创建表结构:

CREATETABLEemployee(emp_idCHAR(4)PRIMARYKEY,enameVARCHAR(20),jobVARCHAR(9),mgr_idCHAR(4),workdateDATE,salSMALLINT,commSMALLINT,dept_idCHAR(2)NOTNULLFOREIGNKEY(dept_id)REFERENCESDept(dept_id),FOREIGNKEY(mgr_id)REFERENCESemployee(emp_id));3/14/2023【例3-14】查询员工号为1001的员工姓名及部门号。

SELECTename,dept_idFROMemployeeWHEREemp_id=’1001’;

投影运算的实现查询表的全部列

【例3-15】查询部门表中部门号为11的全部内容。

SELECTdept_id,dname,telFROMdeptWHEREdept_id=’11’;在SQL语言中,可以用星号“*”代表所有列名,列的显示顺序与基本表中列的顺序一致。

【例3-16】下面语句的结果等价于【例3-15】的语句。

SELECT*FROMdeptWHEREdept_id=’11’;3/14/2023查询表的部分列

【例3-17】查询全体员工的员工号,姓名和参加工作时间。

SELECTemp_id,ename,workdateFROMemployee;查询经过计算的值SELECT子句的<目标列表达式>不仅可以是基本表的属性,也可以是表达式,包括算术表达式、字符串常量和函数等。

【例3-18】查询全体员工的姓名及年薪。

SELECTename,sal*12FROMemployee;

结果:enamesal*12吴伟15600岳玲13200王斌18000徐欢96003/14/20233.3.3SQL的运算符SQL语言使用的运算符包括算术运算符、比较运算符、逻辑运算符等。

算术运算符算术运算符有4种:+、-、*、/

比较运算符基本比较运算符共9种:=、>、<、<=、>=、!=或<>、!>(不大于)、!<(不小于)特殊比较运算符有4类:BETWEEN…AND…、IN、LIKE和ISNULL3/14/2023运算符BETWEEN…AND…运算符BETWEEN…AND…是用于确定记录的范围,即某属性值在指定的范围之内(包括边界值)的记录,其中BETWEEN后面是下限,AND后面是上限。

【例3-21】查询月薪在1000到1500之间的员工姓名及月薪。

SELECTename,salFROMemployeeWHEREsalBETWEEN1000and1500;查询结果包括那些月薪等于1000和月薪等于1500的记录。运算符IN运算符IN是用于查找某属性值包含在指定集合内的记录,IN后面跟的是指定集合。

【例3-22】查找部门号属于11和21的员工姓名及部门号。

SELECTename,dept_idFROMemployeeWHEREdept_idIN(‘11’,’21’);3/14/2023

运算符LIKE运算符LIKE可用来进行字符串的匹配,LIKE后面跟的是匹配模式。匹配模式可以是一个包含通配符“%”(百分号)和“_”(下划线)的字符串。“%”代表任意长度(长度可以为0)的字符串。

“_”代表任意单个字符。

【例3-23】查询所有姓张员工的姓名。

SELECTenameFROMemployeeWHEREenameLIKE‘张%’;【例3-24】查找所有1990年参加工作的员工姓名及参加工作时间。

SELECTename,workdateFROMemployeeWHEREworkdateLIKE‘%1990’;

【例3-25】查找姓名第2个字为“小”的员工姓名。

SELECTenameFROMemployeeWHEREenameLIKE‘__小%’;

3/14/2023运算符ISNULL运算符ISNULL用来测试某个属性值是否为空。

【例3-27】在employee表中,职位是总经理的员工在属性mgr_id这栏应该不填,因为他没有上司。因此查询总经理的姓名的语句应为:SELECTenameFROMemployeeWHEREmgr_idISNULL;

【例3-28】可能有这样的情况:新进员工暂时没有岗位津贴,等试用期满后再领岗位津贴。查询没有岗位津贴的员工姓名。

SELECTenameFROMemployeeWHEREcommISNULL;3/14/2023

逻辑运算符SQL语言的逻辑运算符有3种:NOT、AND、OR。【例3-29】查询月薪超过1500的部门主管的姓名及月薪。

SELECTename,salFROMemployeeWHEREsal>1500ANDjob=’部门主管’;【例3-30】查询月薪超过1500的员工和所有部门主管的姓名及月薪。

SELECTename,salFROMemployeeWHEREsal>1500ORjob=’部门主管’;

3/14/2023【例3-31】查询领有岗位津贴的员工姓名。

SELECTenameFROMemployeeWHEREcommISNOTNULL;【例3-32】查找部门号不属于11和21的员工姓名及部门号。

SELECTename,dept_idFROMemployeeWHEREdept_idNOTIN(‘11’,’21’);3/14/20233.3.4对查询结果排序SQL语言中用ORDERBY子句实现对查询结果的排序,可以根据包含的一列或者多列的表达式进行ASC(升序)或DESC(降序)的排列,默认值是ASC。【例3-33】查询所有员工的姓名及月薪,结果按月薪的降序排列。

SELECTename,salFROMemployeeORDERBYsalDESC;ORDERBY子句指定的排序列可以不只一个。3/14/2023

【例3-34】查询所有员工的姓名、部门号及月薪,结果按部门号升序排列,同一部门按月薪降序排列。SELECTename,dept_id,salFROMemployeeORDERBYdept_id,salDESC;说明:上例中dept_id称为主排序关键字,sal成为次排序关键字。

注意:

(1)ORDERBY子句不改变基本表中行或列的顺序,只改变查询显示的顺序。(2)ORDERBY子句指定排序的列必须出现在SELECT子句的列表达式中。(3)排序是查询语句的最后一步工作,所以ORDERBY子句一般放在查询语句的最后。3/14/20233.3.5消除重复行基本表中不相同的行,经过对某些指定列进行投影运算后,可能会变成完全相同的行,显示结果不直观,这时需要用DISTINCT选项消除重复的行。【例3-35】查询表employee中的所有职位。

SELECTDISTINCTjobFROMemployee;

注意:在一个SELECT语句中DISTINCT只能出现一次,并且DISTINCT必须在所有列名之前,否则会发生语法错误。与DISTINCT选项含义相反的是ALL选项,在SELECT语句中使用ALL选项,表示结果重复的行也将显示。ALL选项是默认选项。3/14/20233.3.6SQL的统计函数SQL语言提供了许多统计函数,主要的统计函数见表3-3。

统计函数语义COUNT([DISTINCT|ALL]*)统计表的记录个数COUNT([DISTINCT|ALL]<列名>)统计一列中值不为NULL值的个数SUM([DISTINCT|ALL]<列名>)计算一列值的总和(此列必须为数值型)AVG([DISTINCT|ALL]<列名>)计算一列值的平均值(此列必须为数值型)MAX([DISTINCT|ALL]<列名>)给出一列值中的最大值MIN([DISTINCT|ALL]<列名>)给出一列值中的最小值3/14/2023【例3-36】统计员工总人数。

SELECTCOUNT(*)FROMemployee;也可以写成:

SELECTCOUNT(emp_id)FROMemployee;【例3-37】统计部门号“11”的部门领取岗位津贴的人数。

SELECTCOUNT(comm)FROMemployeeWHEREdept_id=’11’;这里统计的是属性列comm不为空值的行数。3/14/2023【例3-38】统计部门号“11”的部门全体员工人数。

SELECTCOUNT(*)FROMemployeeWHEREdept_id=’11’;【例3-39】查询最早参加工作时间和最晚参加工作时间。

SELECTMIN(workdate),MAX(workdate)FROMemployee;【例3-39】统计所有员工的岗位津贴总数及平均岗位津贴。

SELECTSUM(comm),AVG(comm)FROMemployee;

注意:除COUNT(*)外,所有的统计函数都不包括取值为空值的行。3/14/20233.3.7数据分组利用GROUPBY子句可以将查询结果按照一列或者多列分组,值相等的为一组。

基于单列的分组【例3-40】按部门号查询各部门的平均月薪。

SELECTdept_id,AVG(sal)FROMemployeeGROUPBYdept_id;

基于多列的分组

GROUPBY子句还可以作用于多列上,此时的数据分组意义是分大组之后再分小组。

【例3-41】分各部门各职位统计月薪总额。

SELECTdept_id,job,sum(sal)FROMemployeeGROUPBYdept_id,job;

说明:先按照部门号分组,部门号相同的组再按职位细分,最后部门号和职位完全相同的行才会分在一组,然后每组统计一个月薪总额。3/14/2023

HAVING子句

如果分组后还要根据一定条件对这些组进行筛选,则使用HAVING子句来实现。

【例3-42】按部门号查询各部门的平均月薪,要求只显示平均月薪在1000以上的部门编号和平均月薪。

SELECTdept_id,AVG(sal)FROMemployeeGROUPBYdept_idHAVINGAVG(sal)>1000;

注意:WHERE子句和HAVING子句有相似之处,即后面都跟指定条件;但是它们又有区别:前者直接用于SELECT子句中,作用于基本表或视图;而后者一定跟在GROUPBY子句后面,作用于分组。3/14/20233.3.8连接查询

连接查询的概念如果一个查询需要从两个或两个以上的数据表中获取数据时,则称之为连接查询。连接查询包括广义笛卡尔积、等值连接、自然连接、外连接、内连接、左连接、右连接和自连接等。

广义笛卡尔积广义笛卡尔积是不带连接条件的连接操作。两个表的广义笛卡尔积即是两个表中所有记录的交叉组合,其形成的结果集是所有连接种类中最大的。比如:表1有3条记录,表2有5条记录,则广义笛卡尔积产生3*5=15条记录。由于这种连接操作是不带条件的表的拼接,因此实际意义不大。3/14/2023

等值连接

[<表名1>.]<列名1>=[<表名2>.]<列名2>等值连接又称为内连接。若将查询结果的目标列中重复的列去掉,则称为自然连接,在实际中等值连接一般以自然连接的形式出现。

【例3-43】查询每位员工的员工号,姓名,部门号、部门名称及部门电话。

SELECTemp_id,ename,dept.dept_id,dname,telFROMemployee,deptWHEREemployee.dept_id=dept.dept_id;

说明:(1)如果属性列名在参加连接的各表中是惟一的,可以省略表名前缀;如果属性列名是两个表共同的属性,则一定要加表名前缀。(2)在书写连接查询时,为了简化,可以为表名取别名,别名应该简单。别名只在本次查询有效。3/14/2023【例3-44】查询每位员工的员工号,姓名,部门号、部门名称及部门电话。

SELECTemp_id,ename,d.dept_id,dname,telFROMemployeee,deptdWHEREe.dept_id=d.dept_id;

不等连接

当连接条件中的比较运算符不为“=”时,此时的连接查询称为不等连接。3/14/2023

假设有JOB表(职位表),它包含两个属性:职位job_level和标准月薪std_sal,该表包含记录如下:

job_levelstd_sal部门经理2200出纳1200【例3-45】列出可提供给employee表中每位员工比现在薪水高的职位。

SELECTename,sal,job_level,std_salFROMemployee,jobWHEREstd_sal>sal

查询结果如下:

enamesaljob_levelstd_sal吴伟1300部门经理2200岳玲1100部门经理2200王斌1500部门经理2200徐欢800部门经理2200岳玲1100出纳1200徐欢800出纳12003/14/20233.4数据更新

3.4.1插入记录插入单条记录INSERTINTO<表名>[(<属性列1>[,<属性列2>]…)]VALUES(<常量1>[,<常量2>]…);注意:(1)属性列的个数与常量的个数要相等,且顺序一致,否则会产生语法错误。(2)在表结构定义中未说明为NOTNULL的属性列,如果没有出现在INTO子句后,这些列将取空值。已经说明为NOTNULL的属性列,则必须出现在INTO子句后。(3)如果INTO子句后没有指定任何列,则VALUES子句后面的常量个数必须与基本表中列的个数相等,且类型、顺序一致,否则会出语法错误或导致赋值不正确。

3/14/2023【例3-47】插入一条部门新记录。

INSERTINTOdept(dept_id,dname,tel)VALUES(‘31’,’产品开发部’,’’);该语句等价于:

INSERTINTOdeptVALUES(‘31’,’产品开发部’,’’);【例3-48】插入一条员工新记录。

INSERTINTOemployeeVALUES(‘1311’,‘淳’,NULL,NULL,to_date(’2004/08/15’),800,’11’);

3/14/2023插入子查询的结果SELECT语句可以作为子查询嵌套在INSERT语句中,用以插入批量记录。其语句格式一般为:

INSERTINTO<表名>[(<属性列1>[,<属性列2>]…)]子查询;【例3-49】求出每个部门平均月薪,将部门号和平均月薪放入一张新表dept_sal中。先创建新表的结构:

CREATETABLEdept_sal(dept_idCHAR(2),avg_salSMALLINT);然后将子查询求出的数据批量插入新表中:

INSERTINTOdept_sal(dept_id,avg_sal)SELECTdept_id,AVG(sal)FROMemployeeGROUPBYdept_id;3/14/20233.4.2修改记录

SQL语言修改记录的语句为UPDATE。该语句有3种形式:修改单条记录、修改多条记录以及使用子查询修改记录。其一般语句格式为:UPDATE<表名>SET<列名>=<表达式>[,<列名>=<表达式>][,…][WHERE<条件>];SQL语言的修改语句功能是将表中符合WHERE子句条件的记录找出,以表达式的值替代相应属性列的值。3/14/2023修改单条记录【例3-50】修改1311号员工的月系薪为1700。

UPDATEemployeeSETsal=1700WHEREemp_id=’1311’;修改多条记录【例3-51】所有员工月薪上调5%。

UPDATEemployeeSETsal=sal*1.05;【例3-52】21号部门的所有员工取消岗位津贴。

UPDATEemployeeSETcomm=0WHEREdept_id=’21’;3/14/2023用子查询修改记录UPDATE语句可以和SELECT语句联合使用。后者作为子查询嵌套。这种情况也属于批量修改。

【例3-53】将产品开发部的部门主管的岗位津贴加500。

UPDATEemployeeSETcomm=comm+500WHEREjob=’部门主管’ANDdept_id=(SELECTdept_idFROMdeptWHEREdept.dname=’产品开发部’);说明:

(1)因为对应产品开发部的部门号只有一个,所以子查询检索出的记录只有一条,因此子查询前面可以用“=”。(2)这条UPDATE语句的WHERE子句有两个条件,它们是逻辑与关系。根据这两个条件查询找出的记录可能是多条。3/14/20233.4.3删除记录DELETE语句一般格式:

DELETEFROM<表名>[WHERE<条件>];DELETE语句的功能是:先按照WHERE子句中指定的条件范围将记录找出来,然后进行删除。删除单条记录

【例3-54】删除员工号为1045的记录。

DELETEFROMemployeeWHEREemp_id=’1045’;3/14/2023删除多条记录【例3-55】删除部门号为31的所有记录。

DELETEFROMemployeeWHEREdept_id=’31’;【例3-56】删除所有员工记录。

DELETEFROMemployee;删除所有记录,是清空表中数据,因此不加WHERE子句。这类操作的执行应非常小心。3/14/2023使用子查询删除SELECT语句同样也可以和DELETE语句联合使用。

【例3-57】删除产品开发部和事业推广部的所有员工的记录。

DELETEFROMemployeeWHEREdept_idIN(SELECTdept_idFROMdeptWHEREdept.dname=’产品开发部’ORdept.dname=’事业推广部’);因为SELECT子查询得到的记录一般不止一条,所以子查询前面的运算符不能为“=”,而应该用表示取值范围的“IN”。3/14/20233.5视图

3.5.1视图的概念视图不包含任何数据,只是定义在一个或多个基表上或其他视图上,并且提供一种访问基表数据的方法。在物理磁盘上存储的有关视图的信息是:视图的名称和视图的定义。视图的所有数据来自基本表。因此,当基本表的数据发生变化时,对应视图中的查询出的数据也会随之变化。视图一经定义,就可以象基本表一样执行查询、删除等操作,也可以在视图上定义新的视图,但对视图的更新操作则有一定限制。3.5.2视图的作用可以满足不同用户的需求不同的用户对数据库操作有不同的需求,即使相同的数据也可能有不同的操作要求。一张基本表可能有很多属性列,利用视图,用户可以把自己感兴趣的属性列集中起来,放在一个视图中,此后用户可以将视图作为一张表来对待。3/14/2023可以简化数据读取查询数据时,通常要用SELECT语句编写复杂的连接、统计、函数等,以产生所需要的结果。使用视图,可以隐蔽这种复杂性。可以将经常用到的复杂查询的语句定义为视图,不必每次查询都写上复杂查询条件,这样就简化了用户的查询操作。保证了基本表数据和应用程序的逻辑独立性当应用程序通过视图来访问数据时,视图实际上成为应用程序和基本表数据之间的桥梁。如果应用程序直接调用基本表,则一旦基本表的数据发生变化时,应用程序必须随之改动。而通过视图访问数据,则可以通过改变视图来适应基本表的变化,使应用程序不必作改变,保证了基本表数据和应用程序的逻辑独立性。可以提供安全机制利用视图可以限制数据访问。如果某个用户需要访问表中的某些列,但另一些属性列必须对该用户保密,则可以利用视图达到此目的,将视图建立在该用户需要访问的那些列上。3/14/20233.5.3视图的建立SQL语言用CREATEVIEW语句来建立视图,其一般格式为:

CREATEVIEW<视图名>[(<列名>[,<列名>]…)]AS<子查询>[WITHCHECKOPTION];说明:(1)选项WITHCHECKOPTION确保用户只能查询和修改他们所看到的数据,强制所有在视图上使用的数据修改语句满足定义视图时的条件。(2)组成视图的各属性列可以显式指定,也可以省略。如果省略不写,则组成视图的各属性列由子查询中SELECT子句的各目标列组成。

下列情形建立视图时必须显式指定属性列:1)视图的某列不是原属性列,而是统计函数或者表达式。2)多表连接时选出了两个或者多个同名列作为视图的属性列。3)需要对视图中的某些列重新命名。3/14/2023

【例3-58】建立仅包含部门主管视图。

CREATEVIEWmgr_vuASSELECT*FROMemployeeWHEREJOB=’部门主管’;【例3-59】为21号部门的所有员工的员工号、姓名及月薪建立视图。

CREATEVIEWsal21_vu(eno,ename,salary)ASSELECTemp_id,ename,salFROMemployeeWHEREdept_id=’21’;

3/14/2023

【例3-60】为21号部门月薪超过1500的员工的员工号、姓名及月薪建立视图。

CREATEVIEWsal21_vu1(eno,ename,salary)ASSELECTemp_id,ename,salFROMemployeeWHEREdept_id=’21’ANDsal>1500;

该题也可以对【例3-55】定义的视图进行进一步的筛选。由于视图不仅可以建立在基本表之上,还可以建立在视图上,因此该语句也可写作:

CREATEVIEWsal21_vu1ASSELECT*FROMsal21_vuWHEREsal>1500;3/14/2023【例3-61】为各部门的平均月薪建立视图

CREATEVIEWsalavg_vu(dno,sal_avg)ASSELECTdept_id,AVG(sal)FROMemployeeGROUPBYdept_id;本例中因使用了统计函数,因而对视图的列作了显式指定。

视图还可以建立在多个表或视图之上。【例3-62】为产品开发部的员工的员工号、姓名、月薪以及工龄建立视图。

CREATEVIEWdept_vu(eno,name,salary,wage)ASSELECTemp_id,ename,sal,2004-year(workdate)FROMemployee,deptWHEREemployee.dept_id=dept.dept_idANDdept.dname=’产品开发部’;3/14/20233.6案例2:活期储蓄管理系统数据库上的查询

示例数据由案例1知,活期储蓄管理系统数据库包括:储户基本信息、储户动态信息、储蓄所、存取款4个基本表,根据案例1对关系结构的描述(也称为数据字典),这里给出活期储蓄管理系统数据库中基本表的示例数据。

储蓄所数据

编号名称电话地址1001中国建行杭州分行秋涛支行(0571)88049082秋涛北街283号1002中国建行杭州分行武林支行(0571)68066080武林南路366号1208中国建行杭州分行下沙支行(0571)28800088

温馨提示

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

最新文档

评论

0/150

提交评论