《第四章 视图与查询.ppt》由会员分享,可在线阅读,更多相关《第四章 视图与查询.ppt(99页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章第四章 查询与视图查询与视图4.1 SQL结构化查询语言结构化查询语言n1、SQL简介简介nStructured Query LanguageStructured Query Language(结构化查询语结构化查询语言)的缩写。言)的缩写。n是一种国际标准,大部分是一种国际标准,大部分DBMSDBMS产品都支持产品都支持SQLSQL,SQLSQL已成为操作数据库的已成为操作数据库的标准语言标准语言。n有有“方言方言”,支持程度不同。,支持程度不同。nVisual Foxpro6.0Visual Foxpro6.0支持支持SQLSQL,但支持程度与其但支持程度与其它它DBMSDBMS产品
2、有区别,也与标准产品有区别,也与标准SQLSQL有差异。有差异。4.1 SQL结构化查询语言结构化查询语言n2.SQL的特点的特点n非过程化非过程化n一体化一体化n两种使用方式,统一的语法结构两种使用方式,统一的语法结构n简洁简洁4.1 SQL结构化查询语言结构化查询语言n3.SQL的功能的功能n数据定义数据定义(DDL)Create、Drop、Altern数据操纵数据操纵(DML)数据修改数据修改:Insert、Update、Delete 数据查询:数据查询:Select n数据控制数据控制(DCL)Grant、Revoke4.1.1 SQL数据定义功能(数据定义功能(DDL)n数据定义语言
3、(数据定义语言(Data Definition Language)Create、Drop、Altern数据对象的类型数据对象的类型 基本表基本表 视图视图 属性的值域(数据类型)属性的值域(数据类型)完整性约束完整性约束 索引索引4.1.1 SQL数据定义功能(数据定义功能(DDL)n1、表的定义表的定义nCreate Table 表名表名 n(字段字段1 数据类型数据类型1,字段,字段n 数据类型数据类型n)n在使用在使用CREATE TABLE命令定义表时,字段命令定义表时,字段类型用相应的字母(类型用相应的字母(C、N、F,I,Y、D、T、M、G)表示,有些类型需要用户给定字)表示,有些
4、类型需要用户给定字段宽度和小数位。段宽度和小数位。1、表的定义表的定义n例例1:创建学生档案表,该表的字段为:学创建学生档案表,该表的字段为:学号,号,c型,长度为型,长度为10;姓名,;姓名,c型,长度为型,长度为10;性别,;性别,c型,长度为型,长度为2;出生日期,;出生日期,d型;型;班级,班级,c型,长度型,长度20。ncreate table 学生档案学生档案(学号学号 c(10),姓名姓名 c(10),性别性别 c(2),出生日期出生日期 d,班级班级 c(20);1、表的定义表的定义n举一反三:举一反三:n创建一个创建一个“课程课程”表,字段有:表,字段有:n课程代号课程代号,
5、c型,型,10位;位;n课程名称课程名称,c型,型,20位;位;n学时学时,N型,型,5位,小数位,小数1位;位;n学分学分,N型,型,4位,小数位,小数1位。位。1、表的定义表的定义n用用 CREATE TABLE命令建立表时可同时创建:命令建立表时可同时创建:n满足实体完整性的主关键字(主索引满足实体完整性的主关键字(主索引)PAIMARY KEY;n定义域完整性定义域完整性的的CHECK约束及出错提示信息约束及出错提示信息ERROR;n定义默认值的定义默认值的 DEFAULT等;等;n此外还有描述表之间联系的此外还有描述表之间联系的 FOREIGN KEY和和 REFERENCES等。等
6、。n例例2 2:新建一个:新建一个“专业专业”表表,含字段:专业名称,含字段:专业名称,c c型,型,1010位;所属系位;所属系,c c型,型,1212位;学生数,位;学生数,I I型;型;增设日期,增设日期,D D型。同时指定专业名称为主索引,型。同时指定专业名称为主索引,并且要求学生数大于并且要求学生数大于0 0,否则提示,否则提示“学生数应该学生数应该大于大于0”0”。CREATE TABLE CREATE TABLE 专业(专业(;专业名称专业名称 C C(1010)PRIMARY KEYPRIMARY KEY,所属系所属系 C C(1212),;,;学生数学生数 I I CHECK
7、CHECK(学生数学生数00)ERROR“ERROR“学生数应学生数应该大于该大于0 0!”,增设日期,增设日期 D D)1、表的定义表的定义-列级约束列级约束n例例3:创建:创建“学生选课学生选课”表,字段为:学号表,字段为:学号 C(10),课程代号课程代号 C(10),成绩成绩 N(8,2)。与。与学生档案表按学号学生档案表按学号建立外键联系,与课程表按课程代号建立外键联系。建立外键联系,与课程表按课程代号建立外键联系。CREATE TABLE 学生选课学生选课(;学号学号 C(10),课程代号课程代号 C(10),成绩成绩N(8,2),;FOREIGN KEY 学号学号 TAG FK_
8、Xh REFERENCES;学生档案学生档案,;FOREIGN KEY 课程代号课程代号 TAG FK_Kh;REFERENCES 课程课程;);1、表的定义表的定义-表级约束表级约束n2、表结构的修改、表结构的修改nALTER TABLE 表名表名n修改字段名;修改字段名;n修改字段类型;修改字段类型;n删除字段;删除字段;n添加字段;添加字段;n修改主键和联系。修改主键和联系。4.1.1 SQL的数据定义功能的数据定义功能n例例4:将:将“专业专业”表的表的增设日期增设日期字段名改字段名改为为开办日期开办日期。ALTER TABLE 专业专业 RENAME COLUMN 增设日期增设日期
9、to 开办日期开办日期;2、表结构的修改、表结构的修改-字段改名字段改名2、表结构的修改、表结构的修改-修改字段类型修改字段类型n例例5:将学生档案表的学号字段的宽度改将学生档案表的学号字段的宽度改为为10。nALTER TABLE 学生档案学生档案 ALTER 学号学号 C(10)2、表结构的修改、表结构的修改-删除字段删除字段n例例6 6:删除专业表中的开办日期字段。:删除专业表中的开办日期字段。ALTER TABLEALTER TABLE 专业专业 DROP COLUMNDROP COLUMN 开开办办日期日期;n例例7:为课程表增加一个学分字段,并且:为课程表增加一个学分字段,并且要求
10、学分字段不能为零。要求学分字段不能为零。nALTER TABLE 课程课程 ADD 学分学分 N(4,1)CHECK 学分学分0 ERROR 学分学分字段应该大于零!字段应该大于零!2、表结构的修改、表结构的修改-增加字段增加字段2、表结构的修改、表结构的修改-增加字段增加字段n练习:练习:n为课程表增加一个字段:任课教师,为课程表增加一个字段:任课教师,C(10)。)。2、表结构的修改、表结构的修改-增加索引增加索引n例例8 8:将课程表的任课教师定义为候选索引:将课程表的任课教师定义为候选索引(候选关键字),索引名是(候选关键字),索引名是emp_supemp_sup。ALTER TABL
11、EALTER TABLE 课程课程 ADD ADD UNIQUEUNIQUE 任课教任课教师师 TAG TAG emp_supemp_sup2、表结构的修改、表结构的修改-删除索引删除索引n例例9 9:删除课程表的候选索引:删除课程表的候选索引emp_supemp_sup。ALTER TABLEALTER TABLE 课程名称课程名称 DROP UNIQUEDROP UNIQUE TAG TAG emp_supemp_sup4.1.1 SQL的数据定义功能的数据定义功能n3、表的删除、表的删除n删除表删除表的的SQL命令是:命令是:【格式格式】DROP TABLE table_ namenDR
12、OP TABLE 直接从磁盘上删除直接从磁盘上删除 table_name 所对应的所对应的dbf文件。文件。4.1.2 SQL的数据操作功能的数据操作功能n数据操作包括:数据操作包括:插入数据、更新数据、删除数据。插入数据、更新数据、删除数据。insert update delete1、插入数据插入数据n标准标准SQLn插入一条:插入一条:INSERT INTO 表名表名(字段(字段1,字段,字段2,)VALUES(表达式表达式1,表达式,表达式2,)n插入多条:插入多条:(VFP6不支持)不支持)Insert into 表名表名1(字段(字段1,字段,字段2,)select(字段字段1,字段
13、,字段2,)from 表名表名21、插入数据、插入数据nVFP特有格式特有格式nINSERT INTO dbf_name FROM ARRAY Arrayname|FROM MEMVAR n说明:说明:FROM ARRAY ArrayName说明从指定说明从指定的数组中插入记录值;的数组中插入记录值;FROM MEMVAR 说明根据同名的内存变说明根据同名的内存变量来插入记录值,如果同名的变量不存在,量来插入记录值,如果同名的变量不存在,那么相应的字段为默认值或空。那么相应的字段为默认值或空。1、插入数据、插入数据n插入一条插入一条n例例36:新增一个学生信息:新增一个学生信息Insert I
14、nto xsda(学号学号,姓名姓名,性别性别,出生日出生日期期,专业专业)Values(2006090799,张张三三,男男,1986-10-12,会计会计)1、插入数据、插入数据n插入多条插入多条n例例37:给:给“会计会计”专业的学生开设必修课财专业的学生开设必修课财务管理,建立选课信息务管理,建立选课信息Insert Into xsxk;Select 学号学号,课程代号课程代号,null From xsda,pkqk Where 专业专业=会计会计 and课程代号课程代号=财务管理财务管理;nVFP不支持不支持2、更新数据、更新数据n【格式格式】UPDATE TableNamen SE
15、T Column_Name1=eExpression1n ,Column_Name2=eExpression2 n WHERE Conditionn说明:一般使用说明:一般使用 WHERE 子句指定条件,以更新子句指定条件,以更新满足条件的一些记录的字段值,并且一次可以更新满足条件的一些记录的字段值,并且一次可以更新多个字段;如果不使用多个字段;如果不使用 WHERE 子句,则更新全子句,则更新全部记录。部记录。2、更新数据、更新数据n例例14,给编号为,给编号为“05002”的职工提高的职工提高 10 的职务补贴,可以用如下命令:的职务补贴,可以用如下命令:UPDATE Rsgz SET 职
16、务补贴职务补贴=职职务补贴务补贴*1.10 WHERE 编号编号=“05002n例例15,给所有职工增加,给所有职工增加 100 元其它补贴:元其它补贴:UPDATE Rsgz SET 其它补贴其它补贴=其它其它补贴十补贴十100 3、删除数据、删除数据n数据删除(数据删除(Delete)n只能对整个元组操作,不能只删除某些属性只能对整个元组操作,不能只删除某些属性上的值上的值n只能对一个关系起作用,若要从多个关系中只能对一个关系起作用,若要从多个关系中删除元组,则必须对每个关系分别执行删除删除元组,则必须对每个关系分别执行删除命令命令n格式:格式:Delete From r Where P从
17、关系从关系 r 中删除满足中删除满足P的元组。的元组。3、删除数据、删除数据n删除删除单个单个元组元组n例例1616:删除学号为:删除学号为0001500100015001的学生的信息的学生的信息 delete fromdelete from 学生学生 WhereWhere 学号学号 =00015001000150013、删除数据、删除数据n删除删除多个多个元组元组例例1717:删除选课而未参加考试的学生的选课:删除选课而未参加考试的学生的选课信息信息Delete FromDelete From 选课选课WhereWhere 成绩成绩 is nullis nulln删除删除整个整个关系中的所有
18、数据关系中的所有数据例例1818:删除所有学生的选课信息:删除所有学生的选课信息Delete From Delete From 选课选课4.1.3 SQL的数据查询命令的数据查询命令数据查询是数据库应用的核心功能数据查询是数据库应用的核心功能一、基本结构一、基本结构Select A1,A2,.,AnFrom r1,r2,.,rmWhere P二、说明二、说明 SELECT:说明要查询的列(字段)数据;说明要查询的列(字段)数据;FROM:要查询的字段来自哪个或哪些表;要查询的字段来自哪个或哪些表;WHERE:查询条件,即选择记录的条件。查询条件,即选择记录的条件。1、基本查询、基本查询nSel
19、ect子句(选择表中若干列)子句(选择表中若干列)nWhere子句(选择表中若干行)子句(选择表中若干行)nOrder By子句(对查询结果排序)子句(对查询结果排序)n聚集函数(求和、求平均等)聚集函数(求和、求平均等)1、基本查询(、基本查询(选择列:投影运算选择列:投影运算)n语法结构语法结构 select 列名列名1,列名,列名2,from 表名表名n例例s1:查看:查看rsda.dbf数据表中的姓名和职称数据表中的姓名和职称 select 姓名姓名,职称职称 from rsda;1、基本查询(、基本查询(选择列:投影运算选择列:投影运算)n为列更改显示名称:为列更改显示名称:sele
20、ct 列名列名1 as 新名称,新名称,from 表表1n此用法此用法并不实际更改并不实际更改数据表结构。数据表结构。n例例s2:把:把rsda2中的中的name显示为职工姓名显示为职工姓名 Select name as 职工姓名职工姓名,职称职称 from rsda2;1、基本查询(、基本查询(选择列:投影运算选择列:投影运算)n显示全部列显示全部列 (1)select 后罗列出所有列名;后罗列出所有列名;(2)用)用*代替列名。代替列名。n例例s3:显示:显示rsda中所有列中所有列 select*from rsda;1、基本查询(、基本查询(选择列:投影运算选择列:投影运算)n列的计算列
21、的计算n例例s4a:求每人工资的:求每人工资的3%Select 基本工资基本工资*0.03 from rsda;1、基本查询(、基本查询(选择行:选择运算选择行:选择运算)n使用使用where子句子句 select 列列 from 表表 where 条件条件n条件一般是关系表达式或逻辑表达式,返回条件一般是关系表达式或逻辑表达式,返回真值或假值真值或假值。n基本原理是基本原理是DBMS依次判断在每条记录上是依次判断在每条记录上是否满足条件,若满足显示,否则不显示。否满足条件,若满足显示,否则不显示。1、基本查询(、基本查询(选择行:选择运算选择行:选择运算)n例例s4:查找:查找rsda表中教
22、授的信息。表中教授的信息。select*from rsda where 职称职称=“教授教授”;1、基本查询(、基本查询(选择行:选择运算选择行:选择运算)n复合条件复合条件n例例s5:在:在RSDA数据表中查找数据表中查找90年年1月月1号以号以后参加工作的女职工。后参加工作的女职工。select*from rsda where;工作日期工作日期1990-1-1;and 性别性别=“女女”;1、基本查询(、基本查询(选择行:选择运算选择行:选择运算)n消除取值重复的行消除取值重复的行 nSelect 子句的缺省情况是保留重复元组子句的缺省情况是保留重复元组n可用可用 Distinct 去除重
23、复元组去除重复元组n例例s6:从:从rsda表中查看一下共有哪些职称。表中查看一下共有哪些职称。/select 职称职称 from rsda;select distinct 职称职称 from rsda;1、基本查询、基本查询(选择行:选择行:where子句的运算符子句的运算符)n比较比较:=、=、=、!=、!、!1000;1、基本查询(、基本查询(选择行:确定范围选择行:确定范围)nBetween andn例例s8:查询工资:查询工资大于等于大于等于800但但小于等于小于等于1000的员工的员工 select*from rsda where 基本工资基本工资 between 800 and
24、1000;n思考:该语句可用哪条语句代替?思考:该语句可用哪条语句代替?1、基本查询(、基本查询(选择行:确定集合选择行:确定集合)nIn/not inn例例s9:查询不是讲师、工程师的员工:查询不是讲师、工程师的员工 select*from rsda where 职称职称 not in(“讲师讲师”,”工程师工程师”);n思考:该语句可用哪条语句代替?思考:该语句可用哪条语句代替?select*from rsda where 职称职称“讲师讲师”and 职称职称”工程师工程师”;1、基本查询(、基本查询(选择行:选择行:like)n通配符通配符n%匹配任意字符匹配任意字符串串 “%A”查以查
25、以“A”结尾的结尾的 “A%”查以查以“A”开头的开头的 “%A%”查任意位置含有查任意位置含有“A”的的n_ 匹配任意匹配任意一个一个字符字符1、基本查询(、基本查询(选择行:选择行:like)n例例s10:查找所有王姓员工:查找所有王姓员工select*from rsda where 姓名姓名 like“王王%”;n例例s11:查找所有名字结尾为:查找所有名字结尾为“玲玲”的员工的员工select*from rsda where 姓名姓名 like“%玲玲”;n例例s12:查找名字中含有:查找名字中含有“文文”的员工的员工select*from rsda where 姓名姓名 like“%
26、文文%”;1、基本查询(、基本查询(选择行:选择行:null查询查询)n例例s13:在:在xsxk数据表中查询选课了但没有数据表中查询选课了但没有该门课成绩的情况该门课成绩的情况 select*from xsxk where 成绩成绩 is null;1、基本查询(、基本查询(设定排序条件设定排序条件)n使用使用order by子句:子句:ORDER BY Order_ItemASC|DESC,Order_ItemASC|DESCn默认默认 ASC(升序)升序)n例例s14:按参加工作时间早晚排序:按参加工作时间早晚排序 select*from rsda order by 工作日期工作日期 1
27、、基本查询、基本查询(聚合函数:聚合函数:Having子句子句)n针对聚合函数的结果值进行筛选(选择),针对聚合函数的结果值进行筛选(选择),它作用于分组计算结果集它作用于分组计算结果集n跟在跟在Group By子句的后面,没有子句的后面,没有Group By则针对全表则针对全表n例例s21:显示平均基本工资大于:显示平均基本工资大于900的职称的职称 select 职称职称,avg(基本工资基本工资)from rsda group by 职称职称 having avg(基本工资基本工资)900;1、基本查询、基本查询(聚合函数:聚合函数:Having子句子句)n思考:思考:n从从xsxk中选
28、出两门(含)以上不及格的学生中选出两门(含)以上不及格的学生学号。学号。2、多表查询、多表查询/联接查询联接查询若一个查询同时涉及两个以上的表,则称之为若一个查询同时涉及两个以上的表,则称之为连接查询,包括:连接查询,包括:n 内连接内连接n 外连接外连接n 自连接自连接n 复合条件连接复合条件连接2、联接查询、联接查询n联接形成新的关系联接形成新的关系2、联接查询(、联接查询(内联接内联接)n它是条件连接,这个条件称为连接条件或连它是条件连接,这个条件称为连接条件或连接谓词接谓词n可以是等值连接,也可以是不等值连接可以是等值连接,也可以是不等值连接n新的关系的属性集是参加连接的关系的属性新的
29、关系的属性集是参加连接的关系的属性的组合,不去除重复属性的组合,不去除重复属性nInner是缺省的连接方式是缺省的连接方式n也可以用也可以用笛卡儿积笛卡儿积+选择选择的方法实现的方法实现2、联接查询(、联接查询(内联接内联接)nJoin/inner joinn列出两个表中仅满足联接条件的记录,为默认联接列出两个表中仅满足联接条件的记录,为默认联接类型。类型。n例例s22:查询每个:查询每个已选课已选课学生的全部信息及其选课学生的全部信息及其选课情况情况SELECT xsda.*,xsxk.*FROM xsda INNER JOIN xsxk ON xsda.学号学号=xsxk.学号学号;SEL
30、ECT xsda.*,xsxk.*FROM xsda,xsxk Where xsda.学号学号=xsxk.学号学号;(笛卡尔乘积笛卡尔乘积+选选择择)2、联接查询(、联接查询(左联接左联接)nLeft outer joinn列出左边表(父表)的所有记录和右边表列出左边表(父表)的所有记录和右边表(子表)满足联接条件的记录。(子表)满足联接条件的记录。n例例s23:查询:查询每个学生每个学生的全部信息及其选课的全部信息及其选课情况情况SELECT xsda.*,xsxk.*FROM xsda LEFT OUTER JOIN xsxk ON xsda.学号学号=xsxk.学号学号;n思考:例思考:
31、例s22与例与例s23有何不同?有何不同?2、联接查询(、联接查询(右联接右联接)nRight outer joinn列出右边表(子表)的所有记录和左边表列出右边表(子表)的所有记录和左边表(父表)满足联接条件的记录。(父表)满足联接条件的记录。n例例s24:select*from xsxk right outer join pkqk;on xsxk.课程代号课程代号=pkqk.课程代号课程代号n思考:怎样列出没有学生选的课程?思考:怎样列出没有学生选的课程?2、联接查询(、联接查询(完全联接完全联接)nFull outer joinn完全联接:列出两个表的所有记录、不论是完全联接:列出两个表
32、的所有记录、不论是否满足联接条件。否满足联接条件。n例例s25:Select*from xsda full outer join xsxk on xsda.学号学号=xsxk.学号学号;2、联接查询(、联接查询(三表联接三表联接)n例例s26:查看学生选课情况:学号,姓名,:查看学生选课情况:学号,姓名,课程代号,课程名称课程代号,课程名称select xsda.学号学号,xsda.姓名姓名,pkqk.课程代号课程代号,pkqk.课程名称课程名称 from xsda;right outer join xsxk;left outer join pkqk;on xsxk.课程代号课程代号=pkqk
33、.课程代号课程代号;on xsda.学号学号=xsxk.学号学号;2、联接查询(、联接查询(自联接自联接)n一个表与自身相联一个表与自身相联n需要使用表的需要使用表的别名别名nSQL允许在允许在 FROM 短语中为关系名定义别名,短语中为关系名定义别名,格式为:格式为:n as nAs可用可用空格空格代替代替。n例例s27:select x.学号学号 from xsda x;2、联接查询(、联接查询(自联接自联接)例例s28:select l.姓名姓名 as 小组长小组长,“带领带领”,f.姓名姓名 as 成员成员 from xsda2 as l,xsda2 as f;where l.学号学号
34、=f.小组长小组长2、联接查询(、联接查询(自联接自联接)3、子查询、子查询/嵌套查询嵌套查询n子查询是嵌套在另一查询中的子查询是嵌套在另一查询中的 Select-From-Where 表达式(表达式(Where/Having)nSQL允许多层嵌套,由内而外地进行分析,允许多层嵌套,由内而外地进行分析,子查询的结果作为父查询的查找条件子查询的结果作为父查询的查找条件n可以用多个简单查询来构成复杂查询,以增可以用多个简单查询来构成复杂查询,以增强强SQL的查询能力的查询能力3、嵌套查询(、嵌套查询(单值查询单值查询)n子查询只返回一行一列子查询只返回一行一列n父查询与单值子查询之间用比较运算符进
35、行父查询与单值子查询之间用比较运算符进行连接连接n运算符:运算符:、=、=、=、n例例s29:找出与王刚职称相同的员工:找出与王刚职称相同的员工Select*from rsda where 职称职称=(select 职称职称 from rsda where 姓名姓名=“王刚王刚”)3、嵌套查询(、嵌套查询(多值查询多值查询)n子查询返回多行一列子查询返回多行一列n运算符:运算符:In、All、Some|Any、Exists标量值与子查询返回集中的某一个相等,标量值与子查询返回集中的某一个相等,trueIN 被用来测试多值中的成员被用来测试多值中的成员例例s30:查询选修:查询选修A001课程的
36、学生的学号、课程的学生的学号、姓名。姓名。Select 学号学号,姓名姓名 From xsda;Where 学号学号 IN;(Select 学号学号 From xsxk;Where 课程代号课程代号=A001);子查询子查询子查询子查询多行多行多行多行1 1列列列列3、嵌套查询(、嵌套查询(多值成员多值成员In)n例例s31:查询选修了:查询选修了 高等数学高等数学的学生的学号和姓的学生的学号和姓名名Select 学号学号,姓名姓名From xsdaWhere 学号学号 IN(Select 学号学号 From xsxk Where 课程代号课程代号 IN(Select 课程代号课程代号From
37、 pkqkWhere 课程名称课程名称=高等数学高等数学);n但但VFP6不支持深层子查询。不支持深层子查询。3、嵌套查询(、嵌套查询(多值成员多值成员In)查询高等数学查询高等数学查询高等数学查询高等数学的课程代号的课程代号的课程代号的课程代号查询选择了高等数查询选择了高等数查询选择了高等数查询选择了高等数学的学生的学号学的学生的学号学的学生的学号学的学生的学号多值比较:多值比较:多行一列多行一列父查询与多值子查询之间的比较需用父查询与多值子查询之间的比较需用All来连接来连接标量值标量值s比子查询返回集比子查询返回集R中的每个都大时,中的每个都大时,sAll R 为为TrueAll表示所有
38、表示所有all、all、=all、allall 等价于等价于 not in3、嵌套查询(、嵌套查询(多值比较多值比较 ALL)3、嵌套查询(、嵌套查询(多值比较多值比较 ALL)例例s32:查询女生中年龄比男生都小的女生:查询女生中年龄比男生都小的女生的姓名的姓名 select 姓名姓名 from xsda where 出生日期出生日期 all(select 出生日期出生日期 from xsda where 性别性别=男男)and 性别性别=女女;3、嵌套查询(、嵌套查询(多值比较多值比较 ALL)n思考:思考:n找出具有最高平均成绩的学生的学号及平均找出具有最高平均成绩的学生的学号及平均成绩
39、。成绩。父查询与多值子查询之间的比较需用父查询与多值子查询之间的比较需用Some/Any来连接来连接,some与与any等价。等价。标量值标量值s只要只要比子查询返回集比子查询返回集R中的中的一个一个大大,s Some R 为为True 或或 s Any R 为为True some、some、=some、some=some 等价于等价于 in、some 不等价于不等价于 not in 3、嵌套查询(、嵌套查询(多值比较多值比较some/Any)n例例s33:找出不是出生最晚(年龄最小)的学生:找出不是出生最晚(年龄最小)的学生Select*From xsdaWhere 出生日期出生日期 som
40、e(Select 出生日期出生日期 From xsda);Select*From xsdaWhere 出生日期出生日期 (Select max(出生日期出生日期)From xsda);3、嵌套查询(、嵌套查询(多值比较多值比较some)Exists+子查询子查询用来判断该子查询是否返回元组用来判断该子查询是否返回元组当子查询的结果集当子查询的结果集非空非空时,时,Exists为为True当子查询的结果集当子查询的结果集为空为空时,时,Exists为为False不关心子查询的具体内容,因此一般用不关心子查询的具体内容,因此一般用 Select*具有外部引用的子查询,称为相关子查询具有外部引用的子
41、查询,称为相关子查询(Correlated Queries)外层元组的属性值作为内层子查询的条件外层元组的属性值作为内层子查询的条件3、嵌套查询(、嵌套查询(存在判断存在判断Exists)3、嵌套查询(、嵌套查询(存在判断存在判断Exists)n例例s34:查看已选课的学生信息:查看已选课的学生信息 select*from xsda where exists;(select*from xsxk where xsxk.学号学号=xsda.学号学号);n例例s35:查看未选课的学生信息:查看未选课的学生信息 select*from xsda where not exists;(select*fro
42、m xsxk where xsxk.学号学号=xsda.学号学号);3、嵌套查询(、嵌套查询(存在判断存在判断Exists)n基本原理基本原理3、嵌套查询(、嵌套查询(存在判断存在判断Exists)n思考:思考:n列出没有选列出没有选A008课程的学生的学号、姓课程的学生的学号、姓名。名。4、计算查询(、计算查询(聚合函数聚合函数)n把一列中的值进行聚合运算,返回单值的函数把一列中的值进行聚合运算,返回单值的函数n五个预定义的聚合函数五个预定义的聚合函数 平均值:平均值:Avg(ALL|DISTINCT)总和:总和:Sum(ALL|DISTINCT)最小值:最小值:Min(ALL|DISTIN
43、CT)最大值:最大值:Max(ALL|DISTINCT)计数:计数:Count(ALL|DISTINCT)4、计算查询(、计算查询(聚合函数聚合函数)n例例s15:求所有职工基本工资总和:求所有职工基本工资总和 select sum(基本工资基本工资)as 工资总和工资总和 from rsda;n例例s16:求所有职工基本工资平均值:求所有职工基本工资平均值n例例s17:求最高工资:求最高工资n例例s18:求最低工资:求最低工资n例例s19:求教授人数:求教授人数 select count(教授教授)from rsda;select count(职称职称)from rsda where 职称职
44、称=教授教授“;()5、分组查询(、分组查询(Group By子句子句)n将查询结果集按某一列或多列的值分组,值将查询结果集按某一列或多列的值分组,值相等的为一组,一个分组以一个元组的形式相等的为一组,一个分组以一个元组的形式出现。出现。n例例s20:求各职称的平均基本工资:求各职称的平均基本工资 select 职称职称,avg(基本工资基本工资)from rsda group by 职称职称;6、两种特殊联结查询、两种特殊联结查询n(1)别名与自联接查询)别名与自联接查询n格式为:格式为:n(2)内外层互相关嵌套查询)内外层互相关嵌套查询n这时内层查询的条件需要外层查询提供值,这时内层查询的
45、条件需要外层查询提供值,而外层查询的条件需要内层查询的结果。而外层查询的条件需要内层查询的结果。见见例例4-337、设定输出目标、设定输出目标 n(1)输出到独立的表。)输出到独立的表。使用短语使用短语n INTO DBF|TABLE TableName n(2)输出到数组。)输出到数组。使用短语使用短语n INTO ARRAY ArrayName n(3)输出到临时表。)输出到临时表。使用短语使用短语n INTO CURSOR CursorName n(4)将结果发送到已有的报表或标签中)将结果发送到已有的报表或标签中(报表或(报表或标签的内容在第八章介绍),在标签的内容在第八章介绍),在S
46、ELECT-SQL语句语句中使用中使用REPORT FROM短语或短语或LABEL FROM短语。短语。7、设定输出目标、设定输出目标n(5)输出到主窗口。)输出到主窗口。使用短语使用短语TO SCREENn(6)输出到默认的浏览窗口。)输出到默认的浏览窗口。不需要指定不需要指定去向。去向。n(7)将查询结果存放到文本文件。)将查询结果存放到文本文件。使用短使用短语语 TO FILE FileName ADDITIVE。n(8)将查询结果直接输出到打印机。)将查询结果直接输出到打印机。使用使用短语短语 TO PRINTER PROMPT。8、SQL的集合操作的集合操作SQL的结果集是元组的集合
47、的结果集是元组的集合多个多个 Select 语句的结果可以进行集合操作,语句的结果可以进行集合操作,使结果为使结果为“集合集合”SQL-92支持支持参加集合操作的关系(结果集)必须是参加集合操作的关系(结果集)必须是相容相容的的8、SQL的集合操作(的集合操作(相容相容)属性个数必须一致属性个数必须一致对应的类型必须一致对应的类型必须一致属性名无关属性名无关最终结果集采用第一个结果的属性名最终结果集采用第一个结果的属性名缺省为自动去除重复元组,缺省为自动去除重复元组,除非显式说明除非显式说明ALLOrder By放在整个语句的最后放在整个语句的最后8、集合操作类型、集合操作类型n并并n交交n差
48、差4.2 查询查询n4.2.1 建立查询文件建立查询文件n4.2.2 查询结果处理查询结果处理4.2.1 建立查询文件建立查询文件n1.利用查询设计器建立查询文件n 建立查询文件的方法:n一是通过“文件”菜单中的“新建”命令;二是通过项目管理器;三是通过命令creat query 查询文件名;这三种方法都可以进行查询设计器。4.2.1 建立查询文件建立查询文件n2.利用查询向导建立查询文件n利用查询设计器可以创建各种复杂查询,但利用查询设计器可以创建各种复杂查询,但是要求用户自行选择字段、设定筛选条件、是要求用户自行选择字段、设定筛选条件、设定分组条件等。设定分组条件等。n设计者只要按照向导指
49、示的步骤,可以轻松设计者只要按照向导指示的步骤,可以轻松地创建用户所需的大部分查询。地创建用户所需的大部分查询。4.2.2 查询结果处理查询结果处理n1实现查询结果的分组n【例例4-42】我们想知道职工中相同职称职工我们想知道职工中相同职称职工的平均基本工资,则可以把对应职称的记录的平均基本工资,则可以把对应职称的记录集合到一组中,然后计算平均值。即每种职集合到一组中,然后计算平均值。即每种职称一组,求出平均基本工资后形成一个数据称一组,求出平均基本工资后形成一个数据记录,结果按平均基本工资升序排列。记录,结果按平均基本工资升序排列。4.2.2 查询结果处理查询结果处理n2查询文件的维护n(1
50、)执行查询)执行查询n查询的执行有两种情况,一个是在查询设计器中设计好查询查询的执行有两种情况,一个是在查询设计器中设计好查询时,直接执行;另一种情况是将查询作为文件保存起来之后时,直接执行;另一种情况是将查询作为文件保存起来之后再执行。再执行。n在查询设计器中设计过程中,系统菜单给出在查询设计器中设计过程中,系统菜单给出“查询查询”菜单,菜单,在在“查询查询”菜单下选择菜单下选择“运行查询运行查询”。也可以单击工具栏上。也可以单击工具栏上的的“”执行查询。执行查询。n在命令窗口输入在命令窗口输入“Do.qpr”即可运即可运行指定的查询。也可以运行查询命令加入到程序和菜单中运行指定的查询。也可