如何解决以下问题: 找出档案表中的专业名称、有几个专业 从选课表中查出所有记录。 找出学号和成绩 ( 成绩大于80分; 课程号为“1002”或“1004”,并且成绩小于75分) 成绩大于80分的学生的姓名、或者姓名和专业 成绩等于80分的学生选修的课程名和学分 成绩小于60分的学生的所有信息 成绩在80到100分之间的选课信息 课程表中检索出课程名中带有“学”字的课程号和课程名 按学分升序检索出选课表中的所有信息 先按课程号升序排列,再按学分降序排列检索出选课表中的所有信息 如何进行计算查询,如计算某一门课程的平均分、某同学已经获得的总学分等等 求出学生来自多少个城市 求出来自“北京”的学生的总成绩 检索学时数最多的课程名和学分 检索出除北京之外的其他学生的平均分。 求出每门课程的平均分 选修了两门课以上学生的平均分。 检索出尚未填写家庭住址的学生信息 别名的使用:检索出选修了会计学的学生姓名的信息 谓词[NOT] EXISTS (子查询)和量词,ANY、SOME和All:哪些学生没有选修课程、至少选修了一门课程的学生的信息、成绩大于2004150101号学生所有成绩的学生的学号。 超联接查询:成绩大于70的学生的学号、姓名,性别和选修的课程号、成绩等信息;选修了“数据库应用”或“计算机基础”的学生的学号、姓名、专业、课程号、课程名和成绩等信息;所有学生的学号,姓名,课程号,成绩等相关情况 几个特殊选项:显示部分结果、查询-表、查询-数组、查询-临时表、查询-文件、查询-打印 如何进行表的操作(建立、删除、修改)、表记录的操作(增、删、改) 视图创建语法 如何使用工具来建立合适的SQL查询命令(查询、视图的向导和设计器)、查询与视图的异同、如何更新;P122例4-35 如何解决以下问题: 找出档案表中的专业名称、有几个专业 从选课表中查出所有记录。 找出学号和成绩 ( 成绩大于80分; 课程号为“1002”或“1004”,并且成绩小于75分) 成绩大于80分的学生的姓名、或者姓名和专业 成绩等于80分的学生选修的课程名和学分 成绩小于60分的学生的所有信息 成绩在80到100分之间的选课信息 课程表中检索出课程名中带有“学”字的课程号和课程名 按学分升序检索出选课表中的所有信息 先按课程号升序排列,再按学分降序排列检索出选课表中的所有信息 如何进行计算查询,如计算某一门课程的平均分、某同学已经获得的总学分等等 求出学生来自多少个城市 求出来自“北京”的学生的总成绩 检索学时数最多的课程名和学分 检索出除北京之外的其他学生的平均分。 求出每门课程的平均分 选修了两门课以上学生的平均分。 检索出尚未填写家庭住址的学生信息 别名的使用:检索出选修了会计学的学生姓名的信息 谓词[NOT] EXISTS (子查询)和量词,ANY、SOME和All:哪些学生没有选修课程、至少选修了一门课程的学生的信息、成绩大于2004150101号学生所有成绩的学生的学号。 超联接查询:成绩大于70的学生的学号、姓名,性别和选修的课程号、成绩等信息;选修了“数据库应用”或“计算机基础”的学生的学号、姓名、专业、课程号、课程名和成绩等信息;所有学生的学号,姓名,课程号,成绩等相关情况 几个特殊选项:显示部分结果、查询-表、查询-数组、查询-临时表、查询-文件、查询-打印 如何进行表的操作(建立、删除、修改)、表记录的操作(增、删、改) 视图创建语法 如何使用工具来建立合适的SQL查询命令(查询、视图的向导和设计器)、查询与视图的异同、如何更新;P122例4-35
本章学习线索: 第四章 关系数据库标准语言SQL 怎么用SELECT查询表中的记录 SQL是什么(与关系数据库) 查询结果如何处理-去向 如使用工具(向导、设计器)来帮助建立SQL命令 查询与视图的使用-自学 如何解决以下问题: 从档案表中查出专业名称 档案表中的学生分几个专业 从选课表中查出所有记录。 成绩大于80分的学生的学号和成绩 课程号为“1002”或“1004”,并且成绩小于75分的学号和成绩 成绩大于80分的学生的姓名和专业 成绩等于80分的学生选修的课程名和学分。 成绩大于75分的学生的姓名 成绩小于60分的学生的所有信息 成绩在80到100分之间的选课信息 课程表中检索出课程名中带有“学”字的课程号和课程名 按学分升序检索出选课表中的所有信息 先按课程号升序排列,再按学分降序排列检索出选课表中的所有信息 如何进行计算查询,如计算某一门课程的平均分、某同学已经获得的总学分等等 求出学生来自多少个城市 求出来自“北京”的学生的总成绩 检索学时数最多的课程名和学分 检索出除北京之外的其他学生的平均分。 求出每门课程的平均分 选修了两门课以上学生的平均分。 检索出尚未填写家庭住址的学生信息 别名的使用:检索出选修了会计学的学生姓名的信息 谓词[NOT] EXISTS (子查询)和量词,ANY、SOME和All:哪些学生没有选修课程、至少选修了一门课程的学生的信息、成绩大于2004150101号学生所有成绩的学生的学号。 超联接查询:成绩大于70的学生的学号、姓名,性别和选修的课程号、成绩等信息;选修了“数据库应用”或“计算机基础”的学生的学号、姓名、专业、课程号、课程名和成绩等信息;所有学生的学号,姓名,课程号,成绩等相关情况 几个特殊选项:显示部分结果、查询-表、查询-数组、查询-临时表、查询-文件、查询-打印 如何进行表的操作(建立、删除、修改)、表记录的操作(增、删、改) 视图创建语法 如何使用工具来建立合适的SQL查询命令(查询、视图的向导和设计器)、查询与视图的异同、如何更新;P122例4-35
第四章 关系数据库标准语言SQL 及数据查询 1.学习目标 * 掌握SQL语言的基本功能 * 使用SQL语言产生和修改数据库表 * 使用SQL语言操纵数据库数据 2.学习指南 * 通过档案表、课程表、选课表练习各种SQL语句操作 * 完成P127习题四1~9题,并将对应的SQL操作语句 保留在一个文件中,作为作业提交。 3.难点重点 * 掌握SQL语句的各种基本操作语句的格式和使用方法 , 包括带有各种集合函数、分组排序的查询操作; * 给定关系表和查询要求,会写出正确的SQL语句 1.课前思考 * 关系数据库的组织结构 * 关系数据模型和关系数据库的术语 * 关系数据库管理系统的基本功能 2.学习目标 * 掌握SQL语言的基本功能 * 使用SQL语言产生和修改数据库表 * 使用SQL语言操纵数据库数据 3.学习指南 * 通过教材的档案表、课程表、选课表,练习SQL各种语句的操作; * 通过创建自己的数据库和表练习对数据库和表的操作; * 完成P127习题四1~9题,并将对应的SQL操作语句保留在一个文件中,作为作业提交。 4.难点重点 * 掌握SQL语句的各种基本操作语句的格式和使用方法,包括带有各种集合函数、分组排序的查询操作; * 给定关系表和查询要求,会写出正确的SQL语句。
第一讲 SELECT-FROM-WHERE SQL 概述 SQL 的查询功能 单表查询 多表查询 连接查询 嵌套查询 BETWEEN…AND… LIKE
4.1 SQL概述 SQL是结构化查询语言 STRUCTURED QUERY LANGUAGE 的缩写,数据查询是SQL的最主要的组成部分,此外,SQL还包含数据定义、数据操纵和数据控制等部分。 SQL已经成为关系数据库的标准语言,所有关系数据库管理系统都支持SQL,VFP也如此。 SQL 发展:最早的SQL是1986年10月美国ANSI公布的。随后ISO于1987年6月也正式采纳它为国际标准,1989年又推出了SQL89版,1992年又推出了SQL92新标准版本。 SQL是结构化查询语言(Structured Query Language)的缩写,是关系数据库的标准语言。SQL是1974年在IBM的关系数据库SYSTEM R上实现的语言。它提供给用户一种表示方法说明要查询的结果特性,至于如何查询、以及查询结果的形式都由DBMS来完成。这种语言由于其功能丰富、方便易学受到用户欢迎。1986 年由美国国家标准局(ANSI)及国际标准化组织(ISO)公布作为关系数据库的标准语言。 SQL名为结构化查询语言, 实际功能包括数据定义、数据操纵和数据控制。目前新的SQL标准是1992年制定的SQL-92,简称SQL2。它的全名是"International Standard,ISO/IEC9075: 1992Database Language SQL"。 在SQL2基础上,又增加了许多新特征,称为SQL3。SQL标准的制定使得几乎所有的数据库厂家都采用SQL语言作为其数据库语言。但各家又在SQL标准的基础上进行扩充,形成自己的语言。 SQL Server扩充SQL标准称为Transact-SQL,简称T-SQL。
SQL语言主要特点: (1)SQL是一种结构化的语言,集数据定义DDL、数据操纵DML、数据控制DCL功能为一体。具有数据定义、数据查询、数据操纵和数据控制等功能。 (2) SQL是一种非过程化的语言,它不需要告诉计算机怎样做,只要描述清楚“做什么”即可。 1 语言功能的一体化: 集数据定义DDL、数据操纵DML、数据控制DCL功能为一体。并且它不严格区分数据定义和数据操纵,在一次操作中可以使用任何语句。 SQL 语言具有数据定义、数据操纵和数据控制功能,这为数据库应用开发提供了良好的环境。用户在数据库行以后,可以修改模式,不影响数据库的运行。不象非关系数 据库系统,修改模式需要先停止数据库运行,转储数据,修改模式,编译修改了的模式以后再重新装入数据库,使得修改模式非常不方便。 2 模式结构的一体化: 关系模型中唯一的结构类型就是关系表,这种数据结构的单一性,使得对数据库数据的增、删、改、查询等操作都只须使用一种操作符。 3高度非过程化的语言 使用SQL语言操作数据库,只须提出"做什么"无须指明"怎样做"。用户不必了解存取路径。存取路径的选择和SQL语句的具体执行由系统自己完成,从而简化了编程的复杂性,提高了数据的独立性。 4 面向集合的操作方式 SQL语言在元组集合上进行操作,操作结果仍是元组集合。查找、插入、删除和更新都可以是对元组集合操作。 5 两种操作方式、统一的语法结构 SQL语言既是自含式语言,又是嵌入式语言。作为自含式语言,可作为联机交互式使用,每个SQL语句可以独立完成其操作;作为嵌入式语言,SQL语句可嵌入到高级程序设计语言中使用。 6 语言简洁、易学易用: SQL是结构化的查询语言,语言非常简单,完成数据定义、数据操纵和数据控制的核心功能只用了9个动词: Create; Drop;Alter; Select; Delete; Insert; Update; Grant; Revoke。 SQL的语法简单,接近英语口语,因此容易学习,使用方便。 SQL语言作为数据库语言,有它自己的词法和语法结构,并有其专用的语言符号,不同的系统稍有差别,主要的符号都相同。下面给出主要的语言符号: 大括号{ }:大括号中的内容为必选参数,其中可有多个选项,各选项之间用竖线分隔,用户必须选择其中的一项。 方括号[ ]:方括号中的内容为可选项,用户根据需要选用。 竖线| :表示参数之间'或'的关系。 省略号"…":表示重复前面的语法单元。 尖括号< >:表示下面有子句定义。 方括号和省略号[,…n]:表示同样选项可以重复1到n遍;
(3)SQL语法比较简单,但语言功能很强,它很接近英语自然语言,因此容易学习和掌握 (4)SQL命令可以交互方式使用,也可以嵌入方式使用,如嵌入程序设计语言中使用,VFP就是这种方式。 SQL的命令动词参见表4-1: 查询:SELECT 定义:CREATE DROP ALTER 操纵:INSERT UPDATE DELETE 控制:GRANT REVOKE
4.2查询功能 SQL的核心是查询。SQL的查询命令也称作SELECT命令,它的基本形式由SELECT FROM WHERE查询模块组成,多个查询块可以嵌套执行,VFP的 SQL-SELECT语法如下: SELECT [ DISTINCT ] <目标字段表> FROM 表名1 [,表名2] [ , … ] [ WHERE 记录筛选条件] [ GROUP BY 分组字段表 ] [ HAVING 组过滤条件] [ORDER BY 排序字段1[ASC | DESC] [ 排序字段2 … ] ] SELECT [UNIQUE/DISTINCT]<目标列名字> FROM 表名[,表名]…. [ WHERE 条件表达式] [ GROUP BY 分组的列名 ] [ HAVING 对组再选择的条件表达式] [ORDER BY 排序列名[ASC/DESC]]
SELECT命令6个短语的含义:须掌握 SELECT:要挑选表中哪些字段(以逗号分隔)——“投影” FROM:说明所选字段来自哪些表,以逗号分隔。 WHERE:说明所查询记录的过滤条件——“选择” GROUP BY:查询结果如何分组,用以分组统计、汇总 HAVING:挑拣分组的条件, 必须跟随GROUP BY使用 ORDER BY:确定查询结果的排列顺序
4.2.1 简单查询 SELECT [ DISTINCT ] <目标字段表> FROM 表名 [ WHERE 记录筛选条件] 按以上命令格式,请写出如下问题的查询命令: 找出档案表中的专业名称 例4-2 档案表中有几个专业 例4-2 DISTINCT 成绩超过70分的有哪些课程,找出课程号 例4-5 档案表中有哪些学生的档案,请给出他们的姓名 例4-1 从选课表中查出所有记录。“ * ”号的使用 例4-3 找出学号和成绩 (成绩大于80分呢 例4-4 ,或者要求 课程号为“1002”或“1004”,并且成绩小于75分例4-6)
例4.1 从档案表中查出专业名称。 SELECT 专业 FROM 档案表 结果是: 财会 可以看到查询结果中 财会 有重复值,如果要去 金融 掉重复值,需要指定 金融 DISTINCT 短语。 营销
例4-2结果 返回
例4-2结果 DISTINCT 返回
例4-5结果 返回
例4-3结果 返回
例4-1结果 返回
例4-4结果 返回
例4-6结果 返回
查找出档案表中有几个专业: SELECT DISTINCT 专业 FROM 档案表 结果是: 财会 金融 营销
例 4.2 从选课表中查出所有记录。 SELECT * FROM 选课表 结果是: 2004130101 1001 90 2004130101 1002 80 2004130101 1003 72 2004130102 1003 85 2004130102 1004 80 2004140101 1002 65 2004150101 1004 55 “*”是多字段通配符,表示某表中所有字段。
例4.3 检索出成绩大于80分的学号和成绩。 SELECT 学号,成绩 FROM 选课表; WHERE 成绩>80 结果是: 2004130101 90 2004130102 85 这里的WHERE短语是查询条件,查询条件条件可以是任意复杂的逻辑表达式。
例4.4 检索出课程号为“1002”或“1004”,并且成绩小于75分的学号和成绩。 SELECT 学号,成绩 FROM 选课表; WHERE 成绩<75 AND ; (课程号=’1002’ OR 课程号=’1004’) 结果是: 2004140101 50 2004150101 55 前面的几个例子在FROM之后只指定了一个关系,如果有WHERE条件子句,系统首先根据指定的条件依次检验关系中的每个记录,如果没有指定WHERE子句,则不进行检验,然后选出满足条件的记录。
4.2.2 简单的联接查询——从多表查询 SELECT [DIST] [表.] 字段1 [ , [表.]字段2 … ] FROM 表1,表2 [ , … ] WHERE 表连接条件 [ AND 记录筛选条件 ] 请思考用简单的联接查询如何解决: 检索出成绩大于80分的学生的姓名和专业 例4-7 成绩等于80分的学生选修的课程名和学分例4-8 成绩小于60分的学生的所有信息 结果 SELECT 姓名,专业 FROM; 档案表,选课表 WHERE (成绩>80); AND (档案表.学号=选课表.学号) 结果是: 李洪昆 财会 王倩 财会 这里所要求检索的内容分别来自于选课表和档案表两个表,其中的“档案表.学号=选课表.学号”是联接条件。“.”是关系联接符。
例4-7结果 返回
例4-8结果 返回
不及格学生的所有信息 返回 SELECT档案表.*,课程表.课程号,课程名,学时数,学分,成绩 FROM; 档案表,选课表,课程表 WHERE 成绩<60 AND ; 档案表.学号=选课表.学号 AND 课程表.课程号=选课表.课程号
例4.8 检索出成绩等于80分的学生选修的 课程名和学分。 SELECT 课程名,学分 FROM ; 例4.8 检索出成绩等于80分的学生选修的 课程名和学分。 SELECT 课程名,学分 FROM ; 课程表,选课表 WHERE 成绩=80 ; AND 选课表.课程号=课程表.课程号 结果是: 计算机基础 2 会计学 4 从上面的例题可以看出,连接条件的两边带不带括号都是可行的。 SELECT 课程名,学分 FROM ; 课程表,选课表 WHERE选课表.课程号=课程表.课程号; AND 成绩=80
4.2.3 嵌套查询 基于多个关系的查询中,若结果出自一个关系,但相关的条件却涉及多个关系。语法: SELECT [ DISTINCT ] <目标字段表> FROM 表名 WHERE 字段名 运算符 ( Select-From-Where ) 记录筛选条件 内层子查询 例4.7 检索出成绩大于80分的学生的姓名和专业。 例4.8 索出成绩为80分的学生选修的课程名和学分。 例4.10 成绩小于60分的学生的档案表信息 例4.7 检索出成绩大于75分的学生的姓名。 SELECT 姓名,专业 FROM 档案表 WHERE; 学号 IN (SELECT 学号 FROM; 选课表 WHERE 成绩>80) 例4.8 检索出成绩为80分的学生选修的课程名和学分。 SELECT 课程名,学分 FROM 课程表 ; WHERE 课程号 IN; (SELECT 课程号 FROM 选课表 WHERE 成绩=80) 例4.10成绩小于60分的学生的档案表信息 SELECT * FROM 档案表 WHERE; 选课表 WHERE 成绩<60) 结果是: 李洪昆 王倩 可以看到,这个命令中有两个SELECT-FROM-WHERE 查询语句,即内外层查询块。这里的IN相当于集合运算符∈(属于)。
例4.7结果 返回
例4.8结果 返回
例4.10结果 返回
SELECT * FROM 档案表 WHERE 学号 ; NOT IN (SELECT 学号 FROM 选课表 ; 例4.10 检索出成绩小于60分的学生的所有信息 SELECT * FROM 档案表 WHERE 学号 ; NOT IN (SELECT 学号 FROM 选课表 ; WHERE 成绩>60) 结果是: 2004140101 李义 男 金融 昆明 2004140102 吴文英 女 金融 2004150102 赵西 男 营销 西安 这里的 NOT IN 是不属于运算。
4.2.4 几个特殊的运算符 BETWEEN....AND.... “在 … 和 … 之间” LIKE “具有 … 特征,象…一样” SQL中通配符“%”表示0个或多个字符, “_”(下划线)表示一个字符。 例4.11 检索出成绩在80到100分之间的选课信息 例4.12 从课程表中检索出课程名中带有“学”字的课程号和课程名。 例4.13 找出家庭住址不是”西安”也不是”北京"的同学的学号和姓名。 成绩 BETWEEN 80 AND 100 课程名 LIKE "%学" 。(BETWEEN....AND.…例题) SELECT * FROM 选课表 WHERE 成绩 ; BETWEEN 80 AND 100 结果是: 2004130101 1001 90 2004130101 1002 80 2004130102 1003 85 2004130102 1004 80 家庭住址 NOT IN ("西安" ,"北京")
BETWEEN … AND … 是 “在 … 和 … 之间”,该查询条件等价于: 例4.11 的命令还可以写成下面的语句: SELECT * FROM 选课表 WHERE ;
(LIKE例题) 从课程表中检索出课程名中带有 “学”字的课程号和课程名。 SELECT 课程号,课程名 FROM 课程表; WHERE 课程名 LIKE “%学” 结果是: 1001 高等数学 1004 会计学 1005 经济学 LIKE 是字符串匹配运算符,通配符“%”表示0个或多个字符,另外通配符“_”(下划线)表示一个字符。
例4.11结果 返回
例4.12结果 返回
例4.13结果 返回
4.2.5 排序 使用ORDER BY 可以将SELECT查询结果排序。 SELECT – FROM – [ WHERE – ] 4.2.5 排序 使用ORDER BY 可以将SELECT查询结果排序。 SELECT – FROM – [ WHERE – ] ORDER BY 字段名 [ ASC | DESC ] [ ,字段名 [ ASC | DESC ] ... ] 其中:ASC表示升序(默认),DESC表示降序 例4.10 按成绩升序检索出选课表中的所有信息。 例4.11 先按课程号升序排列,若课程号相同再按成绩降序排列检索出选课表中的所有信息。 例4.10 按成绩升序检索出选课表中的所有信息。 SELECT * FROM 选课表 ORDER BY 成绩 例4.11先按课程号升序排列,再按成绩 降序排列检索出选课表中的所有信息。 SELECT * FROM 选课表 ORDER BY ; 课程号,成绩 DESC
例4.10结果
例4.11结果
例4.10 按学分升序检索出选课表中的所有信息。 SELECT * FROM 选课表 ORDER BY 成绩 结果是: 2004140101 1002 50 2004150101 1004 55 2004150101 1005 70 2004130101 1004 72 2004130101 1002 80 2004130102 1004 80 2004130102 1003 85 2004130101 1001 90 其中短语“ORDER BY 成绩”是按升序排列,默认情况下按升序排序,ASC可加也可不加;如果按降序排序,ORDER BY子句后面的字段名后必须加上DESC。
例4.11先按课程号升序排列,再按学分 降序排列检索出选课表中的所有信息。 SELECT * FROM 选课表 ORDER BY ; 课程号,成绩 DESC 结果是: 2004130101 1001 90 2004130101 1002 80 ׃ ׃ ׃ 2004130102 1004 80 2004150101 1004 55 2004150101 1005 70 这里是对两列排序的例子,对多列同样可以进行排序操作。
本讲重点回顾 SELECT [ DISTINCT ] <目标字段表> FROM 表名1 [,表名2] [ , … ] [WHERE 表连接条件 [ AND 记录筛选条件 ] ] [ ORDER BY 字段1 [ ASC | DESC ] [ ,字段2 [ ASC | DESC ] ... ] 单表查询 多表查询 连接查询 嵌套查询 BETWEEN…AND… LIKE SELECT [UNIQUE/DISTINCT]<目标列名字> FROM 表名[,表名]…. [ WHERE 条件表达式] [ GROUP BY 分组的列名 ] [ HAVING 对组再选择的条件表达式] [ORDER BY 排序列名[ASC/DESC]]
作业:1、本章书中例题 2、本章习题