| 介绍 tmpfs |
| 介绍 tmpfs 如果我必须一下子说清楚 tmpfs,我会说 tmpfs 就象虚拟磁盘(ramdisk),但不一样。象虚拟磁盘一样,tmpfs 可以使用您的 RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个 mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。总而言之,这让 tmpfs 成为我有机会遇到的最好的基于 RAM 的文件系统。 tmpfs 和 VM 让我们来看看 tmpfs 更有趣的一些特性吧。正如我前面提到的一样,tmpfs 既可以使用 RAM, 也可以使用交换分区。刚开始这看起来可能有点武断,但请记住 tmpfs 也是我们知道的“虚拟内存文件系统”。而且,您可能也知道,Linux 内核的虚拟内存资源同时来源于您的 RAM 和交换分区。内核中的 VM 子系统将这些资源分配到系统中的其它部分,并负责在后台管理这些资源,通常是透明地将 RAM 页移动到交换分区或从交换分区到 RAM 页。 tmpfs 文件系统需要 VM 子系统的页面来存储文件。tmpfs 自己并不知道这些页面是在交换分区还是在 RAM 中;做这种决定是 VM 子系统的工作。tmpfs 文件系统所知道的就是它正在使用某种形式的虚拟内存。 不是块设备 这里是 tmpfs 文件系统另一个有趣的特性。不同于大多数“标准的”文件系统,如 ext3、ext2、XFS、JFS、ReiserFS 和其它一些系统,tmpfs 并不是存在于一个底层块设备上面。因为 tmpfs 是直接建立在 VM 之上的,您用一个简单的 mount 命令就可以创建 tmpfs 文件系统了。 |
2008年11月8日星期六
tmpfs
Use Gobal Regular Expression in Linux
1.grep & egrep
[zhouhh@etel ~]$ vi test1
line 1
hello, I'm line 2
line 3
this is line 4
保存
[zhouhh@etel ~]$ cat test1 grep hello
hello, I'm line 2
[zhouhh@etel ~]$ grep hello <>
grep不支持+,故不显示结果
[zhouhh@etel ~]$ grep '^.+line [0-9]$' test1
[zhouhh@etel ~]$ egrep '^.+line [0-9]$' test1
hello, I'm line 2
this is line 4
使用-v反转输出
[zhouhh@etel ~]$ grep '^line' test1
line 1
line 3
[zhouhh@etel ~]$ grep -v '^line' test1
hello, I'm line 2
this is line 4
Shell特殊字符
1.一般通配符
通配符用于模式匹配,如文件名匹配、路径名搜索、字符串查找等。常用的通配符有四种:
* 匹配任意字符0次或多次出现。例如,f*可以匹配以f 打头的任意字符串。但应注意,文件名前面的圆点( . ) 和路径名中的斜线( / )必须显式匹配。
? 匹配任意一个字符,例如,f ?匹配f1、fa、fb等,但不能匹配 f 、fabc、 f12等。
[ ] 其中有一个字符组,它匹配该字符组所限定的任何一个字符。该字符组可以由直接给出的字符组成,也可以由表示限定范围的起始字符、终止字符及中间一个连字符(-)组成。例如,f[a-d]与f[abcd]作用相同。
! 表示不在一对方括号中所列出的字符。例如,f[!1—9].c 表示以f打头,后面一个字符不是数字1至9的.c文件名,它匹配fa.c、fb.c、fm.c等。
在一个正则表达式中,可以同时使用“*”和“?”。
2.模式表达式
模式表达式是那些包含一个或多个通配符的字。bash除支持一般通配符外,还提供了特有的扩展模式匹配表达式,其形式和含义如下:
(1)*(模式表) 匹配给定模式表中“模式”的0次或多次出现,各模式之间以“”分开。例如,file*(.c|.o)将匹配文件file、file.c、file.o、file.c.c、file.0.0、file.c.o、file.o.c等,但不匹配file.h或file.s等。
(2)+(模式表) 匹配给定模式表中“模式”的1次或多次出现,各模式之间以“”分开。例如,file+(.c .o)匹配文件file.c、file.o、file.c.o、file.c.c等,但不匹配file。
(3)?(模式表) 匹配模式表中任何一种“模式”的0次或1次出现,各模式之间以“”分开。例如,file?(.c|.o)只匹配file、file.c和file.0,它不匹配多个模式或模式的重复出现,即不匹配file. c. c、file. c. 0等。
(4)@(模式表) 仅匹配模式表中给定“模式”的一次出现,各模式之间以“”分开。例如,file@(.c|.0)匹配file.c和file.0,但不匹配file、file.c.c、file.c.o等。
(5)!(模式表) 除给定模式表中的一个“模式”之外,它可以匹配其它任何东西。
可以看出,模式表达式的定义是递归的,每个表达式中都可以包含一个或多个模式。例如file*( .[cho]|.sh)是合法的模式表达式。但在使用时应注意,由于带“*”和“+”的表达式可以匹配给定模式的组合,若利用此种表达式去删除文件就存在危险,有可能误将系统配置文件删除。因此,必须小心使用。
3.引号
(1)双引号
由双引号括起来的字符,除$、倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待。“$”表示变量替换,即用其后指定的变量的值来代替$和变量;倒引号表示命令替换;仅当“\”后面的字符是下述字符之一时,“\”才是转义字符,这些字符是:“$”、“`”、“"”、“\”或换行符。转义字符告诉Shell不要对其后面的那个字符进行特殊处理,只是当作普通字符。例如:
$ echo "My current dir is `pwd` and logname is $LOGNAME"
My current dir is /home/abc and logname is abc
(2)单引号
由单引号括起来的字符都作为普通字符出现。例如,
$ echo 'The time is ` date ` , the file is $HOME/abc '
The time is ` date ` , the file is $HOME/abc
(3)倒引号
倒引号括起来的字符串被shell解释为命令行,在执行时,Shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。在前面示例中已经见过。例如,
$ echo current directory is ` pwd `
current directory is /home/abc
4.注释
Shell程序中以“#”开头的正文行表示注释。例如:
#!/bin/bash
# If no arguments, then listing the current directory.
# Otherwise, listing each subdirectory.
if test $# = 0
then ls ·
else
for i
do
ls -l $i grep '^d'
done
fi
上面程序由if语句构成,其中else部分是for循环语句。其功能是检测位置参数个数,若等于0,则列出当前目录本身;否则,对于每个位置参数显示其所包含的子目录。
上面代码中,第一行#!/bin/bash表示下面的脚本是用bash编写的,必须调用bash程序对它解释执行。后面两行以“ # ”开头,表示这是注释行。注释行可用来说明程序的功能、结构、算法和变量的作用等,增加程序的可读性。在执行时Shell将忽略注释行。
2008年8月23日星期六
养生大法!
春发,对于植物,根部的营养开始向枝干输送,并从枝干表面生发出来,从而形成芽。人也是一样,春天,人体的血气开始从内里向肢体和皮肤发送,这时,身体内的血气开始一点点相对减少,所以我们会感到春困。《黄帝内经》:春三月,此谓发陈,天地俱生,万物以荣,夜卧早起,广步于庭,被发缓形,以使志生,生而勿杀,予而勿夺,赏而勿罚,此春气之应,养生之道也。逆之则伤肝,夏为寒变,奉长者少。也就是说,春季三个月中,为陈旧的万物发新生芽之际,天地间一派生发蓬勃,万物也繁荣新生。人生活在这生发的季节,也应每日晚睡早起,起床后在庭院中散步,让头发披着、身形放松、衣服松解,以反映志气的新生,让生长旺盛而勿摧残杀戮,让予给的多而勿掠夺,让赏赐的多而勿惩罚,这都是春季生发的反应,是人逢春季的养生法则。如违背了春生法则,很易耗伤春主之脏的肝气,至夏季将患寒邪为病,使之本该茁壮成长的反减少。春季,对应着人体的肝脏,所以春天应该忌郁,忧郁会伤害肝脏。春天呢,男性每天早上最好服用一粒乌鸡白凤丸,通常这位药都是用于女性补气血,但是由于春天血气外发,男性更容易感到内虚,所以要服一粒补血气!
夏长,对于植物,夏天的时候枝繁叶茂,所有的营养全部供给给枝叶,根部就什么都没有了。人呢,夏天,血气经过整个春天已经全部发出,身体内里处于严重血气不足的状态,所以夏天,人更容易感到疲劳、眩晕、呼吸困难。《黄帝内经》:夏三月,此谓蕃秀,天地气交,万物华实,夜卧早起,无厌于日,使志无怒,使华英成秀,使气得泄,若所爱在外,此夏气之应,养长之道也。逆之则伤心,秋为痃疟,奉收者少,冬至重病。也就是说,夏季三个月中,一派繁荣众秀的气概,经过天气与地气的交会,万物开花结果、勃发生机,人也应迎着夏气之长,晚睡早起,不可厌恶阳光,要使情志无愤怒,与夏天的华英成秀气概一样、生气蓬勃,爱向外进发,这就是夏三月人应夏气而茁壮成长的养生法则。如违背了这些,则可耗伤夏所主之心气,而衍成秋季之疟病,影响收藏的质量,冬季还易发生重病。夏季,对应着人体的心,所以夏天应该忌怒,气怒伤心。夏天呢,中老年人应该喝一些生脉饮:人参、麦冬、五味子。
秋收,对于植物,是结果的季节,果实结出来了,营养开始内收。人体也是一样的,这个季节,血气开始回收于内。《黄帝内经》:秋三月,此谓容平,天气以急,地气以明,早卧早起,与鸡俱兴,使志安宁,以缓秋刑,收敛神气,使秋气平,无外其志,使肺气清,此秋气之应,养收之道也,逆之则伤肺,冬为飧泄,奉藏者少。也就是说,秋季三个月中,万物的生长已容颜平缓而成熟,天气急变而清肃,地气明爽而秋高,此时人亦应秋气之变而宜早睡早起,鸡叫即起床,并使情志安宁平静,以缓解秋天肃杀之气,此时要收敛心神,使像秋气之平容一样,情志也宜内敛而不外泄,因肺气的清肃而顺应秋气的特点,这就是秋季养收的修养法则。如违背了这一法则,可耗伤秋季所主之肺气,至冬季可发腹泻等病证,以致冬季的收藏之气相应减少。秋季,对应着人体的肺,所以秋天应该忌悲,悲伤伤肺。这个季节,人们应该多吃秋梨膏。
冬藏,对于植物,冬天树叶落尽,是为了减少营养的消耗,这些营养都储存在根部,以有利于来年的春发。人到了这个时候,体内的血气已经全部回于内,因此,冬季应减少房事,特别是男性,否则血气损害太深。《黄帝内经》:冬三月,此谓闭藏,水冰地坼,无扰乎阳,早卧晚起,必待日光,使志若伏若匿,若有私意,若已有得,去寒就温,无泄皮肤,使气亟夺,此冬气之应,养藏之道也。逆之则伤肾,春为痿厥,奉生者少。也就是说,冬季三个月中,反映出万物生长停顿和一派藏匿的景象,水结冰、地冻坼、阳刚之气似已收敛,此时人亦须顺冬藏之气而早睡晚起,以待阳光和温暖,使情志收敛伏藏,好像有自己的主意、好似已有收获,生活上要远离寒冷趋向温暖,不使皮肤泄气而使内气外逸,这些都是对冬气的顺应,是符合冬天养藏的养生法则的。如违背了这些则可耗伤肾气(冬主肾),至来年春季可发生萎软厥冷的疾病,且还可致来春应有的生气减少。冬季对应着人体的肾脏,所以冬季应该忌恐,惊恐伤肾。这个季节,女性要多吃阿胶、大枣、冰糖,以储存血气,人们也可以吃些六味地黄丸。
贼风数至,暴雨数起,天地四时不相保,与道相失,则未央绝灭。唯圣人从之,故身无奇病,万物不失,生气不竭。夫四时阴阳者,万物之根本也,所以圣人春夏养阳,秋冬养阴,以从其根,故与万物沉浮于生长之门。逆其根,则伐其本,坏其真矣。故阴阳四时者,万物之终始也,死生之本也,逆之则灾害生,从之则苛疾不起,是谓得道。道者,圣人行之,愚者佩之。从阴阳则生,逆之则死,从之则治,逆之则乱。反顺为逆,是谓内格
不正常的狂风经常刮来,损人的暴雨经常袭来,天地间的四季气候如此令人健康难保,只是因为人与自然的异常气候规律不相适应,以致多数人不能活到自然的寿命就夭折了。但是那些善于养生的人能顺从某些气候和环境的异常变化,故可以身不患大病,所需的器物也不缺少,因而其生气即使在恶劣的自然条件下也不会衰竭。一年四季阴阳盛衰的变化,是天地间万物生长壮老死等变化的根本原因。所以,善于养生的人多能做到,因春夏两季时阳气由弱渐生,故此时宜主养阳气以助阳旺;秋冬两季时阴气由弱渐长,故此时宜主养阴气以助阴旺。这就是从根本上来扶弱使旺的养生道理,故这些人就能与世间万物一样因适应阴阳消长的变化而保健延寿。若违背这一根本原则,则等于是自伐生命的本源,损坏自身的真元之气了。天地间四季阴阳的变化,也即是万物由开始至终结的变化,亦即其生死的根本原因,如不能顺从它则发生灾害,如能适应它则疾病不会发生,这就是人养生的大道理。这种道理,善养生的人能遵行它,而愚笨的人则常不听信它。能顺应阴阳变化的人则可保健长寿,违背阴阳变化的人则常失健而易夭折。一切事物的发生发展都是,能顺从阴阳变化的则可治可健,违逆它的则常乱常夭。如果应该顺从时却反变为叛逆,这就叫内格,也就是其事物本身的格拒和对抗,其后果是可想而知的。
春夏养阳,秋冬养阴。一年当中有几个重要的日子需要人们注意。夏至和冬至,这两天,一个是阳气刚刚来复,一个是阴气刚刚来复,是身体血气最缺乏的时期,所以,每年的这两天,最好在家睡觉!春分和秋分,这两天,是人体血气最充足的时候,所以,每年的这两天,应该出去活动,千万不要我在屋里!
2008年7月29日星期二
SQL语法与命令
SELECT 语句
SELECT[predicate]{*|table.*|[table.]field [,[table.]field2[,...]]} [AS alias1
[,alias2[,...]]]
FROM tableexpression [,...][IN externaldatabase]
[WHERE...]
[GROUP BY...]
[HAVING...]
[ORDER BY...]
[WITH OWNERACCESS OPTION]
SELECT 语句包括下面几个部分
predicate
如前面所述,包括了ALL,DISTINCT,DISTINCTROW,与TOP
我们可以利用这样的语句去限制查询后所得的结果。
*
从指定表格中指定所有的字段。
table
针对被选择出的记录的字段,所指定表格的名称。
field1,field2
想要读取数据的字段名称,如果包含了一个以上的字段,会依照列出的顺序来读取数据。
alias1,alias2
用来替代在表格实际字段名称的化名。
tableexpression
表格名称或包含我们所想要的数据的表格。
externaldatabase
若使用到不是目前的数据库则将其名字定义在externaldatabase当中。
ALL,DISTINCT,DISTINCTROW,TOP属性词用法
SELECT [ALL|DISTINCT|DISTINCTROW|[TOP n[PERCENT]]] FROM table
ALL
若是您不指定任何的字段数据,则Microsoft Jet数据库引擎(database
engine)将会选择所有的字段,并依据所定的条件查询出需求数据集。
例如下面这两个例子将会具有相同的效果,都会从职员表格中返回所有字段的数据。
例如:
若是我们要查询出职员表格中的所有记录,可以通过下面的语句来完成。
SELECT ALL*
FROM 职员表格;
DISTINCT
对某个表格所选择的字段数据,略过重复的情况,也就是说,针对某个字段查询出来的记录结果是唯一的。例如有许多存放在职员表格的职员
数据,也许会具有相同的姓名,所以若是我们用SQL语句中的SELECT
DISTINCT,则查询出来的结果将会针对不一样的姓名加以筛选。若是您把
DISTINCT 加以省略,则这样的查询会显示所有的记录。
DISTINCTROW
将整条记录重复的记录忽略掉,而不是只有针对某一个字段的数据。
table
指定查询记录所需要的表格。
例如:
SELECT DISTINCTROW 公司名称
FROM 顾客表格 INNER JOIN 订单表格
ON 顾客表格.顾客ID=订单表格.顾客ID
ORDER BY 公司名称;
如果您忽略 DISTINCTROW
则会对每个公司产生一行以下的订单数据。此外,若是DISTINCTROW只有用在一个表格当中,则会被省略掉。
TOP
从第一条或最后一条开始(利用ORDER BY条件子句),返回特定条数的数据。
例如:
当您想要知道在2000年,班上前25名的学生姓名数据时,您可以输入这样的语句:
SELECT TOP 25 学生姓名
FORM 学生表格
WHERE 毕业年份=1994
ORDER BY 毕业成绩平均分数 DESC;
如果您没有加上ORDER BY
这行条件的话,您所得到的数据,将会随机的数据。此外,在TOP语句之后,除了可以加上数字以外,还可以利用保留
字PERCENT来查询。
例如:
SELECT TOP 10 PERCENT学生姓名
FROM学生表格
WHERE毕业年份=1994
ORDER BY毕业成绩平均DESC;
PARAMETERS(参数)声明的用法
对于参数型的查询语法中,对参数的名称以及数据类型作
声明的操作。
PARAMETERS name datatype[,name datatype[,...]]
name
PARAMETERS的名称。您可以把参数名称当作字符串来使用,若是名称中包含了空字符串,可以利用中括号来处理,例如:“VBeden”。
datatype
输入参数的数据类型。
例如:
若是您在查询时,需要机动的输入姓名
,可以利用下列的方式完成:
PARAMETERS “输入姓名” Text;
SELECT*
FROM 职员表格
WHERE姓名=“输入姓名:”;
ORDER BY条件语句
此条件子句,通常与SELECT语句合并使用目的是将查询的结果,依照指定字段加以排序。
SELECT fieldlist
FROM table
WHERE selectcriteria
ORDER BY field[ASC|DESC][,field2[ASC|DESC][,...]]
fieldlist
欲查询的字段名称。其中可以与ALL,DISTINCT,DISINCTROW,或TOP一起来使用。
table
欲查询的表格名称。
selectcriteria
查询的标准设置。
field1
指定要依照那个字段作为排序的依据,若是你没有加上ORDER BY查询出的数据集将不会作排序的操作。
ASC
递增顺序类别。(默认值)
DESC
递减顺序类别。
例如:
或是我们要将输出数据依据出生的先后次序排列,可以利用下面的命令。
SELECT 姓名,生日
FROM 职员表格
ORDER BY 生日
SELECT LastName,FirstName
FROM Employees
ORDER BY LastName ASC;
IN 条件子句
指定要速胜哪一个外部数据库的表格。(必须是Microsoft Jet数据库引擎所可以连接的数据库,如dBase,Paradox等等)
SELECT|INSERT]INTO destination IN
{path|["path" "type"]|[""[type;DATABASE=path]]}
FROM tableexpression IN
{path|["path" "type"]|[""[type;DATABASE=path]]}
destination
欲插入数据的外部表格名称。
tableexpression
表格名称或是被读取数据的表格名称。这个参数可以是一个单一的表格名称,或是一段已经被存储的SQL查询等。
path
包含该表格的完整路径名称。
type
数据库的类型名称, 通常是当数据库部属于Jet database时才会使用。(例如:dBASE
III,dBASE IV,Paradox 3.x,Paradox 4.x,或 Btrieve)
例如:下面这两段的意义相同
PartA....FROM Table
IN ""[dBASE IV;DATABASE=C:\DBASE\DATA\SALES;];
PartB....FROM Table
IN "C:\DBASE\DATA\SALES" "dBASE IV;"
例如:Microsoft Jet database
SELECT 顾客编号
FROM 顾客表格
IN CUSTOMER.MDB
WHERE 顾客编号 Like "A*";
其中CUSTOMER.MDBO 为Jet database
的数据库名称,其中包含了顾客表格。
例如:dBASE III or IV
SELECT 顾客编号
FROM 顾客表格
IN "C:\DBASE\DATA\SALES" "dBASE IV;"
WHERE 顾客编号 Like "A*";
所以当我们使用不同于ACCESS
的数据库时,必须指明该数据库的类型名称。
HAVING 条件子句
指定一特定的分组记录,并满足HAVING
所指定的条件或状态,但条件是针对分组的条件设置。
SELECT fieldlist
FROM table
WHERE selectcriteria
GROUP BY groupfieldlist
HAVING groupcriteria
fieldlist
显示被查询的字段名称。(可与ALL,DISTINCT,DISTINCTROW,或TOP相结合)
table
欲查询数据的表格名称。
selectcriteria
选取标准。
groupfieldlist
分组记录的字段名称,到多10个字段。而这些字段的顺序决定最高到最低的分组阶层。
groupcriteria
决定什么样的分组记录要被显示。
HAVING跟WHERE 的用法相当类似,不同之处在于HAVING必须用于GROUP之后的分组数据上。
例如:
SELECT 分类编,Sum(库存数量)
FROM 产品表格
GROUP BY 分类编号
HAVING Sum(库存数量)>100 AND 产品名称 LIKE "*纸";
GROUP BY 条件子句
依据指定的字段,将具有相同数值的记录合并成一条。
SELECT fieldlist
FROM table
WHERE criteria
GROUP BY groupfieldlist
fieldlist
欲读取的字段名称。(可与ALL,DISTINCT,DISTINCTROW,或TOP合并使用)
table
被查询的表格名称。
groupfieldlist
分组记录的字段名称,到多10个字段,而这些字段的顺序决定最高到最低的分组层次。
例如:
SELECT 姓名,Count(姓名)AS 职员姓名
FROM 职员表格
WHERE 部门名称='业务部'
GROUP BY 姓名
FROM 条件子句
指定表格名称或是查询,其中包含列在SELECT语句的字段数据。
SELECT fieldlist
FROM tableexpression[IN externaldatabase]
fieldlist
表格中的字段名称。(可与ALL,DISTINCT,DISTINCTROW,或TOP相结合)
tableexpression
表格名称,或多个表格的算式。
externaldatabase
若该表格参考到外部的数据库时,将其完整的路径名称记下。
例如:
从职员表格下,查询出所有姓名字段的数据(只有姓名字段被查询,其他则不显示)。
SELECT 姓名 FROM 职员表格;
WHERE 条件子句
指定查询的条件与限制。
SELECT fieldlist
FROM tableexpression
WHERE criteria
fieldlist
字段名称。(可与ALL,DISTINCT,DISTINCTROW,或TOP相结合)
tableexpression
表格名称,或多个表格的算式。
criteria
查询的结果,必须依照这一限制标准。
例如:
要查询出职员表格中,所有姓氏是李的数据,可以用下面的语句。
SELECT 姓名
FROM 职员表格
WHERE 姓氏='李';
BETWEEN...AND 运算符
决定某一人数值是否介于特定的范围之内,此运算符只可以用在SQL的语句中。
expr[Not]BETWEEN value1 AND value2
expr
指定要加以计算的字段与表达式的组合。
value1,value2
所指明的数值范围。
例如:
若是要从职员表格查询出所有年龄介于25-30岁的员工,可以利用下面的程序来做。
SELECT 姓名,年龄 BETWEEN 25 AND 30
FROM 职员表格;
LIKE 操作数
用来将一字符串与另一特定字符串样式(pattern)比较,并将符合该字符串样式的记录过滤出来。
expression LIKE "pattern"
expression
使用在WHERE条件子句,SQL表达式。
pattern
用以比较的字符串样式。
例如:
若是你要查询出所有以“李”为首的姓氏,可以利用下面的式子。
Like "李*"
LIKE操作数的多种范例:
1、多个字符:
(1)"a*a"
可筛选:"aa","aBa","aBBBa",不能筛选:"aBC"
(2)"*ab*"
可筛选:"abc","AABB","Xab",不能筛选:"aZb","bac"
2、特殊字符:
"a“*”a"
可筛选:"a*a",不能筛选:"aaa"
3、单一字符:
"a?a"
可筛选:"aaa","a3a","aBa",不能筛选:"aBBBa"
4、单一数字:
"a#a"
可筛选:"a0a","a1a","a2a",不能筛选:"aaa","a10a"
5、字符范围:
"“a-z”"
可筛选:"f","p","j",不能筛选:"2","&"
6、指定字符以外部范围:
"“!a-z”"
7、指定非数字:
"“!0-9”"
可筛选:"A","a","&","~",不能筛选:"0","1","9"
8、组合式结构:
"a“!b-m”#"
可筛选:"An9","az0","a99",不能筛选:"abc","aj0"
SQL数字函数
1、AVG:算数平均数
AVG(expr)
expr
字段名称或表达式。
例如:
若要计算职员身高超过165厘米的职员平均身高,可以利用下面的SQL语句来完成。
SELECT Avg(身高)
AS 平均身高
FROM 职员表格 WHERE 身高>165;
2、COUNT:计算记录条数
COUNT(expr)
expr
字段名称或表达式。
例如:
若是要统计出业务部门的职员人数,并查询出职员的姓名,可以利用下面的程序。
SELECT Count(姓名) AS 职员姓名
FROM 职员表格
WHERE 部门名称='业务部';
3、FIRST与LAST:返回某字段的第一条数据与最后一条数据。
FIRST(expr)
LAST(expr)
expr
字段名称或表达式。
例如:
若是要找出货品数量字段的第一条数据与货品价格字段的最后一条数据时,可以利用下面的查询方式。
SELECT FIRST(货品数量),LAST(货品价格)
FROM 订单表格
4、MAX,与MIN:返回某字段的最大值与最小值。
用法同FIRST与LAST。
5、SUM:返回某特定字段或是运算的总和数值。
SUM(expr)
expr
字段名称或表达式。
例如:
要计算出货品总价,可使用下面的程序。
SELECT
Sum(单位价格*货品数量)
AS 货品总价 FROM 订单表格
多层SQL查询
顾名思义,多层的SQL查询的便在于:“在一个SQL语句中可以包含另一个SQL查询语句,形成内部嵌套的查询类型。”
comparison[ANY|ALL|SOME](sqlstatement)
expression[NOT]IN (sqlstatement)
[NOT]EXISTS(sqlstatement)
comparison
将表达式与内层查询的结果比较的操作。
expression
对内层查询的结果作搜索的表达式。
sqlstatement
为SELECT语句构成的SQL查询,必须用()将该语句括起来。
例如:
我们先从订单表格当中,查询出所有的单位,再将产品表格中的单位与的一一对比,查询出所有高于订单表格的单位价格的记录。
SELECT * FROM 产品表格
WHERE 单位价格>ANY (SELECT 单位价格 FROM 订单表格 WHERE 折扣>=.25);
SQL与数据库的维护
表格的建立
上次已经将SQL中的基本语法作了一番介绍以,但大多是偏向于数据库数据的查询与过滤,但实际上,我们通过SQL命令所可以做的事还有很多,接下来要介绍的便是如何利用SQL的语法命令来建立一个数据库中的表格。
CREATE TABLE语句
我们可以利用这个命令,来建立一个全新的表格,但前提则是:数据库必须已经存在。
CREATE TABLE table(field1 type[(size)][index1][,field2
type[(size)][index2][,...]][,nultifieldindex[,...]])
table
欲建立的新的表格名称。
field1,field2
在新表格中的新的字段名称,到少要一个字段以上。
type
字段的数据类型。
size
字段的大小。
index1,index2
利用CONSTRAINT条件子句定义一个单一字段的索引名称。
multifieldindex
利用CONSTRAINT条件子句定义一个多重字段的索引名称。
例如:
建立一个拥有职员姓名与部门字段的表格。
CREATE TABLE 职员表格 (姓名TEST,部门TEST,职员编号 INTEGER
CONSTRAINT职员字段索引PRIMARY KEY)
在这一个范例中,我们建立了一个表格名称为“职员表格”的表格,并且定义了该表格的主键值,以限制数据不能重复输入。
表格索引的建立
CREATE INDEX语句
这个命令主要是对一个已存在的表格建立索引,其用法如下:
CREATE[UNIQUE]INDEX index ON table(field[ASC|DESC][,field[ASC|DESC],...])
[WITH {PRIMARY|DISALLOWNULL|IGNORENULL}]
index
欲被建立的索引名称。
table
欲建立索引的表格名称。
field
欲被建立的索引的字段名称。并可通过DESC保留字,来决定索引的顺序。
例如:
在职员表格中建立一个索引。
CREATE INDEX 新索引名称
ON 职员表格(姓名部门);
表格的字段更新
CONSTRAINT条件子句
CONSTRAINT 的功能是类似索引(INDEX)的,虽然CONSTRAINT
也可以建立表格之间的关联性。
单一字段索引:
CONSTRAINT name{PRIMARY KEY|UNIQUE|REFERENCES
foreigntable[(foreignfield1,foreignfield2)]}
多字段索引:
CONSTRAINT name
{PRIMARY KEY(primary1[,primary2[,...]])
|UNIQUE(unique1[,unique2[,...]])
|FOREIGN KEY (ref1[,ref2[,...]])
|REFERENCES foreigntable[(foreignfield1[,foreignfield2[,...]])]}
name
要被建立的CONSTRAINT名称。
primary1,primary2
被用来设计成主键值的字段名称(可一个以上)。
unique1,unique2
被用来设计成唯一键值的字段名称(可一个以上)。
foreign key
字段名称,或是参考到别的表格中字段的字段名称。
foreigntable
如前所述,被参考到的表格。
foreignfield1,foreignfield2
在参考到的表格当中,被ref1,ref2字段所指定的字段。如果被参考的字段是参考表格中的主键值,你也可以省略这个条件子句。
例如:
当我们要建立一个新的职员数据表格,表格包含姓名、部门名称与生日三个字段,且由这三个字段建立一个唯一的索引时,可以使用下面这段SQL的语句。
CREATE TABLE 职员数据表格
(姓名 TEST,部门名称 TEST,生日 DATETIME,CONSTRAINT
职员数据表格限制 UNIQUE(姓名,部门名称,生日));
以上是SQL中,与数据库表格建立相关的命令,你可以利用这些命令,通过SQL的语句,将数据库表格完整的建立出来,接下来的章节,将针对数据库建立之后的维护与增删所要使用的SQL语句作一介绍。
表格的删除
DELETE语句
我们可以利用DELETE语句,将表格中的记录删除。(注意:记录被删除后,无法再复原,所以条件设置要正确)
DELETE[table.*]
FROM tableexpression
WHERE criteria
table
欲删除记录的表格名称,也可以用*来取代。
tableexpression
一个或一个以上表格的名称。此一参数可以为单一的表格名称或是从INNER
JOIN,LEFT JOIN,或RIGHTJOIN 等运算所得到的结果。
criteria
决定表格中记录要被删除的标准。
例如:
若是我们要将职员表格中姓名姓名叫做'李名'的记录删除,我们可以利用下面的SQL语句来完成。
DELETE * FROM 职员表格
WHERE 姓名='李名';
数据库表格相关的操作命令
SQL 除了可以作为查询与数据库表格的建立的工具外,对于数据库与表格的新建、删修、与维护,与具有相当不错的功能,若是读者使用SQL命令得宜,对于整 个效率的提高有着很大的帮助,所以对于SQL语句所带来的优势,常常会遇到一个情况,就是:“当我们对多个表格作复杂与多步骤的处理时,或许SQL只要一 个语句就可以完成所有的需求与目标”,乍看一下,或许觉得有些玄妙,但是接下来的章节,会让你了解其中的妙处。
SELECT...INTO语句
我们可以通过这个命令,利用既存表格查询,来建立一个新表格的查询语句。
SELECT field1[,field2[,...]]INTO newtable[IN externaldatabase]
FROM source
field1,field2
欲拷贝到新表格的字段名称。
newtable
欲建立之新表格的名称,不可是已经存在的表格。
externaldatabase
若是该表格在另外的外部数据库时,该数据库的名称。
source
记录数据拷贝的来源表格名称,可以是单一的表格或是一段SQL查询之语句。
例如:
你可以通过下面的SQL语句,来建立一个新的“训练名册”表格。
SELECT 职员表格.姓名,职员表格.部门
INTO 训练名册 FROM 职员表格
WHERE 职称='新进人员';
INNER JOIN操作数
当某一个共同的字段数据相等时,将两个表格的记录加以组合。
SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field2
table1,table2
欲进行记录组合的表格名称。
field1,field2
欲组合的字段名称。(必须具有相同的数据类型)
compopr
比较关系运算符如下:“=”,“<”,“>”,“<=”,“<>”等。
例如:
若是你要把分类表格与产品表格作组合,可参考下面的SQL语句。
SELECT 分类名称,产品名称
FROM 分类表格 INNER JOIN 产品表格
ON 分类表格.分类编号=产品表格.分类编号;
UNION操作数
我们可以通过UNION操作数来建立连接的查询条件,UNION操作数可以将两个以上的表格或是查询的结果组合起来。
[TABLE]query1 UNION [ALL][TABLE]query2 [UNION [ALL]
[TABLE]queryn [...]]
query1,query2,queryn
为一个SELECT的语句,或是一个已存在的查询名称,或是一个已存在的表格名称。
例如:
你可以利用下面的SQL语句,将订单数量超过1000的顾客表格记录,与新客户表格作UNION的操作。
TABLE 新客户表格 UNION ALL
SELECT *
FROM 顾客表格
WHERE 订单数量>1000;
ALTER语句
在一个表格被建立之后,利用ALTER语句,我们可以去修改表格的字段设计。
ALTER TABLE table
{ADD {COLUMN field type[(size)][CONSTRAINT index]
|CONSTRAINT multifieldindex}
|DROP {COLUMN field|CONSTRAINT indexname}}
table
欲被ALTER的表格名称。
field
要被增加或删除的字段名称。
type
字段数据类型。
size
字段大小。
index
对此字段的索引。
例如:
在职员表格中新建一个“薪水”的字段。
ALTER TABLE 职员表格
ADD COLUMN 薪水 CURRENCY;
例如:
在职员表格中删除一个“薪水”的字段。
ALTER TABLE 职员表格 DROP COLUMN 薪水;
DROP语句
针对所指定的表格或字段加以删除,或是把索引删除。
DROP {TABLE table|INDEX index ON table}
table
欲删除之表格或索引依附之表格名称。
index
欲从表格中删除的索引名称。
例如:
从职员表格中,删除编号索引。
DROP INDEX MyIndex ON Employees;
例如:
从数据库中,删除整个表格。
DROP TABLE 职员表格;
INSERT INTO语句
新建一条数据到表格当中。
多条记录新建查询:
INSERT INTO target [IN externaldatabase][(field1[,field2[,...]])]
SELECT [source.]field1[,field2[,...]
FROM tableexpression
单条记录新建查询:
INSERT INTO target[(field1[,field2[,...]])]
VALUES(value1[,value2[,...])
target
新建记录的表格名称。
externaldatabase
外部数据库的路径,搭配IN条件子句使用。
source
若是记录从其它表格中拷贝时,指明该表格的名称。
field1,field2
欲增加数据的字段名称。
tableexpression
表格名称或描述记录是从哪一个表格中插入的表格名称。配合INNER
JOIN,LEFT JOIN,或 RIGHT JOIN 运算符一起使用。
value1,value2
欲插入表格中的数值。
例如:
在客户数据表格中,从新的表格插入数据。
INSERT INTO 客户数据表格
SELECT 新客户数据表格.*
FROM 新客户数据表格;
例如:
在职员表格中插入数据。
INSERT INTO 职员表格(姓名,生日,职称)
VALUES("王荣","57/12/11","经理");
例如:
从训练人员表格中,将职员雇用时间超过30天者,加入到正式职员表格中。
INSERT INTO 职员表格
SELECT 训练人员表格.*
FROM 训练人员表格
WHERE 雇用天数>30;
UPDATE语句
建立一个UPDATE的查询,通过条件的限制来修改特定的数据。
UPDATE table
SET newvalue
WHERE criteria;
table
欲修改数据的表格名称。
newvalue
欲修改成的数值(将该项数值插入到特定的字段当中)。
criteria
查询条件,用来决定要修改哪些记录。
例如:
若是要把订单表格中的订单数量修改成1.1倍,运费为1.03倍,可利用下列之SQL语句来完成。
UPDATE 订单表格
SET 订单数量=订单数量 * 1.1,运费=运费 * 1.03倍
WHERE 运达地点='美国';
当我们完成修改后,你可以利用 SELECT
语句,配合同样的 WHERE
条件子句,来察看修改的数据是否正确。
事实上,要利用SQL完成某些看似复杂的操作,并不需要繁琐的SQL命令组合,或是许许多多的步骤才能完成,其实最重要的还是要活用SQL命令,才会在最精简的SQL语句里获得最高的效率。
2008年7月28日星期一
FSO - FileSystemObject
FSO - FileSystemObject 或 Scripting.FileSystemObject 的缩写,为 IIS 内置组件,用于操作磁盘、文件夹或文本文件。FSO 的对象、方法和属性非常的多,这里用示例的方式列出常用的,如果您要查看更详尽的信息,请点击这里下载 FileSystemObject 参考,注意:《VBScript 语言参考》或《JScript 语言参考》中的:《FileSystemObject 用户指南》和《Scripting 运行时库参考》便是微软给出的 FileSystemObject 完整参考。
FSO 不能操作二进制文件,要操作二进制文件,请使用:ADODB.Stream。
创建文件
dim fso, f
set fso = server.CreateObject("Scripting.FileSystemObject")
set f = fso.CreateTextFile("C:\test.txt", true) '第二个参数表示目标文件存在时是否覆盖
f.Write("写入内容")
f.WriteLine("写入内容并换行")
f.WriteBlankLines(3) '写入三个空白行(相当于在文本编辑器中按三次回车)
f.Close()
set f = nothing
set fso = nothing
打开并读文件
dim fso, f
set fso = server.CreateObject("Scripting.FileSystemObject")
set f = fso.OpenTextFile("C:\test.txt", 1, false) '第二个参数 1 表示只读打开,第三个参数表示目标文件不存在时是否创建
f.Skip(3) '将当前位置向后移三个字符
f.SkipLine() '将当前位置移动到下一行的第一个字符,注意:无参数
response.Write f.Read(3) '从当前位置向后读取三个字符,并将当前位置向后移三个字符
response.Write f.ReadLine() '从当前位置向后读取直到遇到换行符(不读取换行符),并将当前位置移动到下一行的第一个字符,注意:无参数
response.Write f.ReadAll() '从当前位置向后读取,直到文件结束,并将当前位置移动到文件的最后
if f.atEndOfLine then
response.Write("一行的结尾!")
end if
if f.atEndOfStream then
response.Write("文件的结尾!")
end if
f.Close()
set f = nothing
set fso = nothing
打开并写文件
dim fso, f
set fso = server.CreateObject("Scripting.FileSystemObject")
set f = fso.OpenTextFile("C:\test.txt", 2, false) '第二个参数 2=forwriting 表示重写,如果是 3=forappending 表示追加
f.Write("写入内容")
f.WriteLine("写入内容并换行")
f.WriteBlankLines(3) '写入三个空白行(相当于在文本编辑器中按三次回车)
f.Close()
set f = nothing
set fso = nothing
判断文件是否存在
dim fso
set fso = server.CreateObject("Scripting.FileSystemObject")
if fso.FileExists("C:\test.txt") then
response.Write("目标文件存在")
else
response.Write("目标文件不存在")
end if
set fso = nothing
移动文件
dim fso
set fso = server.CreateObject("Scripting.FileSystemObject")
call fso.MoveFile("C:\test.txt", "D:\test111.txt") '两个参数的文件名部分可以不同
set fso = nothing
复制文件
dim fso
set fso = server.CreateObject("Scripting.FileSystemObject")
call fso.CopyFile("C:\test.txt", "D:\test111.txt") '两个参数的文件名部分可以不同
set fso = nothing
删除文件
dim fso
set fso = server.CreateObject("Scripting.FileSystemObject")
fso.DeleteFile("C:\test.txt")
set fso = nothing
创建文件夹
dim fso
set fso = server.CreateObject("Scripting.FileSystemObject")
fso.CreateFolder("C:\test") '目标文件夹的父文件夹必须存在
set fso = nothing
判断文件夹是否存在
dim fso
set fso = server.CreateObject("Scripting.FileSystemObject")
if fso.FolderExists("C:\Windows") then
response.Write("目标文件夹存在")
else
response.Write("目标文件夹不存在")
end if
set fso = nothing
删除文件夹
dim fso
set fso = server.CreateObject("Scripting.FileSystemObject")
fso.DeleteFolder("C:\test") '文件夹不必为空
set fso = nothing