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