第5章关系数据库标准语言SQL
5.1 SQL概述 5.2 查询功能
5.3 操作功能 5.4 定义功能
5.1 SQL语言的主要特点
SQL是Structured Query Language的缩写,即结构化查询语言。它是关系数据库的标准语言。查询是SQL语言的重要组成部分,除查询外,SQL还包含数据定义、数据操作和数据控制功能等内容。SQL已经成为关系数据库的标准数据语言,所以现在所有的关系数据库管理系统都支持SQL。 表5.1 SQL命令动词
—————————————————————— SQL功能 命令动词
—————————————————————— 数据查询 select
数据定义 create、drop、alter 数据操作 insert、updata、delete 数据控制 grant、revoke
—————————————————————— 5.2 查询功能
SQL的核心是查询。SQL的查询命令也称作select命令,它的基本形式由select-from-where查询模块组成,多个查询可以嵌套执行。
VFP的SQL select 命令的语法格式如下: select 字段1 [AS 字段别名] [,??] from 表名1 [表别名] [,?..] [where <条件表达式>]
[group by ?][having<条件表达式>] [union ?] [order by ?]
select:说明要查询的数据 ,一般为一个表或多个表的字段。
from:说明要查询的数据来自哪个或哪些表,可以对单个表或多个表进行查询; where:说明查询条件,即选择元组的条件;
group by:短语用于对查询结果进行分组,可以利用它进行分组汇总;
having:短语必须跟随group by 短语使用,它用来限定分组必须满足的条件; order by: 用来对查询的结果进行排序。 订货管理系统数据库
5.2.1 简单查询
简单查询只含有基本子句和简单的查询条件,一般基于单个表。 【5.1】在职工表中,查询所有工资值。 select 工资 from 职工
查询出的工资可能有重复值,若要去除重复值,可使用distinct短语,如: select distinct 工资 from 职工 【5.2】查询仓库关系中的所有元组 select * from 仓库
注: “*”是通配符,表示所有属性,即字段,此命令等同于下列语句: select 仓库号,城市,面积 from 仓库 【5.3】查询工资多于1230元的职工号 select 职工号 from 职工 ; where 工资>1230
注:Where短语后指定的条件可以是任意复杂的逻辑表达式 【5.4】查询哪些仓库有工资多于1210元的职工 select distinct 仓库号 from ; 职工 where 工资>1210
此题中显然只对唯一仓库号感兴趣,然而职工与仓库是一对多的关系,即多个工资高于1210的职工可能同在一个仓库,因此可能出现重复值。
例5.5 给出仓库”WH1”或”WH2”工作,并且工资少于1250元的职工
select 职工号 from 职工 ; where 工资<1250 and;
(仓库号=“WH1” OR仓库号=”WH2”)
总结:
1、简单查询中基于一个表,系统先根据指定的where条件依次检验表中的每个记录(关系的选择运算),之后再从查询出的结果(新表)中显示select子句中指定字段)的值(关系的投影运算)。 2、若查询中无where子句,则从所有的记录中显示select子句中指定字段的值。 3、查询时一般遵循以下原则: (1)明确要查询的信息;
(2)明确查询信息来源于哪个或哪些表; (3)把复杂的查询条件分解,使之简单化;
(4)写出查询语句,先写出select查询信息,再写from查询信息所来源的表,最后再写出条件;
5.2.2 简单的联接查询
联接是关系的基本操作之一,联接查询是一种基于多个关系的查询。 【5.6】找出工资多于1230元的职工号和他们所在的城市。 select 职工号,城市 from 职工,仓库;
where 工资>1230 and (职工.仓库号=仓库.仓库号) 分析:
(1)所要求的查询信息职工号、城市分别出自职工表和仓库表,据联接查询定义,必然采用联接查询。 (2)联接的条件是职工.职工号=仓库.仓库号,其联接条件往往是两个表的公共字段。
(3)当FROM之后的关系中含有相同的属性名时,必须用关系前缀直接指明属性所属的关系,如职工.职工号, “ . “前是关系名,之后是属性名。
(4)查询的过程:先将两个表进行等值联接运算形成临时表1,之后再从产生的临时表1中找出满足条件的所有元组形成临时表2,之后再从临时表2中输出显示select子句中指定字段的值。
(5)联接运算相当于把两个表合并为一个表(如临时表1)之后再对合并之后的表进行查询。
【5.7】找出工作面积大于400的仓库的职工号以及这些职工工作所在的城市。 select 职工号,城市 from 职工,仓库;
where 面积>400 and (职工.职工号=仓库.仓库号) 分析:
(1)先分析查询信息基于一个表还是多个表,以决定采用简单查询,还是联接查询.
(2)涉及联接查询时,先进行联接运算,之后再找从联接查询结果中找出满足条件的所有记录形成新的关系,最后显示出select子句中指定属性的值
总结:
1、此类查询是基于多个关系的查询,所以首先要由所查询信息区分采用简单查询还是联接查询. 2、查询时一般遵循以下原则:
(1)明确要查询的信息是单个字段,还是多个字段
(2)明确查询信息来源于哪个或哪些表,若来自多个表,则需要采用联接查询; (3)把复杂的查询条件分解,使之简单化;
(4)写出查询语句,先写出select查询信息,再写from查询信息所来源的表,最后再写出条件;
(5)查询过程:先把满足联接条件的记录找出形成临时表,之后再从临时表中找出满足条件的记录形成新
的关系。
(6)联接条件往往是两个关系的公共字段。
5.2.3 嵌套查询
嵌套查询是基于多个关系的查询,此类查询所要求的信息出自一个关系,但相关条件却涉及多个关系。这时就需要使用SQL的嵌套查询功能。
【5.8】哪些城市至少有一个仓库的职工工资为1250元. select 城市 from 仓库 where ; 仓库号 IN (select from 职工; where 工资=1250) 分析:
(1)此查询由两个select-from-where查询语句组成,即内层查询块和外层查询块,内层查询块查询结果是仓库号值是WH1和WH2,上面命令等价于:
select 城市 from 仓库 where仓库号in(“WH1”,”WH2”)
(2)IN相当于集合运算,只要IN中包含的值在新关系中都得到反映。
(3)此题查询信息基于一个表(仓库表),但查询条件却涉及另一个表(职工表),因此必须采用嵌套查询 (4)嵌套查询过程:先查询出满足内查询块条件的结果,再将此结果作为外层查询块的查询条件,查询出满足条件的所有记录组成新的表.
【5.9】查询所有职工的工资都多于1210元的仓库信息。 select * from 仓库 where 仓库号 not in; (select 仓库号from职工 where工资<=1210) 分析:
1、内层查询块查询结果是职工工资少于或等于1210元的仓库号的集合,在这里结果为“WH1”;之后从仓库关系中查询仓库号不在该集合中的每个元组。
2、刚才查询出了错误,尽管在“武汉”的“WH4”仓库没有职工,但该仓库信息也被查询出来。这主要由于对职工及仓库的仓库号没有进行检验一致性所导致的,只再加入检验条件,哪么结果将是正确的。 3、改正后查询条件:查询所有职工的工资都多于1210元的仓库的信息,且该仓库至少要有一名职工。 select * from 仓库 where 仓库号 not in;
(select 仓库号 from 职工 where 工资<=1210); and 仓库号 in(select 仓库号 from 职工)
4、内层的两个查询是并列的,在结果中将不包含没有职工的仓库信息。
【5.10】查询出和职工E4挣同样工资的所有职工。 select 职工号 from 职工 where ; 工资=(select 工资 from; 职工 where 职工号=\分析:
(1)内层查询块的结果是外层查询块的条件。
(2)此题的条件仅涉及一个表(职工),查询信息也只涉及一个表(职工)。
总结:
1、此类查询是基于多个关系的查询,所以首先要由所查询信息区分采用简单查询、联接查询还是嵌套查询.
2、查询时一般遵循以下原则:
(1)明确要查询的信息是单个字段,还是多个字段,;
(2)明确查询信息来源于哪个或哪些表,若来自多个表,则需要采用联接查询;
(3)分析查询条件是基于本表,还是基于其它表,若基于其它表则需要采用嵌套查询。 (4)把复杂的查询条件分解,使之简单化;
(5)写出查询语句,先写出select查询信息,再写from查询信息所来源的表,最后再写出条件;
(6)查询过程:先查询出内层查询块的结果,之后再把刚才查询结果作为外查询块的条件进行查询,最终找出满足条件的所有记录形成新的关系。
(7)查询过程:查询时先内层查询,后外层查询. (8)涉及多表查询时,应注意保证结果的一致性.
5.2.4 几个特殊运算符
在SQL语句中,WHERE子句后面的联接条件,除了可以使用VFP语言中的关系表达式以及逻辑表达外,还可以使用几个特殊运算符:
(1)[not]in:表示[不]在?之中。
(2)[not]between?and?:表示[不]在?之间。 (3)[not]like:表示[不]与?匹配。 说明:
(1)NOT运算符用来设计否定条件。
(2)LIKE运算符提供两种字符串匹配方式,一种是使用下划线符号“_”,匹配一个和任意字符,另一种是使用百分号“%”,匹配0个或多个任意字符。
(3)IN运算符,格式为IN(常量1,常量2,?)。含义为查找和常量相等的值。 1、[not]between?and?:表示[不]在?之间。
【5.11】查询出工资在1220元到1240元范围内的职工信息。 select * from 职工where工资between 1220 and 1240 分析:
(1) between?and?意思是在“?和?之间”,此查询的条件等价于: (工资>=1220) and (工资<=1240)
(2)假若要找出工资不在1220元和1240元之间的全部职工信息,可以用命令: select * from 职工 where工资 not between 1220 and 1240 2、[not]like表示[不]与?匹配 like运算符是字符串匹配运算符。 通配符”%”通配任意的多个字符。 通配符“_” 通配任意的一个字符。 eg1:
select *;
from 学生表;
into table zyj;
where 姓名 like “王%” eg2:
select *;
from 学生表;
into table zyj;
where 姓名 like “_小_%” 5.2.5 排序