3. SQL语言的应用 3.1 SQL历史和优点 3.2 数据查询 3.3 数据操纵
3. SQL语言的应 SQL全称是结构化查询语言 目前SQL语言是关系数据库的标准语言 Structured Query Language---SQL 目前SQL语言是关系数据库的标准语言
3. SQL语言的应用 SQL语句分成三类,各类所包含的语句如下: 数据操纵语言DML(Data Manipulation Language) SELECT,INSERT,UPDATE和DELETE 数据定义语言DDL(Data Definition Language) CREATE,ALTER和DROP 数据控制语言DCL(Data Control Language) 相关的权限分配
3.1 SQL历史和优点 3.1.1 SQL的历史和标准 3.1.2 SQL的优点 1. 非过程化语言 2. 统一的查询语言 3. 所有关系数据库的公共语言
3.2 数据查询 3.2.1 数据查询建立与保存的方法 1. 使用查询向导建立查询 2. 使用查询设计器建立查询 3. 使用SQL语句建立查询 4. 查询的保存与修改
【例3-1】使用查询向导1 单击功能区“创建”命令选项卡中的“查询向导”按钮。
使用查询向导2 在出现的“新建查询”对话框中选择“简单查询向导”后,单击“确定”按钮。
使用查询向导3 选择为“学生表”,并将“可用字段”中的“学号、姓名、入学成绩”加入到“选定字段”列表框中。然后单击“下一步”按钮。
使用查询向导4 单击“下一步”。
使用查询向导5 选择“打开查询查看信息”单选框,并单击“完成”按钮
使用查询向导6 部分查询结果
【例3-2】查询设计器1
查询设计器2 选择学生表进行添加,然后双击“学号”和“姓名”字段。
查询设计器3
查询设计器4 单击“设计”命令选项卡中的“运行”按钮
【例3-3】SQL语句1---创建查询
SQL语句2-关闭“显示表”对话框
SQL语句3----切换到SQL视图
SQL语句4----编写SQL语句
SQL语句5----运行查询
SQL语句6----查询结果
4. 查询的保存与修改 保存查询对话框。保存的查询会出现在Access对象导航窗口中。 如果选择“打开”则直接运行了查询。 可以看到,通过在查询选项卡上单击鼠标右键,可以在SQL视图和设计视图间切换。
图 3-21 修改已保存的查询
3.2.2 单表查询 SQL语言提供了SELECT语句进行数据库的查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为: SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>, …] FROM <表名或视图名> [, <表名或视图名>, …] [WHERE <条件表达式>] [GROUP BY <表达式 > [HAVING <条件表达式>] ] [ORDER BY <表达式> [ASC |DESC]];
单表查询---SELECT语句 SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。 注意: (1)在编写SQL语句之前,必须知道数据库的模式 (2)为提高可读性,减少编写错误和有利于SQL语句的维护,SQL必须写成多行。 (3)SQL语句中,表达式和SQL中的符号的书写必须使用半角符号
1.单表基本查询 所谓单表查询是指FROM子句后面只有一个表的SELECT语句。
1.单表基本查询 【例3-4】返回“学生表”中的所有行和所有列。 SELECT不需要WHERE子句,可以返回所有行;要返回所有列,则在<目标列表达式>使用 * 即可。 select * from 学生表 【例3-5】查询成绩表中的所有记录。 select * from 成绩表;
图 3-22 例3-1的查询结果
1. 单表基本查询 2) 查询指定的列 给定一个数据表,要查询指定的列,必须在SELECT的<目标列表达式>中指定列名,这个操作为对该表实行投影操作。 【例3-6】检索“学生表”中的学号、姓名、性别和籍贯字段。 select 学号,姓名,性别,籍贯 from 学生表; 查询结果略。
1. 单表基本查询 3) 查询经过计算的值或更改列标题名 SELECT语句中,可以使用运算符来对列进行计算得到结果,要注意的是,这些运算只针对检索后的结果,它不会影响保存在数据库中的数值。 此外SELECT提供了<AS 字段名>更改字段名的方法。
1. 单表基本查询 【例3-7】对“学生表”的“入学成绩”除以600,求相对成绩,其显示的字段名为“相对成绩”。 select 学号, 姓名, 入学成绩/600 as 相对成绩 from 学生表; 【例3-8】求所有学生在2010年的年龄。 select 学号,姓名, 2010 - year(出生日期) as 年龄 from 学生表;
2. 选择表中的若干元组 (选择操作) 选择一个表中的若干元组(或记录)操作,是对该表实行选择操作。其方法是使用SELECT语句的WHERE子句中的条件。 1)消除取值重复的行 指定DISTINCT短语,表示在计算时要去除重复行。如果不指定DISTINCT短语或指定ALL短语(ALL为默认值),则表示不取消重复值。
消除取值重复的行 Distinct子句 【例3-9】输出学生表中所有的籍贯。 select 籍贯 from 学生表 order by 籍贯; 【例3-10】显示学生表中的学生来自全国哪些地方,即有哪些不同的籍贯。 select distinct 籍贯 from 学生表 order by 籍贯; 结果为去除了重复籍贯的23条记录,而原学生表中有30位同学。
选择操作---Where子句 2)查询满足条件的元组 WHERE子句常用的查询条件。
WHERE子句中的条件 操作符 类型 操作符 含义 关系运 算符 = 等于 < > 不等于 > 大于 >= 大于等于 小于 <= 小于等于 BETWEEN…AND 确定范围
WHERE子句中的条件2 逻辑运算符 AND 与, 用于多重条件 OR 或, NOT 非, 用于条件取非 属于(不属于) [NOT] IN 确定集合 通配运算符 LIKE 字符匹配
用关系运算符构造条件---数值 【例3-11】查找所有入学成绩大于等于600的同学的学号、姓名和入学成绩。 select 学号,姓名,入学成绩 from 学生表 where 入学成绩 >= 600; 这是数字类型查询例子,其查询结果略。
用关系运算符构造条件---逻辑 关系运算符包括:>、>=、=、<、<=、< >。 【例3-12】查找学生表中的贷款的学生学号和姓名。 select 学号, 姓名, 贷款否 from 学生表 where 贷款否 = True; 这是逻辑类型查询例子。
用关系运算符构造条件---日期 【例3-13】求1991年7月以后出生的学生学号和姓名。 select 学号,姓名,出生日期 from 学生表 where 出生日期>=#1991/07/01# 这是日期类型查询例子。
用关系运算符构造条件---Between 谓词BETWEEN…AND…用来查找属性值在指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。
用关系构造条件---Between例子 【例3-14】求入学成绩在550到630间的学生学号、姓名和入学成绩。 select 学生表.学号, 学生表.姓名, 学生表.入学成绩 from 学生表 where 学生表.入学成绩 between 550 and 630;
用关系构造条件---Between例子 上述SQL语句可以等价于如下SQL语句。 select 学生表.学号, 学生表.姓名, 学生表.入学成绩 from 学生表 where 学生表.入学成绩 >= 550 and 学生表.入学成绩 <= 630;
用关系构造条件---Between例子 如果要求入学成绩不在550到630间的学生学号、姓名和入学成绩,使用下列SQL语句。 select 学生表.学号, 学生表.姓名, 学生表.入学成绩 from 学生表 where 学生表.入学成绩 not between 550 and 630;
(2)用逻辑运算符构造多重条件 SELECT语句提供逻辑运算符AND和OR,可用来组合联结多个查询条件。AND的含义是表示多个条件间的“与”、“同时”或“并且”关系,OR的含义是表示多个条件间的“或”关系。这里AND的优先级高于OR,但我们可以用括号改变优先级。
用逻辑运算符构造多重条件---例子 【例3-15】查找入学成绩在550分以上的少数民族学生的学号、姓名和少数民族否。 select 学号,姓名,民族,入学成绩 from 学生表 where 入学成绩 >= 550 and 民族 <> “汉族” 查询结果略。
用逻辑运算符构造多重条件---例子 【例3-16】查找入学成绩在570分以上的女性学生,显示学号、姓名、性别和入学成绩。 select 学号,姓名,性别,入学成绩 from 学生表 where 入学成绩 >= 570 and 性别 = ‘女’ 查询结果略。
(3)确定集合 SELECT提供谓词IN用来查找属性值在指定集合的方法。而NOT IN表示属性值不在指定集合。
确定集合---例子 【例3-17】求籍贯为“江西南昌”或“四川成都”的学生学号、姓名和籍贯。 select 学生表.学号, 学生表.姓名, 学生表.籍贯 from 学生表 where 学生表.籍贯 in (“四川成都”,“江西南昌”);
确定集合---例子 上述SQL语句可以等价于如下SQL语句。 select 学生表.学号, 学生表.姓名, 学生表.籍贯 from 学生表 where 学生表.籍贯 = “四川成都” or 学生表.籍贯 = “江西南昌”; 查询结果略。
确定集合---例子 【例3-18】求籍贯不为“江西南昌”和“四川成都”的学生学号、姓名和籍贯。 select 学生表.学号, 学生表.姓名, 学生表.籍贯 from 学生表 where 学生表.籍贯 not in ("四川成都","江西南昌");
确定集合---例子 上述SQL语句可以等价于如下SQL语句。 select 学生表.学号, 学生表.姓名, 学生表.籍贯 from 学生表 where 学生表.籍贯 <> "四川成都" and 学生表.籍贯 <> "江西南昌";
(4)字符匹配 谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下: [NOT] LIKE ‘ <匹配串> ’ [ESCAPE ‘ <换码字符> ’ ] 其含义是查找指定的属性列值与<匹配串>相匹配的元组。
字符匹配 <匹配串>可以是一个完整的字符串,也可以含有通配符*和?。 *(星号)代表在任意位置(长度可以为0)上的任意字符。例如a*b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab等都满足该匹配串。 ?(问号)代表一个位置上任意字符。例如a?b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串。
(4)字符匹配---例子 【例3-19】查找以姓“杨”开头的学生学号和姓名。 select 学号,姓名 from 学生表 where 姓名 like “杨*”;
字符匹配---例子 【例3-20】查找以“慧”字为最后一个字符的学生学号和姓名。 select 学号,姓名 from 学生表 where 姓名 like “*慧”;
字符匹配---例子 【例3-21】查找第二个字符为“建”字的学生学号和姓名。 select 学号,姓名 from 学生表 where 姓名 like “?建*”; 思考:下列SQL语句与上面的有何不同。 select 学号,姓名; from 学生表; where 姓名 like “*建*”
字符匹配---例子 【例3-22】查找江西籍的男性学生的学号和姓名 select 学号,姓名,性别,籍贯 from 学生表 where 籍贯 like “江西*” and 性别 = “男”;
字符匹配---例子 【例3-23】查找江西和湖南籍的学生学号、姓名、性别和籍贯。 select 学号,姓名,性别,籍贯 from 学生表 where 籍贯 like “江西*” or 籍贯 like “湖南*”; 查询结果略。 【例3-24】查找非江西和湖南籍的学生学号、姓名、性别和籍贯。 select 学号,姓名,性别,籍贯 from 学生表 where not (籍贯 like “江西*”) and not (籍贯 like “湖南*”); 查询结果略。
(5)查询结果输出到新表 SELECT默认输出给用户浏览。SELECT同时提供INTO子句来将查询结果输出到新表中,其格式为: SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>,…] [INTO <目标>] FROM <表名或视图名> [, <表名或视图名>,…] [WHERE <条件表达式>] [GROUP BY <表达式 > [HAVING <条件表达式>] ] [ORDER BY <表达式> [ASC |DESC]]; INTO <目标>表示将查询结果保存到新表中。
(5)查询结果输出到新表 【例3-25】将籍贯为“江西”和“湖南”的学生学号、姓名、性别和籍贯输出到“湘赣学生名单”。 select 学号,姓名,性别,籍贯 into 湘赣学生名单 from 学生表 where 籍贯 like “江西*” or 籍贯 like “湖南*”;
3)对查询结果排序 用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,缺省值为升序。 【例3-26】查询所有学生的入学成绩,查询结果按入学成绩的降序排列。 select 学号,姓名,入学成绩 from 学生表 order by 入学成绩 desc 部分查询结果如图3-26所示。
3)对查询结果排序 【例3-27】查询所有学生的入学成绩,查询结果按入学成绩的升序排列。 select 学号,姓名,入学成绩 from 学生表 order by 入学成绩; 查询结果略。 SELECT语句支持多个关键字的排序。 【例3-28】对所有学生按入学成绩排降序和出生日期排降序输出学号、姓名、入学成绩和出生日期。 select 学号,姓名,入学成绩,出生日期 from 学生表 order by 入学成绩 desc, 出生日期 desc; 其部分查询结果如图3-27所示。
4)使用聚合函数 为了进一步方便用户,增强检索功能,SQL提供了许多聚合函数。所谓聚合函数是指对一个关系进行求和(sum)、求平均值(avg)等运算。
4)使用聚合函数 函数 含义 AVG(<表达式>) 计算查询的指定字段中所包含的一组值的算术平均值(Average)。 COUNT( * ) 统计元组个数。 COUNT(<表达式>) 计算查询所返回的记录数。 MIN(<表达式>) 返回查询的指定字段中包含的一组值的最小值。 MAX(<表达式>) 返回查询的指定字段中包含的一组值的最大值。 SUM(<表达式>) 返回查询的指定字段中包含的一组值的总和。
4)使用聚合函数 【例3-29】求学生表中入学成绩在600分以上的人数。 select count(*) from 学生表 where 入学成绩 >= 600; 结果为14人。 思考:求江西籍学生人数。 【例3-30】求学生表中入学成绩的平均成绩。 select avg(入学成绩) from 学生表; 结果为593.7667分。
5)对查询结果分组 SELECT使用GROUP BY子句来进行分组。我们通过例子来说明分组的功能。 【例3-31】按籍贯分类,求不同籍贯的同学人数。 select 籍贯,count(*) from 学生表 group by 籍贯 order by count(*) desc; 部分查询结果如图3-28所示。 【例3-32】求各个年级的班数。 select 年级,count(*) from 班级表 group by 年级; 结果略。 注意:使用GROUP BY子句时,在SELECT的字段列表中,凡没有出现在聚合函数中的字段,必须出现在GROUP BY子句中。