第 14章 关系数据库标准语言 SQL
第 14章 关系数据库标准语言 SQL
14.1 SQL的查询功能
14.2 SQL的定义功能
14.3 SQL的数据修改功能第 14章 关系数据库标准语言 SQL
14.1 SQL的查询功能查询是 SQL的核心 。 SQL的查询命令也称作 SELECT
命令,语法格式为:
SELECT [ALL | DISTINCT]
[Alias.] Select_Item [AS Column_Name]
[,[Alias.] Select_Item [AS Column_Name],..]
FROM [DatabaseName!]Table [[AS] Local_Alias]
[[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL
[OUTER]
JOIN DatabaseName!] Table [[AS] Local_Alias][ON
JoinCondition ]]
第 14章 关系数据库标准语言 SQL
[[INTO Destination]
| [TO FILE FileName [ADDITIVE] | TO PRINTER
[PROMPT] | TO SCREEN]]
[PREFERENCE PreferenceName]
[NOCONSOLE]
[PLAIN]
[NOWAIT]
第 14章 关系数据库标准语言 SQL
[WHERE JoinCondition [AND JoinCondition,..][AND |
OR FilterCondition...]]
[GROUP BY GroupColumn [,GroupColumn,..]]
[HAVING FilterCondition]
[UNION [ALL] SELECTCommand]
[ORDER BY Order_Item [ASC | DESC] [,Order_Item
[ASC | DESC],..]]
第 14章 关系数据库标准语言 SQL
假设已经建立了“订货管理数据库”及其 4个数据表,即“职工表”、“仓库表”、“订购单表”和“供应商表”,具体内容见表 14-1,14-2,14-3。
表 14-1 职工表职工号 仓库号 工资额
B1 A02 800
B3 A01 1000
B4 A02 1100
B6 A03 900
B7 A01 1000
第 14章 关系数据库标准语言 SQL
表 14-2 仓库表仓库号 面积 地点
A01 50 郑州
A02 100 北京
A03 70 长沙
A04 80 广州第 14章 关系数据库标准语言 SQL
表 14-3 订购单表职工号 供应商号 订购单号 订购日期
B3 C7 D1 2002/02/10
B1 C4 D4 2002/03/18
B7 C4 D3 2001/01/10
B6 Null D6 Null
B3 C4 D7 2001/12/13
B1 Null D9 Null
B3 Null D10 Null
B3 C3 D11 2001/10/30
第 14章 关系数据库标准语言 SQL
表 14-4 供应商表供应商号 供应商名 地址
C3 黄河机械厂 郑州
C4 长江通用设备公司 南昌
C6 迎宾厂 广州
C7 双飞公司 上海第 14章 关系数据库标准语言 SQL
14.1.1 简单查询简单查询是基于单个表,或者有简单的查询条件的查询 。 这样的查询由 SELECT和 FROM短语构成无条件查询,或者由 SELECT,FROM和 WHERE短语构成条件查询 。
【 例 14-1】 从职工表中检索所有职工的工资额 。
用 SQL语言描述为:
SELECT 工资额 FROM 职工表第 14章 关系数据库标准语言 SQL
【 例 14-2】 检索仓库表中的所有元组 。
可以使用通配符 *表示所有属性 ( 即字段 ),
SELECT * FROM 仓库表该命令等价于:
SELECT 仓库号,面积,地点 FROM 仓库表第 14章 关系数据库标准语言 SQL
【 例 14-3】 检索工资额多于 1000元的职工号 。
用 WHERE短语指定查询条件 ( 查询条件可以是任意复杂的逻辑表达式 ),
SELECT 职工号 FROM 职工表 WHERE 工资额
> 1000
【 例 14-4】 检索在仓库 A01或 A02工作,且工资额少于 1000元的职工号 。
SELECT 职工号 FROM 职工表 ;
WHERE 工资额 < 1000 AND (仓库号 ="A01" OR 仓库号 ="A02")
第 14章 关系数据库标准语言 SQL
14.1.2 联接查询
【 例 14-5】 检索工资额大于 1000元的职工号和他们所在的地点 。
SELECT 职工号,地点 FROM 职工表,仓库表 ;
WHERE ( 工资额 > 1000) AND ( 职工表,仓库号 =
仓库表,仓库号 )
【 例 14-6】 查询工作在仓库面积大于 90的职工号以及这些职工工作地点 。
SELECT 职工号,地点 FROM 职工表,仓库表 ;
WHERE ( 面积 > 70) AND ( 职工表,仓库号 = 仓库表,仓库号 )
第 14章 关系数据库标准语言 SQL
14.1.3 嵌套查询
【 例 14-7】 查询至少有一个仓库的职工工资额为
1000元的地点 。
SELECT 地点 FROM 仓库表 WHERE 仓库号 IN ;
( SELECT 仓库号 FROM 职工表 WHERE 工资额
= 1000 )
【 例 14-8】 查询所有职工的工资额都多于 800元的仓库信息 。
SELECT * FROM 仓库表 WHERE 仓库号 NOT
IN ;
( SELECT 仓库号 FROM 职工表 WHERE 工资额
<= 800 )
第 14章 关系数据库标准语言 SQL
14.1.4 几个特殊的运算符
【 例 14-9】 查询工资额在 900元到 1050元范围内的职工信息 。
SELECT * FROM 职工表 WHERE 工资额
BETWEEN 900 AND 1050
【 例 14-10】 从供应商关系中检查全部公司的信息
( 不要工厂或其他供应商的信息 ) 。
SELECT * FROM 供应商表 WHERE 供应商名
LIKE "*公司 "
第 14章 关系数据库标准语言 SQL
【 例 14-11】 查询不在郑州的全部供应商信息。
SELECT * FROM 供应商表 WHERE 地址 != "郑州 "
也可以用 NOT运算符写出等价的 SQL命令:
SELECT * FROM 供应商表 WHERE NOT ( 地址 = "郑州 " )
第 14章 关系数据库标准语言 SQL
14.1.5 排序使用 SQL中的 SELECT还可以将查询结果进行排序,排序的短语是 ORDER BY。 格式为:
ORDER BY Order_Item [ASC | DESC] [,
Order_Item [ASC | DESC],..]
其中 ASC表示升序,DESC表示降序。缺省时为升序。
第 14章 关系数据库标准语言 SQL
【 例 14-12】 按职工的工资额升序检索出全部职工信息 。
SELECT * FROM 职工表 ORDER BY 工资额如果需要按降序排序,只要加上 DESC选项:
SELECT * FROM 职工表 ORDER BY 工资额 DESC
【 例 14-13】 先按仓库号排序,再按工资额升序排序并输出全部职工信息 。
SELECT * FROM 职工表 ORDER BY 仓库号,
工资额第 14章 关系数据库标准语言 SQL
14.1.6 简单的计算查询
【 例 14-14】 找出供应商所在地的数目 。
SELECT COUNT( DISTINCT 地址 ) FROM 供应商表
【 例 14-15】 求支付的工资总数 。
SELECT SUM ( 工资额 ) FROM 职工表第 14章 关系数据库标准语言 SQL
【 例 14-16】 求所有职工的工资都多于 900元的仓库的平均面积 。
SELECT AVG ( 面积 ) FROM 仓库表 WHERE
仓库号 NOT IN ;
( SELECT 仓库号 FROM 职工表 WHERE 工资额 <= 900 )
AND 仓库号 IN ( SELECT 仓库号 FROM 职工表 )
【 例 14-17】 求职工的最高工资 。
SELECT MAX ( 工资额 ) FROM 职工表第 14章 关系数据库标准语言 SQL
14.1.7 分组与计算查询
GROUP BY子句的格式为:
GROUP BY GroupColumn [,GroupColumn,..]
[HAVING FilterCondition]
【 例 14-18】 求每个仓库的职工的平均工资 。
SELECT 仓库号,AVG ( 工资额 ) FROM 职工表
GROUP BY 仓库号
【 例 14-19】 求至少有两个职工的每个仓库的平均工资 。
SELECT 仓库号,COUNT ( * ),avg ( 工资额 )
FROM 职工表 ;
GROUP BY 仓库号 HAVING COUNT ( * ) >=2
第 14章 关系数据库标准语言 SQL
14.1.8 集合的并运算
SQL支持集合的并 ( UNION) 运算,即可以将两个
SELECT语句的查询结果通过并运算合并成一个查询结果 。
为了进行并运算,要求这样的两个查询结果具有相同的字段个数,并且对应字段的值要出自同一个值域,即具有相同的数据类型和取值范围 。
例如,下面语句的结果是地点为郑州和长沙的仓库信息 。
SELECT * FROM 仓库表 WHERE 地点 = "郑州 " ;
UNION ;
SELECT * FROM 仓库表 WHERE 地点 = "长沙 "
第 14章 关系数据库标准语言 SQL
14.2 SQL的定义功能
14.2.1 表的定义在 Visual FoxPro 中 也 可 以 通 过 SQL 的 CREATE
TABLE命令建立表,其语法格式为:
CREATE TABLE | DBF TableName1 [NAME
LongTableName] [FREE]
(FileName1 FieldType [(nFieldWidth [,
nPrecision])][NULL | NOT NULL]
[CHECK lExpression1 [ERROR cMessageText1]]
第 14章 关系数据库标准语言 SQL
[DEFAULT eExpression1]
[PRIMARY KEY | UNIQUE]
[REFERENCES TableName2 [TAG TagName1]]
[NOCPTRANS]
[,FieldName2 … ]
[,PRIMARY KEY eExpression2 TAG TagName2
|,UNIQUE eExpression3 TAG TagName3 ]
[,FOREIGN KEY eExpression4 TAG TagName4
[NODUP]
REFERENCES TableName3 [TAG TagName5]]
[,CHECK lExpression2 [ERROR cMessageText2]])
| FROM ARRAY ArrayName
第 14章 关系数据库标准语言 SQL
【 例 14-20】 用 SQL命令建立订货管理 1数据库 。
用 SQL建立订货管理 1数据库的命令为:
CREATE DATABASE 订货管理 1
用 SQL建立仓库 1表:
CREATE TABLE 仓库 1(
仓库号 C(5) PRIMARY KEY,
城市 C(10) ;
面积 I CHECK(面积 > 0) ERROR "面积应该大于
0! " )
第 14章 关系数据库标准语言 SQL
【 例 14-21】 用 SQL命令建立职工 1表 。
用 SQL建立职工 1表的命令为:
CREATE TABLE 职工 1(
仓库号 C(3),
职工号 C(2) PRIMARY KEY,
工资额 I CHECK ( 工资额 >=500 AND 工资额
<=2000 )
ERROR "工资应为 500~2000! " DEFAULT 1000,
FOREIGN KEY 仓库号 TAG 仓库号
REFERENCES 仓库 1 )
第 14章 关系数据库标准语言 SQL
【 例 14-22】 用 SQL建立供应商 1表 。
用 SQL建立供应商 1表的命令为:
CREATE TABLE 供应商 1(
供应商号 C(2) PRIMARY KEY,
供应商名 C(20),
地址 C(10) )
第 14章 关系数据库标准语言 SQL
【 例 14-23】 用 SQL建立订购单 1表 。
用 SQL建立订购单 1表的命令为:
CREATE TABLE 订购单 1(
职工号 C(2),
供应商号 C(2),
订购单号 C(5) PRIMARY KEY,
订购日期 D,
FOREIGN KEY 职工号 TAG 职工号 REFERENCES
职工 1,
FOREIGN KEY 供应商号 TAG 供应商号
REFERENCES 供应商 1 )
第 14章 关系数据库标准语言 SQL
14.2.2 表的删除
SQL语言中删除表的命令为:
DROP TABLE table_name
第 14章 关系数据库标准语言 SQL
14.2.3 表结构的修改
1,第一种格式修改表结构命令 ALTER TABLE的第一种格式为:
ALTER TABLE TableName1 ADD | ALTER
[COLUMN FieldName1
FieldType [(nFieldWidth [,nPrecision])] [NULL | NOT
NULL]
[CHECK lExpression1 [ERRPR
cMessageText1]][DEFAULT eExpression1]
[PRIMARY KEY | UNIQUE]
[REFERENCES TableName2 [TAG TagName1]]
第 14章 关系数据库标准语言 SQL
【 例 14-24】 为订购单 1表增加一个货币类型的总金额字段 。
ALTER TABLE 订购单 1 ;
ADD 总金额 Y CHECK 总金额 >0 ERROR "总金额应该大于 0! "
【 例 14-25】 将订购单 1的订购单号字段的宽度由原来的 5改为 6。
ALTER TABLE 订购单 1 ALTER 订购单号 C(6)
第 14章 关系数据库标准语言 SQL
2,第二种格式修改表结构命令 ALTER TABLE的第二种格式为:
ALTER TABLE TableName1 ALTER [COLUMN]
FieldName2
[ NULL | NOT NULL ]
[ SET DEFAULT eExpression2 ]
[ SET CHECK lExpression2 [ERROR cMessageText2]]
[ DROP DEFAULT ] [ DROP CHECK ]
第 14章 关系数据库标准语言 SQL
该格式主要用于定义,修改和删除有效性规则和默认值定义 。
【 例 14-26】 修改或定义总金额字段的有效性规则 。
ALTER TABLE 订购单 1
ALTER 总金额 SET CHECK 总金额 > 100
ERROR "总金额应该大于 100! "
【 例 14-27】 删除总金额字段的有效性规则 。
ALTER TABLE 订购单 1 ALTER 总金额 DROP
CHECK
第 14章 关系数据库标准语言 SQL
3,第三种格式修改表结构命令 ALTER TABLE的第三种格式为:
ALTER TABLE TableName1 [DROP [COLUMN]
FieldName3]
[ SET CHECK lExpression3 [ERROR
cMessageText3 ]]
[ DROP CHECK ]
[ ADD PRIMARY KEY eExpression3 TAG TagName2
[FOR lExpression4]]
[ DROP PRIMARY KEY ]
第 14章 关系数据库标准语言 SQL
[ ADD UNIQUE eExpression4 [ TAG TagName3
[FOR lExpression5 ]]]
[ DROP UNIQUE TAG TagName4]
[ADD FOREIGN KEY [eExpression5 [TAG
TagName4 [FOR lExpression6]
REFERENCES TableName2 [TAG TagName5]]
[ DROP FOREIGN KEY TAG TagName6 [SAVE]]
[RENAME COLUMN FieldName4 TO FieldName5]
第 14章 关系数据库标准语言 SQL
【 例 14-28】 将订购单 1表的总金额字段名改为金额 。
ALTER TABLE订购单 1 RENAME COLUMN总金额
TO金额
【 例 14-29】 删除订购单 1表的金额字段 。
ALTER TABLE订购单 1 DROP COLUMN金额第 14章 关系数据库标准语言 SQL
【 例 14-30】 将订购单 1表的职工号和供应商号定义为候选索引(候选关键字),索引名是 dap1。
ALTER TABLE 订购单 1 ADD UNIQUE 职工号
+ 供应商号 TAG dap1
【 例 14-31】 删除订购单 1表的候选索引 dap1。
ALTER TABLE 订购单 1 DROP UNIQUE TAG
dap1
第 14章 关系数据库标准语言 SQL
14.2.4 视图的定义视图是根据对表的查询定义的,语法格式为:
CREATE VIEW view_name [( column_name[,
column_name] … )]
AS select_statement
第 14章 关系数据库标准语言 SQL
1,从单个表派生出的视图例如,某个用户对职工关系只需要或者只能知道职工号和所工作的仓库号,那么可以定义视图:
CREATE VIEW e_w AS ;
SELECT 职工号,仓库号 FROM 职工表查询职工号和仓库号信息,可以用命令:
SELECT * FROM e_w
或 SELECT 职工号,仓库号 FROM e_w
或 SELECT 职工号,仓库号 FROM 职工表第 14章 关系数据库标准语言 SQL
再如,某个用户对仓库关系只需要或者只能查询郑州仓库的信息,可以定义如下视图:
CREATE VIEW v_bj AS ;
SELECT 仓库号,面积 FROM 仓库表 WHERE
地点 ="郑州 "
第 14章 关系数据库标准语言 SQL
2,从多个表派生出的视图向用户提供职工号,职工的工资和职工工作所在地的信息:
CREATE VIEW v_emp AS ;
SELECT 职工号,工资额,地点 FROM 职工表,
仓库表 ;
WHERE 职工表,仓库号 = 仓库表,仓库号第 14章 关系数据库标准语言 SQL
3,视图的虚字段
【 例 14-32】 定义一个视图,使其包含职工号,月工资和年工资 3个字段 。
CREATE VIEW v_sal AS ;
SELECT 职工号,工资额 AS 月工资,工资额 *12
AS 年工资 FROM 职工表查询 v_sal:
SELECT * FROM v_sal
第 14章 关系数据库标准语言 SQL
4,视图的删除视图由于是从表中派生出来的,所以不存在修改结构的问题,但是视图可以删除 。 删除视图的命令格式是:
DROP VIEW <视图名 >
比如要删除视图 v_emp,只要键入命令:
DROP VIEW v_emp
第 14章 关系数据库标准语言 SQL
14.3 SQL的数据修改功能
14.3.1 插入
Visual FoxPro支持两种 SQL插入命令,一是标准格式,二是 Visual FoxPro的特殊格式 。
标准格式:
INSERT INTO dbf_name[(fname1[,
fname2,… ])]
VALUES (eExpression1[,eExpression2,… ])
特殊格式:
INSERT INTO dbf_name FROM ARRAY
ArrayName | FROM MEMVAR
第 14章 关系数据库标准语言 SQL
【 例 14-33】 向订购单关系中插入元组:( "B8",
"C2","D20",2002/01/15)
可用下面命令:
INSERT INTO 订购单表 VALUES ("B8","C2",
"D20",{2002-01-15})
假设这时供应商尚未确定,那么只能先插入职工号和订购单号两个属性的值,使用命令:
INSERT INTO 订购单表 ( 职工号,订购单号 )
VALUES ("B8","D20" )
这时另外两个属性的值为空。
第 14章 关系数据库标准语言 SQL
14.3.2 更新
SQL的数据更新命令格式如下:
UPDATE TableName
SET Column_Name1=eExpression1[,
Column_Name2=eExpression2 … ]
WHERE Condition
第 14章 关系数据库标准语言 SQL
【 例 14-34】 给 A02仓库的职工提高 12%的工资 。
UPDATE 职工表 SET 工资额 =工资额 *1.12 ;
WHERE 仓库号 ="A02"
【 例 14-35】 给所有学生的年龄增加 1岁 。
UPDATE 学生表 SET 年龄 =年龄 +1
第 14章 关系数据库标准语言 SQL
14.3.3 删除
SQL从表中删除数据的命令为:
DELETE FROM TableName [ WHERE Condition ]