680 likes | 792 Views
数据库应用基础. 第 8 章 查询基础. 第 8 章 查询基础. 8.1 查询语言. 所谓查询,就是指针对数据源的一组操作命令。 利用查询,可以完成检索数据、修改数据、定义数据的结构、定义数据库用户的权限等操作。用以实现查询的这些操作命令,构成了专门的数据库语言,绝大多数的关系数据库管理系统都采用了此类语言,这就是 SQL 。 SQL(Structured Query Language ) , 即结构化查询语言,是最重要的关系数据操纵语言,也是计算机间信息交换的标准语言。. SQL 的主要语句分组.
E N D
数据库应用基础 第8章 查询基础
8.1 查询语言 • 所谓查询,就是指针对数据源的一组操作命令。 • 利用查询,可以完成检索数据、修改数据、定义数据的结构、定义数据库用户的权限等操作。用以实现查询的这些操作命令,构成了专门的数据库语言,绝大多数的关系数据库管理系统都采用了此类语言,这就是SQL。 • SQL(Structured Query Language ),即结构化查询语言,是最重要的关系数据操纵语言,也是计算机间信息交换的标准语言。
SQL的主要语句分组 • DQL(Data Query Language,数据查询语言) • 用于检索数据,仅有一条命令,即: • SELECT:用于对数据的查询。 • DML(Data Manipulation Language,数据操作语言) • 用于修改数据,命令如下: • INSERT:用于增加数据到数据库; • UPDATE:用于从数据库中修改现存的数据; • DELETE:用于从数据库中删除数据。
SQL的主要语句分组 • DDL(Data Definition Language,数据定义语言) • 用于定义数据的结构,如创建、修改或者删除数据库的对象,主要命令如下: • CREATE TABLE:用于创建数据表; • ALTER TABLE:用于修改表结构; • DROP TABLE:用于删除数据表; • CREATE INDEX:用于创建索引; • DROP INDEX:用于删除索引。
SQL的主要语句分组 • DCL(Data Control Language,数据控制语言) • 用于定义数据库用户的权限,主要命令如下: • GRANT:为现有用户或组授予指定权限; • REVOKE:撤销现有用户或组所拥有的指定权限。 • 其中,最经常用到的为 • SELECT、INSERT、UPDATE、DELETE,即DQL和DML。
查询操作的两种主要形式 • 针对具体的操作对象实施特定处理 • 例如,修改表结构、删除数据记录等,操作对象本身的变化就是结果; • 从一个或多个表中检索数据 • 查询将形成一定格式的结果集。该结果集也是以表的形式组成和表现的,其中包含指定的列和经过筛选的数据记录。在查询时,结果集可以像数据表一样打开、浏览它。但结果集是数据查询结果的临时表现形式,关闭查询后,该结果集就自动撤消了。
保存查询 • 设计或编写好的查询(实际上就是一条查询命令),可以加以命名并保存起来,以便再次使用。 • 其中,以检索数据为目的的查询可以像表一样在需要用到表或查询的地方使用。
8.2.1 查询分类 • Access 将查询分为以下几种 • 选择查询 • 操作查询 • 交叉表查询 • 参数查询 • SQL特定查询
选择查询 • 利用选择查询,可以从一个或多个表中检索数据,可以控制显示数据源的全部或部分列,可以对显示的数据进行筛选、排序,可以对数据记录进行分组的汇总或计算处理等。 • 选择查询成功时,将以数据表视图形式显示返回结果集。 • 通常情况下,选择查询不会对源数据做任何更改。在需要的时候,可以对查询的结果集进行编辑,并将编辑结果保存到源数据表中。
操作查询 • 也叫动作查询,其作用是针对表中的数据记录和数据项进行操作处理。 • 操作查询处理的对象可以是一条记录也可以是多条记录 • 被操作的这些记录可以利用条件进行筛选。
操作查询 • Access提供有四种操作查询,即: • 删除查询:从一个或多个表中删除那些符合指定条件的记录。 • 更新查询:根据指定的条件更改表中的记录集。 • 追加查询:追加查询将查询结果集内的记录添加到表的末尾。 • 生成表查询:这种查询可以将查询结果保存为新表。 • 除生成表查询(该查询创建新表)外,所有动作查询都会更改基础表中的数据。这些更改无法轻易撤消。
交叉表查询 • 使用交叉表查询可以计算并重新组织数据的结构,这样可以更加方便地分析数据。 • 类似于数据透视表,交叉表查询可以对数据进行分组:一类在数据表左侧排列,另一类在数据表的顶端,然后计算处于交叉点位置数据的总计、平均值、计数或其他类型的总和。 • 此类查询多用于对数据的多类别分组统计,并便于表现统计结果。
参数查询 • 参数查询是指在执行时需要输入参数的那些查询。 • 此类查询在设计时可以利用参数符号来组成查询条件或其他成分,在执行时参数查询将显示对话框,以提示用户输入信息,然后用输入的值替换参数,构成实际查询。
SQL 特定查询 • 联合查询 • 可合并两个或多个表中的数据,但具体方式与其他查询不同。大多数查询通过联接行来合并数据,而联合查询通过追加行来合并数据。 • 传递查询 • 此类查询并不是由 Access 自己处理,而是被直接传递到远程数据库服务器,并由该服务器执行处理,然后将结果传递回Access。
SQL 特定查询 • 数据定义查询 • 这是一种特殊类型的查询,它不是用来处理数据,而是以表或其他数据库对象为操作对象, 用来创建、删除或修改数据库对象。 • 子查询 • 是嵌套于其他查询语句内部或嵌套于另一个子查询内部的SELECT语句,此类语句将在其他查询之前执行,并用其查询结果来影响所嵌入的查询。
8.2.3 查询创建方式 • 在Access中,查询可以通过三种方式来创建,即 • 设计视图 • SQL视图 • 查询向导
查询创建示例 • 基于“学生”表中的数据,查询出所有姓“马”的男生的学号、姓名、性别和民族信息。
查询创建示例 • 查询结果以表的形式显示
SQL视图 • 使用系统状态栏中的快捷按钮,或使用选项卡“结果”组中的视图菜单,可以在不同的查询视图间进行切换。 • 将上例查询切换到SQL视图时的窗口情况如图8.4所示。
SQL视图 • Access中的选择查询都是由SELECT语句所实现的。尽管可以在设计视图中通过一系列选择操作来设计查询,但最终都将转换成相应的SELECT语句形式。 • 在Access中,允许在一个SQL语句中出现的字符个数最多为64000。 • 此外, SQL特定查询只能在SQL视图中设计。
查询向导 • 利用该向导可以创建四类查询 • 简单查询 • 交叉表查询 • 查找重复项查询 • 查找不匹配项查询
8.3 简单的选择查询 • Access中的选择查询是使用SELECT语句实现的。
8.3.1 SELECT的基本格式 • 例:查找出所有“性别”为“男”且姓“章”的学生的学号和姓名,并按学号排序,对应的语句如下: SELECT 学号,姓名 FROM 学生 WHERE 性别="男" AND 姓名 LIKE "章*" ORDER BY 学号
8.3.1 SELECT的基本格式 • 这个SELECT语句所体现的基本语法为: SELECT <表达式或字段名列表> FROM <被查询的基本表名称列表> WHERE <条件> ORDER BY <排序方式> 一个完整的SQL语句,不要求必须在一行内写完,通常可将其各个部分分别分行来写,这样便于阅读和理解。
SELECT • SELECT是选择查询的命令动词,即用来表示这是个用来实现选择查询的语句。 • 其后的<表达式或字段名列表>用来构成在查询结果集中出现的数据列。 • Access中规定,这里最多可以出现255个表达式或字段名。 • 如果同时需要显示若干个字段,可以用逗号隔开各个字段名。 • 如果需要显示所有字段的数据,可以用星号(*)来表示
SELECT 示例 SELECT * FROM 学生 WHERE 性别="男" AND 姓名 LIKE "章*" ORDER BY 学号 SELECT 学号,姓名,YEAR(DATE())-YEAR(出生日期) AS 年龄 FROM 学生 WHERE 性别="男" AND 姓名 LIKE "章*" ORDER BY 学号
FROM • 该子句用以指出作为查询对象的表或查询(指在此之前已经创建的查询)。 • 一个SELECT语句可以从单个表或查询中检索数据,也可以从多个表或查询中检索数据。 • Access中规定,在一个查询中最多允许使用32个表或查询。 • 本次查询所涉及到的全部表名或查询名都应该在FROM后逐一列出。如果,出现了多个表或查询名,应该用逗号把这些名称隔开。
FROM示例 • 显示各学院教师名单的语句如下: SELECT 学院名称, 教师编号, 姓名 FROM 教师,学院 WHERE 教师.学院编号=学院.学院编号 ORDER BY 学院.学院编号 • 如果在多个表中含有同名字段,在列举字段名时就应该在字段名前加上相应表名前缀。如果某字段仅在某一个表中出现,则不必在字段名前加前缀。
WHERE • WHERE子句在查询中的作用是对查询的数据来源进行筛选。 • 它不象SELECT和FROM必须在SELECT语句中出现,如果WHERE 部分不出现在SELECT语句中,表示查询不对数据源进行筛选,相关表或查询中的所有数据行都出现在结果集中。 • 在仅关注符合一定条件的数据记录时,需要用到WHERE子句。 • 可在WHERE后以表达式的形式给出查询条件
WHERE示例 SELECT 学号,姓名,YEAR(DATE( ))-YEAR(出生日期) AS 年龄 FROM 学生 WHERE 性别="男" AND 姓名 LIKE "章*" ORDER BY 学号 • 系统在执行含有查询条件的查询时,将逐行检查数据源中的每条记录,如果该记录中的值符合条件要求,就从中取出相应数据项,进行查询的指定处理,否则,跳过该记录。也就是说当某记录不符合条件时,其中的数据不会参与查询,更不会出现在结果集中。
ORDER BY • ORDER BY子句用于指定查询结果数据的排序方式,该部分也是可选的。 • 如果ORDER BY 部分不在查询中出现,查询结果将按记录在原数据表中的顺序出现。如果出现了,则按指定的排序方式对结果集的数据行进行排序显示。 • 排序将根据在ORDER BY 后给出的字段的值的大小或者升序或者降序来进行。例如:ORDER BY 学号,表示将按学号进行排序。
ORDER BY • 默认的排序方式为升序,即按字段值从小到大排序,也可以利用附加的标识明确地指示对当前字段如何排序。 • 在字段名后的DESC表示降序,既按从大到小的顺序排序;ASC或者不加说明,则将按从小到大的顺序排序,即按升序排序。 SELECT 学号,姓名,YEAR(DATE( ))-YEAR(出生日期) AS 年龄 FROM 学生 WHERE 性别="男" AND 姓名 LIKE "章*" ORDER BY 学号
8.3.2查询条件 • 在查询中使用的表达式是由字段引用、运算符、常量及函数组成的字符串。 • 字段引用 • 是用来说明筛选记录时,需要引用记录中哪些字段的值。例如:性别="男"。在该表达式中,使用了性别字段。字段名可以直接书写,也可以用一对方括号括起,例如:[性别]="男"。 • 运算符 • 为一个标记或符号,指定表达式内执行的计算的类型。有数学、比较、逻辑和引用运算符等。
8.3.2查询条件 • 在查询中使用的表达式是由字段引用、运算符、常量及函数组成的字符串。 • 字段引用 • 是用来说明筛选记录时,需要引用记录中哪些字段的值。例如:性别="男"。在该表达式中,使用了性别字段。字段名可以直接书写,也可以用一对方括号括起,例如:[性别]="男"。 • 运算符 • 为一个标记或符号,指定表达式内执行的计算的类型。有数学、比较、逻辑和引用运算符等。
常量 • 不进行计算直接参加判断的值。 • 例如:性别=“男” AND YEAR(DATE( ))-YEAR(出生日期)>=21。其中,“男”为文本型常量,21为数字型常量。 • Access有四个常用常量: • True ,表示在逻辑上为 True 的内容。 • False,表示在逻辑上为 False 的内容。 • Null,表示缺少已知值。 • "",即空字符串,表示已知为空的值。
函数 • Access提供的函数很丰富,常用类别有:ActiveX、应用程序、数组、转换、数据库、日期/时间、域聚合、错误处理、文件输入/输出、文件管理、财务、检查、数学、邮件、杂项、程序流程、文本,等等。 • 每一类里有着若干以不同名称标识的具体函数,这些函数分别对应着一种特定的计算或处理。
函数 • 在表达式中使用函数时,应正确书写函数名称,同时按要求提供相应参数,参数通常在函数名后的一对圆括号中。Access的大多数函数都要求在调用时输入参数,也有些函数不需要参数,当一个函数具有多个参数时,要用逗号将这些参数分隔开。 • 函数执行后,总是会产生一个某种类型的值作为函数的调用结果。 • YEAR是用来返回指定日期的年份的函数 • DATE是获取系统当前日期的函数
查询条件的作用 • 构成查阅条件的表达式基本上都是以关系或逻辑运算为主体的。 • 所谓条件成立与不成立,实际上与条件表达式的结果是相应的,条件表达式的结果有两种可能:如果针对当前处理的记录,条件表达式的运算结果为True,表示条件成立,如果其结果为 False,表示条件不成立。 • 满足条件的记录将参与进一步处理,否则就被筛选掉了。
8.3.3 查询条件示例 • 与文本字段相关的条件示例 • 与数字字段相关的条件示例 • 与日期/时间字段相关的条件
与文本字段相关的条件示例 • 例1.姓名完全匹配值“谢成龙”。 SELECT * FROM学生 WHERE 姓名=”谢成龙” • 结果是姓名为”谢成龙”的那些记录。 • 例2.姓名不匹配值“谢成龙”。 SELECT * FROM学生 WHERE姓名<>”谢成龙” • 或 SELECT * FROM学生 WHERE NOT(姓名=”谢成龙”) • 结果是姓名不是”谢成龙”的那些记录。
与文本字段相关的条件示例 • 例3.指定姓名以“谢”开头。 SELECT * FROM学生 WHERE 姓名 LIKE ”谢*” • 其中星号可以代表有任意多个字符。 或者 SELECT * FROM学生 WHERE Left(姓名,1)= ”谢*” • 结果是姓名以”谢”开头的那些记录。 • 此处用到了 Left函数,这是一个用来处理字符串的函数
与文本字段相关的条件示例 • 常用字符串有: • Left(<字符串>,n),返回<字符串>中左端的n个字符; • Rright(<字符串>,n),返回<字符串>中右端的n个字符; • Mid (<字符串>,m,n),返回<字符串>中从m位开始的n个字符; • Trim(<字符串>),返回截取了<字符串>中前后空格的字符串; • Len(<字符串>),返回字符串的字符数。
与文本字段相关的条件示例 • 例4.指定姓名以“谢”开头且姓名由2个字组成。 SELECT * FROM学生 WHERE 姓名 LIKE ”谢?” • 其中每使用1个问号可以代表1个字符。结果是姓名以”谢”开头且姓名由2个字组成的那些记录; • 例5.姓名不以“谢”开头。 SELECT * FROM学生 WHERE 姓名 NOT LIKE ”谢*” • 结果是姓名不以”谢”开头的那些记录。
与文本字段相关的条件示例 • 例6.姓名中包含“谢”字。 SELECT * FROM学生 WHERE姓名 LIKE ”*谢*” • 结果是姓名含有”谢”的那些记录,其中”谢”字可以出现在姓名中的任意位置上。 • 例7.姓名按字母排序在“谢成龙”之后。 SELECT * FROM学生 WHERE姓名>”谢成龙” • 或 SELECT * FROM学生 WHERENOT (姓名<=”谢成龙”) • 结果是姓名排序在”谢成龙”之后的那些记录。