a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 170|回复: 1

[Visual FoxPro] 2011年度计算机等级考试二级VFP基础教程(54)

[复制链接]
发表于 2012-7-31 22:17:54 | 显示全部楼层 |阅读模式
 一。概述:  SQL(Structure Query Language,结构化查询语言)是美国国家标准局ANSI确认的关系数据库语言的标准,用于对关系型数据库中的数据进行存储,查询及更新等操作。正是由于SQL语言的标准化,所以大多数关系型数据库系统都支持SQL语言,它已经发展成为多种平台进行交互操作的底层会话语言。2 n; M; N3 H, v7 X  p+ z
  SQL语言也可应用于VFP中,VFP中的SQL命令采用Rushmore技术来优化系统的性能。一个SQL命令可以用来代替多个VFP命令& v( w5 h5 W  V: ]8 K1 M* h# N$ U9 c
  前面用"查询设计器"和"视图设计器"所做的工作,本质上都是生成一个select-sql命令。单击"查询设计器"中的SQL按钮,即可随时查看VFP在后台建立的SQL命令。
$ L8 N( }6 C  Y1 ~  二。SQL语言的功能:
2 F& |" U* z9 ^- s) w; j. B: Y  SQL语言为用户提供了以下功能:数据定义,数据检索,数据操纵和数据控制。
$ h0 r3 C% x  q9 f) v3 k  SQL语言是一种交互式的计算机操作语言,也是一种数据库编程语言,它不仅能够在单机环境下提供对数据库的各种访问操作,而且还可做为一种分布式数据库语言用于客户机/服务器模式(Client/Server)数据库应用程序的开发。我们这里主要介绍select-sql查询语句。* ], P0 W3 s& {6 ^5 G" b
  三。select-sql查询命令:
5 B! k9 t6 K/ O% _  数据库中的数据查询最终总是通过select-sql命令进行。select-sql命令主要格式为:
; H# x( H! Y2 v/ W* \: ~; {  select [all|distinct]列名[,列名] from 表名[,表名][into array 数组名/cursor 临时表名/dbf表名]$ R2 N: Z- t3 N5 g' ~  }, J
  [where 条件表达式][group by 列名[,列名][having 条件]][order by 表达式[asc/desc]
8 f  d# J% `3 o7 U  说明:
3 m+ D7 r: T5 \2 f3 [9 \  1.select查询语句的格式主要有select子句,from子句,into子句和to子句,where子句,group by 子句和order by子句。$ R& w2 g! j+ ^' h5 `
  2.select 子句指明查询输出的项目(称为列)也可以是表达式。利用表达式可以查询表中未直接存储但可以由表中数据计算出的结果。为了构造表达式,SQL提供了加(+),减(-),乘(*),除(/)四种运算符和一些函数。
. E/ ?8 h% M# t  3.在表达式中,若以*代替列名,则表示查询表的所有列。; d3 S8 I# E# S0 P
  4.from子句指明被查询的表名或视图名% C, }; n! B' g& X! y2 @: y( _1 }
  5.into子句指明查询结果保存在何处,可以是数组,临时表或表
2 u1 ~7 M; H3 @! n0 O! @$ b  6.select和from子句是每个SQL查询语句所必须的,其他子句是任选的。
& j1 E# a. a% m- o2 J  {) G  7.where子句说明查询的条件。满足条件的查询结果可能不止一个,在select子句中有distinct选项,加了这个选项后,则要求消除查询结果中的重复项
% o7 `1 P2 _1 C9 ]) X2 o# m6 r  8.group by子句将表按列值分组,列的值相同的分在一组,having后面的子句是选择组的条件,符合条件的组才能输出。& F1 w& Y6 x! B/ x& K- a$ f% R) W
  9.order by子句可对查询结果按子句中指定的列的值排序,ASC表示长序,DESC表示降序。+ f, u, a' I# R/ j# `) o
  四。select-sql应用举例:
) B% W  B; E6 \+ f/ P  select-sql语句在操作表时,不需要先打开表,即能从表中查询出数据。以下的例子,既可在命令窗口中逐条输入运行,也可以将每个例子中的代码存入一个命令文件中,然后运行该命令文件。
+ I; i/ ~- G. t5 k; H  1.查询"职工档案"表中的全部信息:
" u* [, }! ]) G9 b0 ^  select * from 职工档案 into cursor abc &&将查询结果送入临时表abc中,*表示全部的列
0 P4 J9 ^# v- `( S  select abc
7 K- `0 Y6 _: ~7 R6 C2 m- I  brow' P; b4 Y5 A$ B0 k! D: Y
  2.查询职工的姓名,对重名的职工只显示1次0 {5 j! @* A* P5 `( C2 H: r
  select distinct 姓名 from 职工档案: T. k: u) y( c
  说明:使用distinct可以消除重复的值,这里表示去掉重复的姓名
" @: U, l' b+ @9 F8 b  3.查询职工的编号,姓名和年龄8 \) S* E0 A9 Y/ [, ?6 _
  select 编号,姓名,year(date())-year(出生时间) as 年龄 from 职工档案
* |2 Z- d$ c+ ]0 g  说明:select语句后面是列名。列可以是字段,字段组成的表达式或常数,AS用来指定查询结果中列的标题。此处表达式year(date())-year(出生时间)以"年龄"作为列名显示。) A( r8 x1 U+ C  v4 I5 q" J! ^
  4. 查询工资在800元以上的职工的编号,姓名和工资,并按工资由高到低列出
* y8 x1 }) g" x9 u& d7 Q1 k  select 编号,姓名,工资 from 职工档案 where 工资>800 order by 工资 desc
9 o. Z4 s3 U; l( u0 C( K  说明:# R# _$ E9 `( }) o3 O$ O# H8 k( P
  (1)order by子句中的desc是用来指明显示结果的顺序,即工资由高到低输出。缺省时,以升序(ASC)排序。& g( c( j3 }$ o) A  H
  (2)where子句用来指定筛选记录的条件。有多个条件时,可用AND或OR连接。9 h. c3 ]% u, e- ?! d. m  l
  (3)SQL的查询方式很丰富,它提供了三种谓词,它们分别是between,in和like.下面几个例子说明这三种谓词的使用。
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:17:55 | 显示全部楼层

2011年度计算机等级考试二级VFP基础教程(54)

5.查询工资在1000~1500之间的职工的编号,姓名,职称和工资  select 编号,姓名,职称,工资 from 职工档案 where 工资 between 1000 and 15003 z: L: \2 y5 J
  说明:在查找中,如果要求某列的数值在某个区间内,可用between…and,而如果要查找不在某个区间的数据,可用not between…and
2 F/ w. I" _1 j" ^2 g% q$ Y5 B5 E  Q; j  思考一下:要查询工资不在1000~1500之间的职工的编号,姓名,职称和工资,应该怎样编写SQL语句?  X8 q0 P/ Y; o& @2 w( l7 B* a6 s/ P
  答案:select 编号,姓名,职称,工资 from 职工档案 where 工资 not between 1000 and 1500. W3 G% p) C& L( N7 A9 q
  6.数据包含查询:使用in的查询,查询具有本科和大专文化程度的职工的编号和姓名
$ C+ B) b/ x  p6 B  select 编号,姓名 from 职工档案 where 文化程度 in('本科','大专')( e# ~; d* ]9 G: }& m" }
  说明:如果要查的值是已知的某几个值中的一个,此时可用IN.同样,可以用not in来表示相反的含义。
4 l) z9 A- g  ~0 K  7.数据匹配查询:
1 y$ }1 p$ E) O4 w% [+ v5 i  利用like的查询。查询部门编号为"01"的职工的工资情况7 s- ]5 B* W- t4 y* V- ^7 |
  select * from 职工档案 where 编号 like '01_'(或者like '01%')
2 E& q6 g3 d! z! j7 Y  说明:在查找时,有时需要对字符串比较。like提供两种字符串匹配方式,一种是使用下划线"_"匹配任意一个符,另一种是使用百分号"%"匹配0个或多个字符的字符串。同样可以使用not like来表示相反的含义。
7 y% I3 n# t5 q" @. e: Z* W; L4 W9 m2 p/ }  8.联接查询:3 S+ ^2 ~$ p; {# J6 s
  实际应用于中常常涉及到多表之间的关联查询,SQL语言提供了连接多个表的操作,可在两个或多个表间按指定的列的相同的值将一个表中的行与另一个表中的行连接起来。从而大增强了其查询能力。* i" y5 d8 K9 D" g0 W3 x& _
  为了防止多表中同名字段的二义性,查询语句中的字段名前最好加上表名作为前缀,为了减少输入时的麻烦,还可在from子句中给表起一个别名。$ t7 V, f/ V$ `+ ^
  例:查询职工的编号,姓名,职称与工资  T0 L0 F' F9 b* J3 k: a  r! ~
  select 职工档案。编号,职工档案。职称,工资情况。姓名,工资情况。工资 from 职工档案,工资情况 where
$ b5 C. ^/ w: Y" k6 m$ W; |  职工档案。编号=工资情况。编号. m' Z- j& d1 l) {4 j; s
  9.联合查询:; G3 B8 J* _4 |& j& |8 x2 J
  在SQL语言中可将两个或多个查询结果进行并操作(union),需要注意的是,两个查询结果进行并操作时,它们必须具有相同的列数,并且对应的列有着相同的数据类型和长度(对应的列名可以不同).union运算自动去掉重复记录。! ~. P. L! J( i9 V
  例:查询具有工程师和政工师职称的职工的编号和姓名
+ U. s2 }" g& J! z" s* `0 S% T  SElect 编号,姓名 from 职工档案 where 职称='工程师' union select 编号,姓名 from 职工档案
7 R7 _- e8 ^# r  w2 e( V- F  where 职称='政工师'0 T) E  T4 [0 a
  例:查询具有工程师职称和工资高于1000元的职工的编号) ^  m* j6 m) B5 \8 r
  select 编号 from 职工档案 where 职称='工程师' union select 编号 from 工资情况 where 工资>10005 o) U  B9 E. U
  10.嵌套查询:) f$ e0 V9 m  O! o/ ]
  在一个select命令的where子句中出现另一个select 命令,则称为嵌套查询或称为子查询,必须用花括号括起来。在where子句中最多可以有两个同级(不是嵌套的)子查询。' y! N! `0 b4 p( v% {  V
  例:查询工资高于1000的职工的编号,姓名和职称。
+ J& x4 l. y- ^! F9 l$ A  select 编号,姓名,职称 from 职工档案 where 编号 in(select 编号 from 工资情况 where 工资>1000)3 y: r9 n! K% P5 P' s
  上述SQL语句执行的是两个过程,首先在"工资情况"表中找出工资高于1000的职工的编号,然后再根据此编号在"职工档案"表中查出姓名和职称。
" v7 e1 P( Z& E2 `7 g( T3 a" [  11.库函数:  o% r$ {8 C0 b8 [2 O% k! h, ]# S* e
  select语句不仅可以通过where子句查找满足条件的数据,还可以通过函数对满足条件的数据进行统计,计数等运算。下列五种函数可以在from子句中与选定的列一起使用:$ Z# x# s  }' U
  Min 求(字符,日期,数值)列的最小值
8 R- B. A! w) K2 W3 F! q+ X/ N1 E  Max 求(字符,日期,数值)列的最大值
0 R- z1 A/ N- s" n5 u; X; a" ]' J  Count(*) 计算记录的个数1 s' t# V, _4 A) I$ d6 U& V
  Sum 计算数值列的总和" K0 W) i" b6 \  }( ^: O) _6 |' h
  AVG 计算数值列的平均值; u2 c( \& e: b; ?2 p
  这些函数是从一组值中计算出一个汇总信息,group by 子句用来定义或划分进行统计或求和的组。
; z0 G& J" _6 S* u, Q7 ^, b  例:查询男女职工人数,最高工资,最低工资,工资总额和平均工资
6 r2 ~1 ]& L4 P& d' w  select 性别,count(*),Max(工资),Min(工资),sum(工资),avg(工资) from 职工档案 group by 性别
, e0 U7 y' K  K0 ~7 o# h; ~4 s; \  例:查出有三个人以上具有相同职称的职称名称。, [8 |+ W4 {& |! |0 c& o
  select 职称 from 职工档案 group by 职称 having count(*)>3. m7 I. W, g! g* ^7 j* Z; J5 i+ m
  注意:having子句和where子句的区别。where子句用来指定表中元组所应满足的条件,而having子句用来指定每一分组所应满足的条件,只有满足having子句的条件的那些组才能在结果中被显示。即having用于去掉不符合条件的分组,如同where子句用于去掉不符合条件的若干行一样。( N& y% ]) ^; D* G( [$ R: f
  在此例中,在表中按职称进行分组,然后在每个分组中检测其记录个数是否大于等于3,如果满足条件,则该组的职称才被输出。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-6 19:21 , Processed in 0.240905 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表