第 10 章 关系数据库标准语言 sql
DESCRIPTION
第 10 章 关系数据库标准语言 SQL. 10-1 SQL 语言简介 225 10-2 数据定义 226 10-3 数据操作 230 10-4 数据查询 234. 10-1 SQL 语言简介. 10-1-1 SQL 语言的规则 225 10-1-2 SQL 语言的特点 225. 10-1-1 SQL 语言的规则. 支持 SQL 语言的数据库是由表组成,它用一个或多个关系模式定义。 一个 SQL 表由行集合构成,一行是由多列构成,每列对应一个数据项。 - PowerPoint PPT PresentationTRANSCRIPT
1
第第 1010 章 关系数据库标准语言章 关系数据库标准语言 SQLSQL第第 1010 章 关系数据库标准语言章 关系数据库标准语言 SQLSQL
10-1 SQL 语言简介 225
10-2 数据定义 226
10-3 数据操作 230
10-4 数据查询 234
2
10-1 SQL10-1 SQL 语言简介语言简介10-1 SQL10-1 SQL 语言简介语言简介
10-1-1 SQL 语言的规则 225
10-1-2 SQL 语言的特点 225
3
10-1-1 SQL10-1-1 SQL 语言的规则语言的规则10-1-1 SQL10-1-1 SQL 语言的规则语言的规则1. 支持 SQL 语言的数据库是由表组成,它用一个或
多个关系模式定义。2. 一个 SQL 表由行集合构成,一行是由多列构成,
每列对应一个数据项。3. 表可以是一个实际存储数据在数据库中的表,也
可以是由视图构成的表的定义。4. 表和存储文件之间的关系可以是一对一也可以是
一对多的关系。5. 用户可以用 SQL 语句对视图和基本表进行查询等
操作。6. SQL 用户可以是应用程序,也可以是终端用户。
4
10-1-2 SQL 10-1-2 SQL 语言的特点语言的特点10-1-2 SQL 10-1-2 SQL 语言的特点语言的特点1. 简洁易学 SQL 虽然功能强大,但是只用了 9 个命令动词
完成了核心功能中的数据定义、数据操纵、数据控制,不需要掌握繁琐的语句。 SQL 语言接近英语口语,是面向用户、性能良好的语言,非常简单,容易掌握。
2. 高度集成化 SQL 语言集成了数据定义、数据操纵、数据控制等方面的功能,基本上包括了数据库活动中的各个方面,与非关系模型的数据库语言具有同样简单实用的特点,为用户提供了一个强有力工具。
3. 高度智能化 SQL 语言是一种非过程化、高度智能化的语言,只要用户描述清楚要完成什么功能, SQL 语言就可以将要求提交系统,自动完成全部工作。
4. 高度灵活化 SQL 语言是一种用法高度灵活化的语言,既能以人机交互方式来使用,也可以嵌入到程序开发语言中使用如 PowerBuilder 、 Visual FoxPro 、 Access ,使用方便、灵活。
5
10-2 10-2 数据定义数据定义10-2 10-2 数据定义数据定义
10-2-1 表的定义(创建表) 226
10-2-2 修改表的结构 228
10-2-3 删除表 229
10-2-4 视图的定义 230
6
10-2-1 10-2-1 表的定义(创建表表的定义(创建表))10-2-1 10-2-1 表的定义(创建表表的定义(创建表))命令格式 :CREATE TABLE | DBF < 表名 1> [NAME < 长表名 >] [FREE](< 字段名 1> < 字段类型 > [(< 宽度 > [, < 小数位数 >])][NULL|NOT NULL][CHECK < 有效性规则 1> [ERROR < 提示信息 1>]][DEFAULT < 默认值 1>][PRIMARY KEY|UNIQUE [< 候选关键字 1> TAG < 标识名 1>]][REFERENCES < 表名 2> [TAG < 标识名 2>]][NOCPTRANS][,< 字段名 2> < 字段类型 > [(< 宽度 > [,< 小数位数 >])]][NULL|NOT NUL
L][ CHECK < 有效性规则 2> [ERROR < 提示信息 2>]][ PRIMARY KEY | UNIQUE [< 候选关键字 2> TAG < 标识名 3>]][, FOREIGN KEY < 外部关键字 4> TAG < 标识名 4> [NODUP]REFERENCES < 表名 3> [TAG < 标识名 5>]]......)| FROM ARRAY < 数组名 >功能:创建一个只有字段没有记录的空数据表。
7
【例 10.1 】先创建一个数据库,其库名为“ d:\new book\ 图书管理”,再创建一个名为“图书 .DBF”的数据表,其表结构用关系模式表示为:图书 ( 图书编号 C(6), 书名 C(20), 出版单位 C(20), 单价 Y, 库存量 I ) ,并设置图书编号为主键。
CREATE DATABASE "d:\new book\ 图书管理 " CREATE TABLE "d:\new book\ 图书 " ( 图书编号 C(6); PRIMARY KEY, 书名 C(20), 出版单位 C(20), 单价 Y,库存量 I)
8
【例 10.2 】创建一个名为“借书 .DBF” 的数据表,其表结构用关系模式表示为:借书 ( 图书编号 C(6), 学号 C(8), 借阅日期 D, 归还日期 D,) ,并设置与上题“图书”表通过字段图书编号建立连接。
CREATE TABLE "d:\new book\借书 " ( 图书编号 C(6),学号 C(8), 借阅日期 D, 归还日期 D,; FOREIGN KEY 图书编号 TAG 图书编号 REFERENCES 图书 )
9
10-2-2 10-2-2 修改表的结构修改表的结构10-2-2 10-2-2 修改表的结构修改表的结构1 .命令格式1: ALTER TABLE < 表名 1>
ADD | ALTER [COLUMN] < 字段名 1> 字段类型 > [(< 宽度 > [,< 小数位数 >])]
[NULL | NOT NULL][CHECK < 有效性规则 1> [ERROR < 出错信息 1>]][DEFAULT < 默认值 1>][PRIMARY KEY | UNIQUE][REFERENCES < 表名 2> [TAG < 标识名 1>]][NOCPTRANS][NOVALIDATE]
功能:实现添加新字段 ( 用 ADD) 、修改已有字段 (ALTER) 的字段变量名、数据类型、宽度和完整性约束条件。
10
【例 10.3 】对创建的“图书”数据表增加一个“作者”字段,其数据类型为字符型,字段长度为 8。
ALTER TABLE "d:\new book\ 图书 " ADD 作者 C(8)
【例 10.4 】 把创建的“图书”表的“出版单位”字
段的宽度改为 30 ,并且给“库存量”字段确定有效性规则,即库存量小于0时显示“库存错误”。
ALTER TABLE "d:\new book\ 图书 " ALTER 出版单位 C(30) CHECK 库存量 >0 Error " 库存错误! "
11
2 .命令格式 2 : ALTER TABLE < 表名 >
ALTER [COLUMN] < 字段名 >[NULL | NOT NULL][SET DEFAULT < 默认值 >][SET CHECK < 有效性规则 > [ERROR < 出错信息>]][DROP DEFAULT][DROP CHECK][NOVALIDATE]
功能:修改指定字段的 DEFAULT 、 CHECK 规则,但不影响原有表中的数据。
12
【例 10.5 】为“图书”表的“书名”字段增设默认值“请输入书名:”。
ALTER TABLE “d:\new book\ 图书” ALTER 书名 ;
SET DEFAULT "请输入书名: "
13
3 .命令格式 3 : ALTER TABLE < 表名 1>
[DROP [COLUMN] < 字段名 1>][SET CHECK < 有效性规则 > [ERROR < 出错信息 >]][DROP CHECK][ADD PRIMARY KEY < 主关键字 > TAG < 标识名 1> [FOR < 条件 1>]][DROP PRIMARY KEY][ADD UNIQUE < 候选关键字 1> [TAG < 标识名 2> [FOR < 条件 2>]]][DROP UNIQUE TAG < 候选标识名 >][ADD FOREIGN KEY [< 外关键字 >] TAG < 标识名 3> [FOR < 条件 3>]REFERENCES < 表名 2> [TAG < 标识名 4>]][DROP FOREIGN KEY TAG < 标识名 5> [SAVE]][RENAME COLUMN < 字段名 2> TO < 字段名 3>][NOVALIDATE]
功能:是对前两个功能的补充和增强,可以修改字段名( RENAME )、删除字段名( DROP ),并且对有效性规则可以进行增加( ADD )、删除( DROP )等。
14
【例 10.6 】把“图书”表的“作者”字段该为“作者简介”,再删除 “作者简介”字段。把“借书”表的“图书编号”设为候选关键字。
ALTER TABLE "d:\new book\ 图书 " RENAME COLUMN 作者 TO 作者简介
ALTER TABLE “d:\new book\ 图书” DROP COLUMN 作者简介ALTER TABLE "d:\new book\ 借书 " ADD UNIQUE 图书编号 TAG 编
号
15
10-2-3 10-2-3 删除表 删除表 10-2-3 10-2-3 删除表 删除表 命令格式 :DROP TABLE < 表名 > 功能:直接从磁盘上 <或当前打开的数据库中删除指
定的表文件。【例 10.7 】删除已创建的“图书 .DBF” 数据表。
DROP TABLE "d:\new book\ 图书 "
注意:删除表最好打开相应的数据库,再执行。否则以后会出现错误提示。如果只是想删除一个表中的所有记录,则应使用 DELETE 语句,
16
10-2-4 10-2-4 视图的定义视图的定义10-2-4 10-2-4 视图的定义视图的定义命令格式 :CREATE VIEW <视图名 > AS SELECT <查询语句 >功能:按照 SELECT 查询语句创建一个指定视图名的本地视
图或者远程视图。说明:使用当前数据库建立的视图,称为本地视图。如果使当
前数据库之外的数据库建立的视图称为远程视图。【例 10.8 】从前面创建的“学生情况表”表中取得记录来建
立学生信息视图。
OPEN DATABASE "d:\new book\计算机系学生管理 .dbc"CREATE VIEW 学生信息 AS SELECT * FROM学生情况表
说明:“ *” 代表取所有字段。
17
10-3 10-3 数据操纵 数据操纵 10-3 10-3 数据操纵 数据操纵
10-3-1 插入记录 23010-3-2 更新记录 23210-3-3 删除记录 233
18
10-3-1 10-3-1 插入记录插入记录10-3-1 10-3-1 插入记录插入记录1 .命令格式 1:INSERT INTO 表名〉 [(< 字段名 1> [,< 字段名 2>, ...])] VALUES ( < 表达式 1> [,< 表达式 2>, ...]) 功能 : 在指定的表文件末尾追加一条记录。各字段值为 V
ALUES 中对应的各表达式值。
19
【例 10.9 】向“学生情况表”数据表中添加一条记录,其学号是“ 20111” ,姓名是“王英”,性别是“女”,出生日期是“ 06/18/1986” 。
INSERT INTO "d:\new book\ 学生情况表 "( 学号 , 姓名 , 性别 ,;出生日期 ) VALUES ("20111"," 王英 "," 女 ",ctod("06/18/1986"))BROWSE
20
2 .命令格式 2:INSERT INTO 〈表名〉 FROM ARRAY 〈数组名 |FROM
MEMVAR功能:为指定的表添加一条记录,用数组或同名的内存变
量的值赋值给记录的各字段。
21
【例 10.10 】先定义数组 CJ(4) ,它元素值分别为 (“20100”,“丁丁” ,80,90) ,然后再把该数组值插入到“学生成绩表”表中。
DIMENSION CJ(4)CJ(1)= "20100"CJ(2)= "丁丁 "CJ(3)=80CJ(4)=90INSERT INTO "d:\new book\学生成绩表 " FROM ARRAY CJ
BROWSE
22
【例 10.11 】先定义内存变量,分别为学号 =“22111” ,姓名 =“黄红”,英语 =95 ,电子线路 =85 ,然后再把内存变量值插入到“学生成绩表”中。
学号 ="22111" 姓名 ="黄红 "英语 =95电子线路 =85INSERT INTO "d:\new book\学生成绩表 " FROM MEM
VAR BROWSE
23
10-3-2 10-3-2 更新记录更新记录10-3-2 10-3-2 更新记录更新记录命令格式 :UPDATE [ 〈数据库 ! 〉 ] 〈表名〉SET 〈字段名 1 〉 = 〈表达式〉 [ ,〈字段名 2 〉 = 〈表达
式〉… ][WHERE 〈条件〉 ]功能 : 更新指定表文件中满足WHERE条件子句的记录数据。
其中 SET子句用于指定字段和修改的值,如果省略WHERE子句,则表示表中所有的记录。
24
【例 10.12 】将“学生成绩表”表中,学号是“ 22111” 的
记录,其高等数学成绩改为 70 ,大学物理改为 90 ,英语成
绩再加上 1分。
UPDATE "d:\new book\学生成绩表 " SET 高等数学 =70,;
大学物理 =90, 英语 =英语 +1 WHERE 学号 ="22111" BROWSE
25
10-3-3 10-3-3 删除记录删除记录10-3-3 10-3-3 删除记录删除记录命令格式 :DELETE FROM [ 数据库名 !] 〈表名〉 [WHERE
〈条件 1 〉 [AND | OR 〈条件 2 〉 ...]]功能 : 从指定的表中逻辑删除满足WHERE子句条件
的所有记录。如果要物理删除还需执行 PACK命令,逻辑删除的记录才真正地从物理上删除。可以用 RECALL 命令取消逻辑删除。如果没有WHERE 字句则删除表中的全部记录。说明 : 这里的删除是逻辑删除,即在删除的记录前加上一个逻辑标记
26
【例 10.13 】逻辑删除“学生成绩表”表中,学号是“ 22111” 的记录。
DELETE FROM "d:\new book\学生成绩表 " WHERE 学号 ="22111"
BROWSE
27
10-4 10-4 数据查询数据查询10-4 10-4 数据查询数据查询10-4-1 简单查询 23510-4-2连接查询 23610-4-3带特殊运算符的条件查询 23810-4-4排序查询 24010-4-5分组与计算查询 24110-4-6别名与多表查询 24210-4-7 嵌套查询 24210-4-8查询结果处理 243
28
10-4-1 10-4-1 简单查询简单查询10-4-1 10-4-1 简单查询简单查询1. 无条件查询命令格式 :SELECT [ALL|DISTINCT] < 选项 1> AS < 显示列名 1
> , ... < 选项 n> AS < 显示列名 n>FROM 表名说明 :① < 选项 n> 可以是字段名、常量、表达式、函数,如
AVG (求均值)、 SUM (求和)、 COUNT ( * )等指定查询的内容。
② 如果要查询所有字段,可以使用通配符“ *” 。
29
【例 10.14】查询“学生情况表”表中,所有学生的记录信息。
SELECT * FROM "d:\new book\ 学生情况表 "
30
2. 条件查询命令格式 :SELECT [ALL|DISTINCT] < 选项 1> AS < 显示列名 1
> , ... < 选项 n> AS < 显示列名 n>FROM < 表名 > WHERE < 条件表达式 >
说明 :条件表达式可以是简单表达式或任意复杂的复合表达式。最常用的是比较运算符,如: =、 <>、!=、==、 >、 >=、 <、 <=,逻辑运算符NOT 、 AND 、OR 。
31
【例 10.15 】查询“学生情况表”表中,所有女学生的学号,姓名,年龄。
SELECT 学号 ,姓名 ,year(date())-year( 出生日期 ) AS "年龄 ";
FROM "d:\new book\学生情况表 " WHERE 性别 = "女 "
32
10-4-2 10-4-2 连接查询连接查询10-4-2 10-4-2 连接查询连接查询1. 内部连接子句命令格式:FROM 〈表名 1 〉 INNER JOIN 〈表名 2 〉 ON 〈连接条
件〉【例 10.16 】从“学生情况表”和“学生成绩表”中查询出所
有学生的学号、姓名、性别、高等数学和英语成绩。 SELECT 学生情况表 .学号 ,学生情况表 .姓名 , 性别 , 高等数学 , 英
语 ;FROM 学生情况表 INNER JOIN 学生成绩表 ON 学生情况表 .学号
= 学生成绩表 .学号
33
2. 外连接( 1 )左连接子句命令格式:FROM 〈表名 1 〉 LEFT JOIN 〈表名 2 〉 ON 〈连
接条件〉说明:查询结果中返回 < 表名 1> 中所有的记录,如
果 < 表名 2> 中某条记录满足 < 连接条件 > , 则返回相应值,否则返回空值 NULL 。
34
【例 10.17 】用左连接的方式查询出“学生情况表”所有记录的学号、姓名、性别以及对应高等数学、大学物理和英语成绩。
SELECT 学生情况表 .学号 ,学生情况表 .姓名 , 性别 , 高等数学 ,;
大学物理 , 英语 FROM 学生情况表 LEFT JOIN 学生成绩表 ;ON 学生情况表 .学号 = 学生成绩表 .学号
35
( 2 )右连接子句命令格式:FROM 〈表名 1 〉 RIGHT JOIN 〈表名 2 〉
ON 〈连接条件〉说明:与左连接相反,查询结果中返回 <表名
2> 中所有的记录,如果 <表名 1> 中某条记录满足 <连接条件 >,则返回相应值,否则返回空值NULL 。
36
【例 10.18 】用右连接的方式做 10.17题。SELECT 学生情况表 .学号 ,学生情况表 .姓名 , 性别 ,
高等数学 , 大学物理 , 英语 FROM 学生情况表 RIGHT JOIN 学生成绩表 ON 学生情况表 .学号 = 学生成绩表 .学号
37
( 3 )完全连接子句命令格式:FROM 〈表名 1 〉 FULL JOIN 〈表名 2 〉 ON 〈连
接条件〉说明:完全连接是左连接和右连接的综合,先
进行右连接,然后再进行左连接。不满足连接条件则为空值NULL 。查询结果包含两个表中的所有纪录。
38
【例 10.19 】用完全连接的方式做 10.17题。SELECT 学生情况表 .学号 ,学生情况表 .姓名 , 性别 ,
高等数学 , 大学物理 , 英语 ; FROM 学生情况表 FULL JOIN 学生成绩表 ON 学生情况表 .学号 = 学生成绩表 .学号
39
10-4-3 10-4-3 带特殊运算符的条件查询带特殊运算符的条件查询10-4-3 10-4-3 带特殊运算符的条件查询带特殊运算符的条件查询1. IN 运算符查找出 IN所指定的值的记录。【例 10.20 】查询“学生情况表”中男生的所有信息。SELECT * FROM 学生情况表 WHERE 性别 IN ("男 ")
40
2 . Like 运算符 将 LIKE指定的字符串样式的记录查找出来。注意:通配符“%”表示 0至多个字符,“—”表示
一个字符。【例 10.21 】查询“学生情况表”中姓“王”的学生
的记录信息。SELECT * FROM 学生情况表 WHERE 姓名 LIKE
"王%"
41
3 . BETWEEN…AND 运算符 查询数值在指定的范围之内的记录。也叫区间运算符。【例 10.22 】从“学生成绩表”和“学生情况表”中查找出
高等数学在 70 到 85 之间的男同学的学号、姓名、性别和高等数学信息。
SELECT DISTINCT 学生成绩表 .学号 ,学生成绩表 .姓名 ,;性别 , 高等数学 FROM 学生成绩表 ,学生情况表 ;WHERE 高等数学 BETWEEN 70 AND 85 AND 性别 ="男 "
42
4 . IS NULL 运算符 该运算符主要是测试字段是否为空值。【例 10.23 】查询“学生情况表”中的所有字段是否
为空值。SELECT 学号 , 性别 FROM 学生情况表 WHERE 性别 IS NU
LL
43
10-4-4 10-4-4 排序查询排序查询10-4-4 10-4-4 排序查询排序查询子句命令格式:ORDER BY < 排序列名 1> [ASC | DESC] [,<
排序列名 2> [ASC | DESC]说明:当有多个 < 排序列名 > 时,它们之间应该用逗号隔开,先按第一个排序,对第一个排序相同的记录根据第二个列名进行排序,以此类推。
44
【例 10.24 】:按照高等数学降序,大学物理降序列出所有学生的成绩信息。
SELECT * FROM 学生成绩表 ORDER BY 高等数学 DESC, 大学物理 DESC
45
10-4-5 10-4-5 分组与计算查询分组与计算查询10-4-5 10-4-5 分组与计算查询分组与计算查询1. 分组查询子句命令格式:GROUP BY < 分组列名 1> [ , < 分组列名 2>,….]
[HAVING < 筛选条件 >] 说明:根据指定的字段进行分组查询,将具有相同数值的记录合并成一条。 HAVING设置过滤条件,且必须与 GROUP BY 一起使用,指定结果中的组必须满足的条件。 HAVING子句与WHERE子句用法相同。
46
【例 10.25 】先查询“学生选课表”表中所有信息,然后再按课程号分组,最后查找课程号为 102 的学生的记录,并且按成绩降序排列。
SELECT * FROM 学生选课表SELECT 课程号 , COUNT(课程号 ) FROM 学生选课
表 ; GROUP BY 课程号SELECT * FROM 学生选课表 WHERE 课程号 =102;
ORDER BY 成绩 DESC
47
2. 计算查询【例 10.26 】从“学生选课表”中查找选修课程 2门以及 2门以上的学生的学号,累计学分,求平均成绩。
SELECT 学号 ,SUM(学分 ) AS 累计学分 ,AVG( 成绩 ); AS 平均成绩 FROM 学生选课表 GROUP BY 学号 ; HAVING COUNT(课程号 )>=2
48
10-4-6 10-4-6 别名与多表查询别名与多表查询10-4-6 10-4-6 别名与多表查询别名与多表查询子句命令格式:FROM < 表名 1> < 别名 1> [ , < 表名 2> < 别名 2>,
…]说明:给表定义别名以后就不需要用 表名 . 字
段名 来引用,而只需用别名 . 字段名来引用,比较简便。
49
【例 10.27 】定义“学生情况表”的别名为 ST ,定义“学生成绩表”的别名为 CJ,查询出每个学生的学号,姓名,性别,英语,电子线路成绩。
SELECT ST.学号 ,ST.姓名 , 性别 ,CJ. 英语 ,CJ.电子线路 ;
FROM 学生情况表 ST, 学生成绩表 CJ; WHERE ST.学号 =CJ.学号
50
10-4-7 10-4-7 嵌套查询嵌套查询10-4-7 10-4-7 嵌套查询嵌套查询 嵌套查询就是在一个查询中有多个 SELECT 语句,用一个SELECT 语句查询结果作为另外一个 SELECT 语句的筛选条件。【例 10.28 】利用“学生情况表”和“学生成绩表”查询所
有高等数学 >=80 的女生的姓名,高等数学,英语,电子线路成绩。
SELECT ST.姓名 ,ST. 性别 ,CJ. 高等数学 ,CJ. 英语 ,CJ.电子线路 ;
FROM 学生情况表 ST, 学生成绩表 CJ ;WHERE ST.学号 IN (SELECT 学号 FROM 学生成绩表 ;WHERE 高等数学 >=80) AND ST.学号 =CJ.学号 AND 性别="女 "
51
10-4-8 10-4-8 查询结果处理查询结果处理10-4-8 10-4-8 查询结果处理查询结果处理子句命令格式:INTO < 目标 >|TO FILE < 文件名 >[ADDITIVE]|TO PRINTER
[PROMPT]|TO SCREEN【例 10.29 】先定义一个名为 CXJG(20) 的数组,把示例 10.2
7 的查询结果存入其中。DIMENSION CXJG(20) SELECT ST.姓名 ,ST. 性别 ,CJ. 高等数学 ,CJ. 英语 ,CJ.电子线路 ;
FROM 学生情况表 ST, 学生成绩表 CJ;WHERE ST.学号 IN (SELECT 学号 FROM 学生成绩表 ;WHERE 高等数学 >=80);AND ST.学号 =CJ.学号 AND 性别 ="女 " ;INTO ARRAY CXJG
52
【例 10.30 】把示例 10.28的查询结果存入名为 ABC.TXT 文件中。
SELECT ST.姓名 ,ST. 性别 ,CJ. 高等数学 ,CJ. 英语 ,CJ.电子线路 ;
FROM 学生情况表 ST, 学生成绩表 CJ ;WHERE ST.学号 IN (SELECT 学号 FROM 学生成绩表 ;WHERE 高等数学 >=80) AND ST.学号 =CJ.学号 AND 性别="女 ";
TO FILE ABC.TXT