SELECT — SQL 的使用心得
SELECT —SQL命令的一般格式:SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]] [Alias.] Select_Item
[[AS] Column_Name] [, [Alias.] Select_Item [[AS] Column_Name] ...]
FROM [FORCE] [DatabaseName!] Table [[AS] Local_Alias]
[ [INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN DatabaseName!] Table [[AS] Local_Alias] [ON JoinCondition ...]
[[INTO Destination] | [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]]
[PREFERENCE PreferenceName] [NOCONSOLE] [PLAIN] [NOWAIT]
[WHERE JoinCondition [AND JoinCondition ...] [AND | OR FilterCondition [AND | OR FilterCondition ...]]]
[Group By GroupColumn [, GroupColumn ...]] [HAVING FilterCondition] [UNION [ALL] SELECTCommand]
[Order By Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]
下面谈几点SELECT —SQL的使用技巧。
1. 查询检索数据。这是SELECT —SQL的主要用法,因为其WHERE子句可以几乎任意组合条件,在程序中用的最多的不是查询界面,而是用来进行数据比对和判别。比如有些表字段不允许有相同重复数据录入,一般想到的是在表中建立主索引或候选索引,这个办法的最大隐患是需要将表单和表数据绑定,这对表文件是不安全的,以前讲过,最好不要对数据表直接“编辑”,确需绑定的,必须设定为只读,防备用户误操作而修改数据。其次,一旦录入数据出现重复,数据库报错可能使得整条记录作废,程序的易用性降低。解决的办法是在录入表单的相应字段的编辑框的Valid方法中使用SELECT —SQL进行判别验证,一旦检索到重复,及时提醒用户,这比“一错全错”要好得多。SELECT —SQL进行检索不需要切换工作区,无需所检索的表是否打开,也无需所检索的字段是否建立索引,还不改变工作区记录指针位置,如果一个字段不满足,或一个表的数据不满足,SELECT —SQL可以做到多字段、多表检索,这要比在表中设置主索引或候选索引要好得多。鉴于此,强烈建议各位狐友不要在数据库中建立字段级规则或记录级规则,同时,在数据库存储过程中也要慎用常量,那些做法只会使程序的适应性和易用性降低。因为程序升级比较容易,而要在将来修改用户的数据库,风险就太大了,不要为了眼前编程省点劲,而为自己将来设下绊索。
2. 建立临时表。SELECT —SQL的INTO Cursor子句 可以将检索到的数据存放到指定的临时表中,当关闭这个临时表后,将被自动删除。其实,这个临时表的字段结构是不限于检索源表的,可以任意构造,看下面的程序:
create table cname free (姓名 c(10))
select 姓名,;
space(2) as 性别, ;
000 as 年龄 ;
From cname into cursor cperson
上面程序中SELECT —SQL在表cname的基础上,增加了2个字段,一个是“性别”,字符型,另一个是“年龄”,数值型。space(2)和000称为占位符,其作用就是规定新构造字段的属性及宽度,space(2)表示性别字段是字符型,宽度为2字符,000表示年龄字段为数值型,三位整数,如果是00000.00则表示字段宽度为8,5位整数,2位小数。如果在上面的SELECT —SQL的后面加上READWRITE子句,这个临时表还可以执行写操作,不然临时表只能是只读的。
实际应用中,数据库中各种表的结构会有很大的不同,但SELECT —SQL很多连接操作要求连接的两表字段属性及宽度一致,我们可以先将其中的一个表重构一个结构相同的临时表,再进行连接操作。SELECT —SQL的这个功能,已经超出了数据检索的意义了,实现了数据重构和重组,学会了数据重构和重组,就可以改变我们组织数据的思维,也会大大改变我们程序的结构,这就是SELECT —SQL是VFP的精髓之所在。数据库只需要那些动态的基本数据,其他的完全可以用SELECT —SQL实现汇总、合并、连接。本菜鸟在一个企业库存管理模块中,就只用一个“年初库存结存表”和一个“本年入出库明细表”,通过几个SELECT —SQL命令,就轻松实现了年度内任意期间的期初数据、本期入库数据、本期出库数据、期末结存数据的统计查询。
3. 替代求和、求最大、求最小等命令和函数。由于SELECT —SQL不需要切换工作区,也不改变记录指针位置,使用SELECT —SQL替代SUM命令及MAX()和MIN()函数进行求和、求最大、求最小要方便得多。
4. 同表建立一对多关系。一对多关系在数据库里是异表间建立的,利用SELECT —SQL完全可以实现同表建立一对多关系。实现的原理是,先用SELECT —SQL建立一个临时表,在命令中使用DISTINCT子句剔除重复记录,使其成为“一”方,源表自然就是“多”方。
以上是本菜鸟的一点心得,本菜鸟在学习SELECT —SQL的过程中,已然感到其高深莫测,还是没有完全掌握其精髓,苦于找不到好的学习资料,冀望自己先献献丑,好引来高手们雨点般的砖头。
献丑了。