我的IT技术库
===========================================================
Windows系统内存计数器理解解析
===========================================================
序言内存的使用情况是系统性能中重要的因素之一,频繁的页交换及内存泄露都会影响到系统的性能。本文主要是描述内存的一些概念、计数器含义,以及可能存在的性能瓶颈。

一些概念
① “页交换”是使用称为“页面”的单位,将固定大小的代码和数据块从 RAM 移动到磁盘的过程,其目的是为了释放内存空间。
② 每个Windows进程都拥有4G的虚拟地址空间,在多任务环境下,所有进程使用的内存总和可以超过物理内存。
③ 进程的一部分可能会从物理内存中删除而被暂存在硬盘的文件里(pagefile)。当进程试图访问这些被交换到pagefile里的内存的时候,系统会产生一个缺页中断(page fault),这时候Windows内存管理器会负责把对应的内存页重新从硬盘调入物理内存。
④ 用于描述物理内存中虚拟页面子集的术语称为一个工作集(Working Set),也叫驻留集。一共有三种工作集:进程工作集、系统工作集、会话工作集。(具体概念看后面的计数器)
⑤ 非换页池:它是由一些“可保证总是驻留在物理内存中”的虚拟地址范围构成的,由于这些地址范围总是驻留在内存中,因此任何时候都可以访问它们,而不会招致页面错误。
⑥ 换页池:系统空间中的一段虚拟内存区域,它可以被换入和换出系统。这两种内存池都位于系统地址空间部分,并且被映射到每个进程的虚拟地址空间中。
⑦ 共享内存:对于多个进程可见的内存,或者出现在多个进程虚拟地址空间中的内存。例如:如果两个进程使用了同样的DLL,那么只需将引用该DLL的代码页面加载到物理内存一次,然后所有映射了该DLL的进程之间共享这些页面。
⑧ MDL(Memory Descrīptor List)是一个结构体,用于描述一片内存区域中的所有物理内存页。 查看全文
zjc4u 发表于:2010.03.26 16:59 ::分类: ( 小技巧 ) ::阅读:(508次) :: Permanent link
===========================================================
EXCEL中常用概率函数
===========================================================

COMBIN(number,number_chosen)

组合数

PERMUT(number,number_chosen)

排列数

AVERAGE(number1,number2,...)

算术平均数

GEOMEAN(number1,number2,...)

几何平均数

HARMEAN(number1,number2,...)

调和平均数

MAX(number1,number2,...)

最大值

MIN(number1,number2,...)

最小值

MEDIAN(number1,number2,...)

中位数

STDEV(number1,number2,...)

样本标准差

STDEVP(number1,number2,...)

总体标准差

VAR(number1,number2,...)

样本方差

VARP(number1,number2,...)

总体方差

BINOMDIST(number_s,trials,probability_s,cumulative)

n重贝努利试验

CRITBINOM(trials,probability_s,alpha)

二项分布

NORMDIST(x,mean,standard_dev,cumulative)

正态分布

NORMINV(probability,mean,standard_dev)

正态分布反函数

NORMSDIST(z)

标准正态分布

NORMSINV(probability)

标准正态分布反函数

STANDARDIZE(x,mean,standard_dev)

标准化正态分布

EXPONDIST(x,lambda,cumulative)

指数分布

POISSON(x,mean,cumulative)

泊松分布

CHIDIST(x,degrees_freedom)

单尾卡方分布

CHIINV(probability,degrees_freedom)

单尾卡方分布反函数

FDIST(x,degrees_freedom1,degrees_freedom2)

F分布

FINV(probability,degrees_freedom1,degrees_freedom2)

F分布反函数

TDIST(x,degrees_freedom,tails)

t 分布

TINV(probability,degrees_freedom)

t 分布反函数

CORREL(array1,array2)

相关系数

COVAR(array1,array2)

协方差

CONFIDENCE(alpha,standard_dev,size)

置信区间

FTEST(array1,array2)

F 检验

CHITEST(actual_range,expected_range)

卡方检验

TTEST(array1,array2,tails,type)

t 检验

ZTEST(array,μ0,sigma)

z 检验

LINEST(known_y's,known_x's,const,stats)

线性回归

LOGEST(known_y's,known_x's,const,stats)

指数回归

FORECAST(x,known_y's,known_x's)

线性预测

GROWTH(known_y's,known_x's,new_x's,const)

指数预


zjc4u 发表于:2008.12.08 12:02 ::分类: ( 小技巧 ) ::阅读:(1320次) :: Permanent link
===========================================================
INFORMIX动态服务器表分片策略的计划和调整
===========================================================
“数据分片”允许在表一级对数据存储进行控制。“表分片”是INFORMIX数据库的一个特征。用户可以对表中的记录或索引进行分组,并且存储在不同的位置,这样可以将数据存储到多个磁盘上,从而减少对磁盘I/O的竞争。数据分片的方案以及分片数据所存放的一组dbspace构成了“分片策略”。数据分片有两种基本类型:基于轮转分片“和 ”基于表达式分片”,对于“基于轮转法分片”,正如其名字一样,数据是根据轮转法方式存入表中的。“基于表达式分片”则根据表中的一个或多个字段对分片的规则进行定义。一般在预知查询条件时采用这种方式,从而避免查询中对某些分片的扫描。

 查看全文
zjc4u 发表于:2008.09.12 13:17 ::分类: ( Unix和Informix ) ::阅读:(410次) :: Permanent link
===========================================================
Oracle数据库备份命令Exp/Imp
===========================================================
ORACLE数据库有两类备份方法。第一类为物理备份,该方法实现数据库的完整恢复,但
数据库必须运行在归挡模式下(业务数据库在非归挡模式下运行),且需要极大的外部
存储设备,例如磁带库;第二类备份方式为逻辑备份,业务数据库采用此种方式,此方
法不需要数据库运行在归挡模式下,不但备份简单,而且可以不需要外部存储设备。
数据库逻辑备份方法
ORACLE数据库的逻辑备份分为三种模式:表备份、用户备份和完全备份。 查看全文
zjc4u 发表于:2008.08.10 11:04 ::分类: ( Oracle资料 ) ::阅读:(1237次) :: Permanent link
===========================================================
AIX的crontab不执行的问题及解决方法。
===========================================================

今天发现 P570 crontab 不运行,

查看/var/adm/cron/log 文件,里面报错信息如下:

# tail log
! 0481-095 The cron job is being rescheduled.
Fri Mar 2 09:22:00 BEIST 2007
! cron: 0481-087 The c queue maximum run limit has been reached.
Fri Mar 2 09:22:00 BEIST 2007
! 0481-095 The cron job is being rescheduled.
Fri Mar 2 09:22:00 BEIST 2007
! cron: 0481-087 The c queue maximum run limit has been reached.
Fri Mar 2 09:22:00 BEIST 2007
! 0481-095 The cron job is being rescheduled.
Fri Mar 2 09:22:00 BEIST 2007
! cron: 0481-087 The c queue maximum run limit has been reached.
Fri Mar 2 09:22:00 BEIST 2007
! 0481-095 The cron job is being rescheduled.
Fri Mar 2 09:22:00 BEIST 2007
! cron: 0481-087 The c queue maximum run limit has been reached.
Fri Mar 2 09:22:00 BEIST 2007
! 0481-095 The cron job is being rescheduled.
Fri Mar 2 09:22:00 BEIST 2007
! cron: 0481-087 The c queue maximum run limit has been reached.
Fri Mar 2 09:22:00 BEIST 2007
! 0481-095 The cron job is being rescheduled.
Fri Mar 2 09:22:00 BEIST 2007

问题原因:

crontab 没有定时执行是因为“! cron: 0481-087 The c queue maximum run limit has been reached.”。
修改/var/adm/cron/queuedefs 文件。在里面加上这样一句:"c.200j20n60w",然后kill PID,其中PID为cron进程号,新的cron设置就会生效。Maximum number of jobs in the queue by default was 50. The errorc messages 0481-087, 0481-095 usually appears when this max. number
is reached. So you can increase the maximum number of jobs in /var/adm/cron/queuedefs , vi the queuedefs file and change
the b to c and the 50 to 200. by including this entry"c.200j20n60w" in the file. After making the changes to the file, killcron and it will respawn again with the new settings.

解决方法:

#
#
# here is an example of a low prority (nice 20), 50 entry batch queue
# b.50j20n60w
c.1000j2n60w

在/var/adm/cron/queuedefs/queuedefs加以C队列为1000就可以了。

ps -ef|grep cron

kill -9 con服务的进程号

cron的服务会自动重启,问题解决。


zjc4u 发表于:2008.07.27 19:13 ::分类: ( 小技巧 ) ::阅读:(3708次) :: Permanent link
===========================================================
ODSB Control-M后台翻牌
===========================================================


后台翻牌
----------------------
以650分行为例,分行使用时请自行替换对应3位分行号。
假设要翻到20080229跑20080229的增量。

ctm用户登录DB3910
ctmpsm -UPDATETABLE 650009000 HOLD
ctmpsm -UPDATETABLE 650009000 DELETE
ctmcontb -DELETE "*650009000*" "*"
执行完后,进ctmpsm -> 41 -> 1,看看是不是所有记录都标上deleted的标志,如果不是,则重复执行上面三个命令,如果是则证明操作完成。

然后ods用户登陆AP3920,使用
ViewCycle -s 650009000,确保没有在RUNNING的作业。
然后执行
CycleAdmin -s 650009000 -l 20080228 -d 20080229 -t F -f

然后ctm登录DB3910那边,ctmpsm -> 72,然后table输入650009000,回车,job输入*,回车,然后其它都默认回车,这样操作完增量就会跑了。


zjc4u 发表于:2008.03.23 16:33 ::分类: ( 小技巧 ) ::阅读:(1185次) :: Permanent link
===========================================================
linux下crontab失效的原因
===========================================================

系统中开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,在sendmail没有启动的情况下,输出的内容要写入到clientmqueue目录下,但由于该台服务器clientmqueue目录不存在,所以脚本运行中断。


解决方法:
1、在/var/spool/目录下创建clientmqueue目录,修改属主和属组为smmsp
2、将crontab里面的命令后面加上> /dev/null 2>&1
2>&1:把错误重定向到输出要送到的地方。即把命令的执行结果重定向到/dev/null,即抛弃,同时,把产生的错误也抛弃。 这个是之前碰到情况的一种处理方法。只是个建议


zjc4u 发表于:2008.03.23 16:09 ::分类: ( 小技巧 ) ::阅读:(1075次) :: Permanent link
===========================================================
轻松掌握如何从sqlplus向shell传递变量
===========================================================

很多人在实际的工作和学习中,都遇到了无法通过sqlplus向shell传递变量,下面我们来介绍一个实例脚本来进行折中处理。

[oracle@jumper oracle]$ cat a.sh
sqlplus -S "/ as sysdba" << !
set heading off
col today noprint
column today new_val dat
select to_char( sysdate, 'yyyy-mm-dd') today from dual;
host echo 'today is ' &dat
exit;
exit;
!
[oracle@jumper oracle]$ ./a.sh

today is 2005-04-11

[oracle@jumper oracle]$

下面我们再来介绍另一个实例方法:

[oracle@jumper oracle]$ more a.sh

#!/bin/ksh
VALUE=`sqlplus -silent "/ as sysdba" < < END
set pagesize 0 feedback off verify off heading off echo off
select max(sequence#) from v$log_history;
exit;
END`

if [ -z "$VALUE" ]; then
echo "No rows returned from database"
exit 0
else
echo "Max Sequence Number: $VALUE"
fi


[oracle@jumper oracle]$ ./a.sh
Max Sequence Number: 17


zjc4u 发表于:2008.01.28 14:55 ::分类: ( Oracle资料 ) ::阅读:(10620次) :: 评论 (0)
===========================================================
元数据的概念
===========================================================

元数据

元数据:是描述数据仓库内数据的结构和建立方法的数据。可将其按用途的不同分为两类,技术元数据和商业元数据。

技术元数据是数据仓库的设计和管理人员用于开发和日常管理数据仓库时用的数据。包括:数据源信息:数据转换的描述;数据仓库内对象和数据结构的定义;数据清理和数据更新时用的规则;源数据到目的数据的映射;用户访问权限,数据备份历史记录,数据导入历史记录,信息发布历史记录等。

商业元数据从商业业务的角度描述了数据仓库中的数据。包括业务主题的描述,包含的数据、查询、报表。

元数据为访问数据仓库提供了一个信息目录(information directory),这个目录全面描述了数据仓库中都有什么数据、这些数据怎么得到的、和怎么访问这些数据。是数据仓库运行和维护的中心,数据仓库服务器利用他来存贮和更新数据,用户通过他来了解和访问数据。


zjc4u 发表于:2007.01.31 17:18 ::分类: ( ETL工作 ) ::阅读:(60236次) :: Permanent link
===========================================================
常用oracle函数
===========================================================

SQL中的单记录函数
1.ASCII
返回与指定的字符对应的十进制数;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;
A A ZERO SPACE
--------- --------- --------- ---------
65 97 48 32


2.CHR
给出整数,返回对应的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;

ZH C
-- -
赵 A

3.CONCAT
连接两个字符串;
SQL> select concat('010-','88888888')||'转23' 高乾竞电话 from dual;

高乾竞电话
----------------
010-88888888转23

4.INITCAP
返回字符串并将字符串的第一个字母变为大写;
SQL> select initcap('smith') upp from dual;

UPP
-----
Smith


5.INSTR(C1,C2,I,J)
在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1
SQL> select instr('oracle traning','ra',1,2) instring from dual;

INSTRING
---------
9


6.LENGTH
返回字符串的长度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;

NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL))
------ ------------ ---------------- ------------ --------- --------------------
高乾竞 3 北京市海锭区 6 9999.99 7

7.LOWER
返回字符串,并将所有的字符小写
SQL> select lower('AaBbCcDd')AaBbCcDd from dual;

AABBCCDD
--------
aabbccdd


8.UPPER
返回字符串,并将所有的字符大写
SQL> select upper('AaBbCcDd') upper from dual;

UPPER
--------
AABBCCDD

9.RPAD和LPAD(粘贴字符)
RPAD 在列的右边粘贴字符
LPAD 在列的左边粘贴字符
SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;

LPAD(RPAD('GAO',1
-----------------
*******gao*******
不够字符则用*来填满


10.LTRIM和RTRIM
LTRIM 删除左边出现的字符串
RTRIM 删除右边出现的字符串
SQL> select ltrim(rtrim(' gao qian jing ',' '),' ') from dual;

LTRIM(RTRIM('
-------------
gao qian jing


11.SUBSTR(string,start,count)
取子字符串,从start开始,取count个
SQL> select substr('13088888888',3,8) from dual;

SUBSTR('
--------
08888888


12.REPLACE('string','s1','s2')
string 希望被替换的字符或变量
s1 被替换的字符串
s2 要替换的字符串
SQL> select replace('he love you','he','i') from dual;

REPLACE('H
----------
i love you


13.SOUNDEX
返回一个与给定的字符串读音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');

SQL> select xm from table1 where soundex(xm)=soundex('weather');

XM
--------
weather
wether


14.TRIM('s' from 'string')
LEADING 剪掉前面的字符
TRAILING 剪掉后面的字符
如果不指定,默认为空格符

15.ABS
返回指定值的绝对值
SQL> select abs(100),abs(-100) from dual;

ABS(100) ABS(-100)
--------- ---------
100 100


16.ACOS
给出反余弦的值
SQL> select acos(-1) from dual;

ACOS(-1)
---------
3.1415927


17.ASIN
给出反正弦的值
SQL> select asin(0.5) from dual;

ASIN(0.5)
---------
.52359878


18.ATAN
返回一个数字的反正切值
SQL> select atan(1) from dual;

ATAN(1)
---------
.78539816


19.CEIL
返回大于或等于给出数字的最小整数
SQL> select ceil(3.1415927) from dual;

CEIL(3.1415927)
---------------
4


20.COS
返回一个给定数字的余弦
SQL> select cos(-3.1415927) from dual;

COS(-3.1415927)
---------------
-1


21.COSH
返回一个数字反余弦值
SQL> select cosh(20) from dual;

COSH(20)
---------
242582598


22.EXP
返回一个数字e的n次方根
SQL> select exp(2),exp(1) from dual;

EXP(2) EXP(1)
--------- ---------
7.3890561 2.7182818


23.FLOOR
对给定的数字取整数
SQL> select floor(2345.67) from dual;

FLOOR(2345.67)
--------------
2345


24.LN
返回一个数字的对数值
SQL> select ln(1),ln(2),ln(2.7182818) from dual;

LN(1) LN(2) LN(2.7182818)
--------- --------- -------------
0 .69314718 .99999999


25.LOG(n1,n2)
返回一个以n1为底n2的对数
SQL> select log(2,1),log(2,4) from dual;

LOG(2,1) LOG(2,4)
--------- ---------
0 2


26.MOD(n1,n2)
返回一个n1除以n2的余数
SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;

MOD(10,3) MOD(3,3) MOD(2,3)
--------- --------- ---------
1 0 2


27.POWER
返回n1的n2次方根
SQL> select power(2,10),power(3,3) from dual;

POWER(2,10) POWER(3,3)
----------- ----------
1024 27


28.ROUND和TRUNC
按照指定的精度进行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;

ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
56 -55 55 -55


29.SIGN
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
SQL> select sign(123),sign(-100),sign(0) from dual;

SIGN(123) SIGN(-100) SIGN(0)
--------- ---------- ---------
1 -1 0


30.SIN
返回一个数字的正弦值
SQL> select sin(1.57079) from dual;

SIN(1.57079)
------------
1


31.SIGH
返回双曲正弦的值
SQL> select sin(20),sinh(20) from dual;

SIN(20) SINH(20)
--------- ---------
.91294525 242582598


32.SQRT
返回数字n的根
SQL> select sqrt(64),sqrt(10) from dual;

SQRT(64) SQRT(10)
--------- ---------
8 3.1622777


33.TAN
返回数字的正切值
SQL> select tan(20),tan(10) from dual;

TAN(20) TAN(10)
--------- ---------
2.2371609 .64836083


34.TANH
返回数字n的双曲正切值
SQL> select tanh(20),tan(20) from dual;

TANH(20) TAN(20)
--------- ---------
1 2.2371609

35.TRUNC
按照指定的精度截取一个数
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;

TRUNC1 TRUNC(124.16666,2)
--------- ------------------
100 124.16

36.ADD_MONTHS
增加或减去月份
SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;

TO_CHA
------
200002
SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;

TO_CHA
------
199910


37.LAST_DAY
返回日期的最后一天
SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;

TO_CHAR(SY TO_CHAR((S
---------- ----------
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual;

LAST_DAY(S
----------
31-5月 -04


38.MONTHS_BETWEEN(date2,date1)
给出date2-date1的月份
SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual;

MON_BETWEEN
-----------
9
SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;

MON_BETW
---------
-60


39.NEW_TIME(date,'this','that')
给出在this时区=other时区的日期和时间
SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time
2 (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;

BJ_TIME LOS_ANGLES
------------------- -------------------
2004.05.09 11:05:32 2004.05.09 18:05:32


40.NEXT_DAY(date,'day')
给出日期date和星期x之后计算下一个星期的日期
SQL> select next_day('18-5月-2001','星期五') next_day from dual;

NEXT_DAY
----------
25-5月 -01

41.SYSDATE
用来得到系统的当前日期
SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;

TO_CHAR(SYSDATE,'
-----------------
09-05-2004 星期日
trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒
SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,
2 to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;

HH HHMM
------------------- -------------------
2004.05.09 11:00:00 2004.05.09 11:17:00

42.CHARTOROWID
将字符数据类型转换为ROWID类型
SQL> select rowid,rowidtochar(rowid),ename from scott.emp;

ROWID ROWIDTOCHAR(ROWID) ENAME
------------------ ------------------ ----------
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES


43.CONVERT(c,dset,sset)
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集
SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;

conver
------
strutz


44.HEXTORAW
将一个十六进制构成的字符串转换为二进制


45.RAWTOHEXT
将一个二进制构成的字符串转换为十六进制

46.ROWIDTOCHAR
将ROWID数据类型转换为字符类型

47.TO_CHAR(date,'format')
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2004/05/09 21:14:41

48.TO_DATE(string,'format')
将字符串转化为ORACLE中的一个日期


49.TO_MULTI_BYTE
将字符串中的单字节字符转化为多字节字符
SQL> select to_multi_byte('高') from dual;

TO
--


50.TO_NUMBER
将给出的字符转换为数字
SQL> select to_number('1999') year from dual;

YEAR
---------
1999


51.BFILENAME(dir,file)
指定一个外部二进制文件
SQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));


52.CONVERT('x','desc','source')
将x字段或变量的源source转换为desc
SQL> select sid,serial#,username,decode(command,
2 0,'none',
3 2,'insert',
4 3,
5 'select',
6 6,'update',
7 7,'delete',
8 8,'drop',
9 'other') cmd from v$session where type!='background';

SID SERIAL# USERNAME CMD
--------- --------- ------------------------------ ------
1 1 none
2 1 none
3 1 none
4 1 none
5 1 none
6 1 none
7 1275 none
8 1275 none
9 20 GAO select
10 40 GAO none


53.DUMP(s,fmt,start,length)
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值
SQL> col global_name for a30
SQL> col dump_string for a50
SQL> set lin 200
SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;

GLOBAL_NAME DUMP_STRING
------------------------------ --------------------------------------------------
ORACLE.WORLD Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D


54.EMPTY_BLOB()和EMPTY_CLOB()
这两个函数都是用来对大数据类型字段进行初始化操作的函数

55.GREATEST
返回一组表达式中的最大值,即比较字符的编码大小.
SQL> select greatest('AA','AB','AC') from dual;

GR
--
AC
SQL> select greatest('啊','安','天') from dual;

GR
--


56.LEAST
返回一组表达式中的最小值
SQL> select least('啊','安','天') from dual;

LE
--


57.UID
返回标识当前用户的唯一整数
SQL> show user
USER 为"GAO"
SQL> select username,user_id from dba_users where user_id=uid;

USERNAME USER_ID
------------------------------ ---------
GAO 25

58.USER
返回当前用户的名字
SQL> select user from dual;

USER
------------------------------
GAO


59.USEREVN
返回当前用户环境的信息,opt可以是:
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE
ISDBA 查看当前用户是否是DBA如果是则返回true
SQL> select userenv('isdba') from dual;

USEREN
------
FALSE
SQL> select userenv('isdba') from dual;

USEREN
------
TRUE
SESSION
返回会话标志
SQL> select userenv('sessionid') from dual;

USERENV('SESSIONID')
--------------------
152
ENTRYID
返回会话人口标志
SQL> select userenv('entryid') from dual;

USERENV('ENTRYID')
------------------
0
INSTANCE
返回当前INSTANCE的标志
SQL> select userenv('instance') from dual;

USERENV('INSTANCE')
-------------------
1
LANGUAGE
返回当前环境变量
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
LANG
返回当前环境的语言的缩写
SQL> select userenv('lang') from dual;

USERENV('LANG')
----------------------------------------------------
ZHS
TERMINAL
返回用户的终端或机器的标志
SQL> select userenv('terminal') from dual;

USERENV('TERMINA
----------------
GAO
VSIZE(X)
返回X的大小(字节)数
SQL> select vsize(user),user from dual;

VSIZE(USER) USER
----------- ------------------------------
6 SYSTEM

60.AVG(DISTINCT|ALL)
all表示对所有的值求平均值,distinct只对不同的值求平均值
SQLWKS> create table table3(xm varchar(8),sal number(7,2));
语句已处理。
SQLWKS> insert into table3 values('gao',1111.11);
SQLWKS> insert into table3 values('gao',1111.11);
SQLWKS> insert into table3 values('zhu',5555.55);
SQLWKS> commit;

SQL> select avg(distinct sal) from gao.table3;

AVG(DISTINCTSAL)
----------------
3333.33

SQL> select avg(all sal) from gao.table3;

AVG(ALLSAL)
-----------
2592.59


61.MAX(DISTINCT|ALL)
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次
SQL> select max(distinct sal) from scott.emp;

MAX(DISTINCTSAL)
----------------
5000


62.MIN(DISTINCT|ALL)
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次
SQL> select min(all sal) from gao.table3;

MIN(ALLSAL)
-----------
1111.11


63.STDDEV(distinct|all)
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差
SQL> select stddev(sal) from scott.emp;

STDDEV(SAL)
-----------
1182.5032

SQL> select stddev(distinct sal) from scott.emp;

STDDEV(DISTINCTSAL)
-------------------
1229.951

64.VARIANCE(DISTINCT|ALL)
求协方差

SQL> select variance(sal) from scott.emp;

VARIANCE(SAL)
-------------
1398313.9


65.GROUP BY
主要用来对一组数进行统计
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;

DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
10 3 8750
20 5 10875
30 6 9400

66.HAVING
对分组统计再加限制条件
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;

DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
20 5 10875
30 6 9400
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;

DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
20 5 10875
30 6 9400


67.ORDER BY
用于对查询到的结果进行排序输出
SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;

DEPTNO ENAME SAL
--------- ---------- ---------
10 KING 5000
10 CLARK 2450
10 MILLER 1300
20 SCOTT 3000
20 FORD 3000
20 JONES 2975
20 ADAMS 1100
20 SMITH 800
30 BLAKE 2850
30 ALLEN 1600
30 TURNER 1500
30 WARD 1250
30 MARTIN 1250
30 JAMES 950


zjc4u 发表于:2006.01.08 22:14 ::分类: ( Oracle资料 ) ::阅读:(507次) :: Permanent link
===========================================================
蛮有意思:若干著名IT公司名称的来历
===========================================================

原文链接——http://thekaran.com/iStuff/companyNames.html

  译者按:比较有意思的东西,没看见中文版,翻译了。对原文所述未经证实,望知者不吝赐教。

  Yahoo!
  《格列佛游记》的作者Jonathan Swift发明了yahoo这个单词。在小说里,它代表了一个在外表和行为举止上都令人厌恶的家伙,简直都不能算是一个人。Yahoo! 的创始人杨致远和David Filo选择这个名字的原因是他们觉得自己是yahoo。

  另一种说法,Yahoo是"Yet Another Hierarchical Officious Oracle"的首字母缩写,不过David Filo和杨致远坚持他们选择这个名称的原因是他们喜欢字典里对yahoo的定义:“粗鲁,不通世故,粗俗。” (来源: http://docs.yahoo.com/info/misc/history.html)
  

  Xerox
  xer是希腊文字根,代表“干”。由于Chestor Carlson发明的产品是干式复印,和当时占优势的湿法复印有显著的差别,所以他用Xerox命名。
  

  SUN Microsystems
  由斯坦福大学的四个家伙创建。SUN 是“Stanford University Network”的首字母缩写。


  Sony
  来自sonus和sonny的组合。sonus是拉丁词,代表声音。sonny是美国俚语,用来称呼聪明伶俐的少年。


  SAP
  代表"Systems, Applications, Products in Data Processing"。四个IBM的前雇员组建了SAP。他们为IBM工作时属于的团队叫“Systems/Applications/Projects”。
  

  Red Hat
  公司创始人Marc Ewing念大学的时候,他祖父给了他一顶康奈尔曲棍球队的帽子。帽子上有着红色和白色的条纹。他不小心把帽子弄丢了,不得不拼命去找。红帽子Linux beta版的用户手册里面有一段话,央求用户如果找到了他的红帽子,请归还!


  Oracle
  Larry Ellison 和 Bob Oats 曾经为中央情报局的一个咨询项目工作。这个项目的代号就叫 Oracle。
  

  Motorola
  创始人Paul Galvin是在公司开始生产车用无线电的时候让公司叫现在这个名字的。原先它叫Victrola。
  

  Microsoft
  Bill Gate起了这个名字。为了代表MICROcomputer SOFTware,就叫做Micro-Soft,后来把中间的 “-” 去掉了。


zjc4u 发表于:2005.12.24 23:17 ::分类: ( 小技巧 ) ::阅读:(603次) :: Permanent link
===========================================================
一个SCO Unix的链接,蛮好。
===========================================================
http://www.slas.cn/user1/737/archives/2005/2228.shtml
zjc4u 发表于:2005.12.04 20:55 ::分类: ( Unix和Informix ) ::阅读:(597次) :: 评论 (0)
===========================================================
win2k运行进程详解
===========================================================

Svchost.exe
Svchost.exe文件对那些从动态连接库中运行的服务来说是一个普通的主机进程名。Svhost.exe文件定位
在系统的%systemroot%system32文件夹下。在启动的时候,Svchost.exe检查注册表中的位置来构建需要
加载的服务列表。这就会使多个Svchost.exe在同一时间运行。每个Svchost.exe的回话期间都包含一组服务,
以至于单独的服务必须依靠Svchost.exe怎样和在那里启动。这样就更加容易控制和查找错误。

Svchost.exe 组是用下面的注册表值来识别。

HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionSvchost
每个在这个键下的值代表一个独立的Svchost组,并且当你正在看活动的进程时,它显示作为一个单独的
例子。每个键值都是REG_MULTI_SZ类型的值而且包括运行在Svchost组内的服务。每个Svchost组都包含一个
或多个从注册表值中选取的服务名,这个服务的参数值包含了一个ServiceDLL值。
HKEY_LOCAL_MACHINESystemCurrentControlSetServicesService

更多的信息
为了能看到正在运行在Svchost列表中的服务。
开始-运行-敲入cmd
然后在敲入 tlist -s (tlist 应该是win2k工具箱里的冬冬)
Tlist 显示一个活动进程的列表。开关 -s 显示在每个进程中的活动服务列表。如果想知道更多的关于
进程的信息,可以敲 tlist pid。

Tlist 显示Svchost.exe运行的两个例子。
0 System Process
8 System
132 smss.exe
160 csrss.exe Title:
180 winlogon.exe Title: NetDDE Agent
208services.exe
Svcs: AppMgmt, Browser, Dhcp, dmserver, Dnscache, Eventlog, lanmanserver, LanmanWorkstation, LmHosts, Messenger, PlugPlay, ProtectedStorage, seclogon, TrkWks, W32Time, Wmi
220 lsass.exe Svcs: Netlogon,PolicyAgent,SamSs
404 svchost.exe Svcs: RpcSs
452 spoolsv.exe Svcs: Spooler
544 cisvc.exe Svcs: cisvc
556 svchost.exe Svcs: EventSystem,Netman,NtmsSvc,RasMan,SENS,TapiSrv
580 regsvc.exe Svcs: RemoteRegistry
596 mstask.exe Svcs: Schedule
660 snmp.exe Svcs: SNMP
728 winmgmt.exe Svcs: WinMgmt
852 cidaemon.exe Title: OleMainThreadWndName
812 explorer.exe Title: Program Manager
1032 OSA.EXE Title: Reminder
1300 cmd.exe Title: D:WINNT5System32cmd.exe - tlist -s
1080 MAPISP32.EXE Title: WMS Idle
1264 rundll32.exe Title:
1000 mmc.exe Title: Device Manager
1144 tlist.exe
在这个例子中注册表设置了两个组。
HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionSvchost:
netsvcs: Reg_Multi_SZ: EventSystem Ias Iprip Irmon Netman Nwsapagent Rasauto Rasman Remoteaccess SENS Sharedaccess Tapisrv Ntmssvc
rpcss :Reg_Multi_SZ: RpcSs

smss.exe

csrss.exe

这个是用户模式Win32子系统的一部分。csrss代表客户/服务器运行子系统而且是一个基本的子系统
必须一直运行。csrss 负责控制windows,创建或者删除线程和一些16位的虚拟MS-DOS环境。

explorer.exe
这是一个用户的shell(我实在是不知道怎么翻译shell),在我们看起来就像任务条,桌面等等。这个
进程并不是像你想象的那样是作为一个重要的进程运行在windows中,你可以从任务管理器中停掉它,或者重新启动。
通常不会对系统产生什么负面影响。

internat.exe

这个进程是可以从任务管理器中关掉的。
internat.exe在启动的时候开始运行。它加载由用户指定的不同的输入点。输入点是从注册表的这个位置
HKEY_USERS.DEFAULTKeyboard LayoutPreload 加载内容的。
internat.exe 加载“EN”图标进入系统的图标区,允许使用者可以很容易的转换不同的输入点。
当进程停掉的时候,图标就会消失,但是输入点仍然可以通过控制面板来改变。

lsass.exe
这个进程是不可以从任务管理器中关掉的。
这是一个本地的安全授权服务,并且它会为使用winlogon服务的授权用户生成一个进程。这个进程是
通过使用授权的包,例如默认的msgina.dll来执行的。如果授权是成功的,lsass就会产生用户的进入
令牌,令牌别使用启动初始的shell。其他的由用户初始化的进程会继承这个令牌的。

mstask.exe
这个进程是不可以从任务管理器中关掉的。
这是一个任务调度服务,负责用户事先决定在某一时间运行的任务的运行。

smss.exe
这个进程是不可以从任务管理器中关掉的。
这是一个会话管理子系统,负责启动用户会话。这个进程是通过系统进程初始化的并且对许多活动的,
包括已经正在运行的Winlogon,Win32(Csrss.exe)线程和设定的系统变量作出反映。在它启动这些
进程后,它等待Winlogon或者Csrss结束。如果这些过程时正常的,系统就关掉了。如果发生了什么
不可预料的事情,smss.exe就会让系统停止响应(就是挂起)。

spoolsv.exe
这个进程是不可以从任务管理器中关掉的。
缓冲(spooler)服务是管理缓冲池中的打印和传真作业。

service.exe
这个进程是不可以从任务管理器中关掉的。
大多数的系统核心模式进程是作为系统进程在运行。

System Idle Process
这个进程是不可以从任务管理器中关掉的。
这个进程是作为单线程运行在每个处理器上,并在系统不处理其他线程的时候分派处理器的时间。

taskmagr.exe
这个进程是可以在任务管理器中关掉的。
这个进程就是任务管理器。

winlogon.exe
这个进程是管理用户登录和推出的。而且winlogon在用户按下CTRL+ALT+DEL时就激活了,显示安全对话框。

winmgmt.exe
winmgmt是win2000客户端管理的核心组件。当客户端应用程序连接或当管理程序需要他本身的服务时这个进程初始化。


zjc4u 发表于:2005.11.26 15:51 ::分类: ( 小技巧 ) ::阅读:(498次) :: 评论 (0)
===========================================================
文件传主输协议FTP命令不完全手册
===========================================================

文件传输软件的使用格式为:FTP(网址或IP地址),若连 接成功,系统将提示用户输入用户名及口令:
LOGIN: (输入合法的用户名或者“ANONMOUS”);
PASSWORD: (输入合法的口令,若以“ANONMOUS”方式登录,一般不用口令);
进入想要连接的FTP站点后,用户就可以进行相应的文件传输操作了,其中一些重要 的命令及相似的命令 如下:

1)HELP、 ?、RHEIP、REMOTEHELP
HELP显示LOCAL端的命令说明,若不接受则显示所有可用命令;
?相当于HELP,例如:?CD:
RHELP同HELP,只是它用来显示REMOTE端的命令说明;
REMOTEHELP相当于RHELP。

2)ASC(ASCll)、Bm(BmARY)、IMAGE、TYPE
ASCII切换传输模式为文字模式(只能用来传送DOC文件,因为是7-BIT);
BINARY切换传输模式为二进制模式(除文字文件外皆用此模式);
IMAGE相当于BINARY:
TYPE让你更改或显示目前传输模式。

3)BYE、QUIT
BYE退出FTP:
QUIT相当于BYE。

4)CD、CDUP、LCD、P~WD、 !
CD改变当前工作目录,例如:CD\PUB;
CDUP回到上一层目录,相当于你打CD..:
LCD让你更改或显示LOCAL端的工作目录,例如:LCD\TMP;
PWD显示目前的工作目录(REMOTE端):
!让你执行外壳命令,例如:!LS。

5)DELETE、MDELETE、RENAME
DELETE删除REMOTE端的文件:
MDELETE批量删除文件,需配合?或,*
RENAME更改REMOTE端的文件名。

6)GET、MGET、PUT、MPUT、RECV、SEND
GET下传文件;
MGET批量下传文件,需配合万用字元,例如:MGET*.GZ;
PUT上传文件;
MPUT批量上传文件,需配合万用字元;
RECV相当于GET(RECV为RECEWE的简写):
SEND相当于PUT。

7)HASH、PROMPT、VERBOSE、STATUS、BELL
HASH切换#字号的出现,每一个#字号表示传送了1024/8192BYTES:
PROMPT切换iNTERACTIVEON/OFF;
VERBOSE切换所有文件传输过程的显示;
STATUS显示目前的一些参数:
BELL当指令做完时会发出叫声。

8)LS、DIR、MLS、MDIR、MKDIR、RMDIR
LS有点象UNIX下的LS(LIST)命令:
DIR相当于LS-L(LIST-LONG);
MLS只是将远端某目录下的文件存于LOCAL端的某文件里;
MDIR相当于MLS;
MKDIR象DOS下的MD(创建子目录)一样:
RMDIR象DOS下的RD(删除子目录)一样。

9)OPEN、CLOSE、DISCONNECT、USER ·
OPEN连接某个远端FTP服务器;
CLOSE关闭目前的连接; DISCONNECT相当于CLOSE;
USER再输入一次用户名和口令(有点像UNIX下的SU)。

第二节FTP命令完全掌握
FTP命令是Intemet用户使用最频繁的命令之一,不论在DOS还在UNIX操作系统下使 用FTP,都会遇到大量的 FTP内部命令。熟悉并灵活应用FTP的内部命令,可以大大方便 使用者,并收到事半功倍之效。
FTP的命令行格式为:
FTP-v-d-i-n-g[主机名],其中:
—v——显示远程服务器的所有响应信息;
—n.------限制FTP的自动登录,即不使用; ,
n-----etRc文件:
-d——使用调试方式:
·g——取消全局文件名。

FTP使用的内部命令如下(中括号表示可选项):
1)[crud][args)1:在本地机中执行交互sh*ll ,exit回到FTP环境, 列如:!LS*.zip. 2)$macro-amc][args儿执行宏定义macro-name。
3)accountlpassword]:提供登录远程系统成功后访问系统资源所需的补充口令。
4)append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远系统文件名,则使用本地文件名。
5)aSCii:使用ascII型传输方式。
6)bell:每个命令执行完毕后计算机响铃—次
7)bin:使用二进制文件传输方式
8)bye..退出FTP会话过程—
9)case:在使用mget时,将远程主文件名中的大写字母转为小写字母
10)cdremote·dir:进入远程主机目录。
11)cdup..进入远程主机目录的父目录。
12)chmodmodefile-name:将远程主机文件file-name的存取方式设置为mode。
列如:chmod777a.OUt。
13)close:中断与远程服务器的FTP会话(与open对应)。
14)cr:使用aSSC“方式传输文件时,将回车换行转换为回行
15)deleteremote-file-删除远程主机文件:
16)debugldebug-value3:.设置调试方式,显示发送至远程主机的每条命令。
例如:debup3,若设为0,表示取消debug。
17)dir[remote-dir][Local-file]:显示远程主机目录,并将结果存入本地文件local-file:
18)disconnection-.同close。
19)formformat:将文件传输方式设置为format,缺省为file方式。
20)getremote-file[10cal-file]:将远程主机的文件remote-file传至本地硬盘的local-file。
21)glob:设置mdelete,mget,mput的文件名扩展,缺省时不扩展文件名,同命令行
的-g参数。
22)hash:每传输1024字节,显示一个hash符号(#)。
23)help[cmd]:显示FTP内部命令cmd的帮助信息,如.-helpget。
24)idle[seconds]:将远程服务器的休眠计时器设为[seconds]秒。
25)image:设置二进制传输方式(同binary)。
26)LCD[DIR]:将本地工作目录切换至dir。
27)LS[remote-DIR][LOCAL-FILE]:显示远程目录remote-dir,并存入本地文local-fileo
28)macdefmacro-name:定义一个宏,遇到macdef下的空行时,宏定义结束。
29)mdelete[remote-file]:删除远程主机文件。
30)mdirremote-fileslocal-file:与dlr类似,但可指定多个远程文件。 ·
列如mdir*.O.*.zipoutfiLe。
31)mgetremote-files:传输多个远程文件。
32)mkdirdirname:在远程主机中建一目录。
33)misremote-filelocal-file.同nlist,但可指定多个文件名。
34)mode[modename]:将文件传输方式设置为modename,缺省为stream方式。
35)modtimefile-name..显示远程主机文件的最后修改时间。 ·
36)mputlocal-file:将多个文件传输至远程主机,
37)newerfile-name: 如果远程机中file-name的修改时间比本地硬盘同名文件的时间巨近,则重新传输该文件。 ·
38)nlist正remote·di41local-file3:显示远程主机目录的文件清单,并存入本地硬盘的local-fileo
39)nmap[npattem outpattem]设置文件名映射机制,使得文件传输时,文件中的某些
字符相互转换,如:nmapSl.S2.S3[$1,$2][$2,$3],则传输文件a1.a2.a3时,文件名变为a1,
a20该命令特别适用于远程主机为非UNIX机的情况o
40)ntrans[Inchars][outchars]设置文件名字符的翻译机制,如ntranslR,则文件名LLI
将变为RRR。
41)openhost[port]:建立指定FTP服务器连接,可指定连接端口。
42)passive:进入被动传输方式。
43)prompt:设置多个文件传输时的交互提示。
44)proxy FTP-cmd:在次要控制连接中,执行一条FTP命令,该命令允许连接两个FTP服
务器,以在两个服务器间传输文件。第一条FTP命令必须为open,以首先建立两个服务器间的连接。
45)putlocal-file[remote-file]:将本地文件local-file传送至远程主机。
46)vwd:显示远程主机的当前工作目录。
47)qmt-.同bye,退出FTP会话。
48)quote argl,arg2。。。:将参数逐字发至远程卸服务器,如:quote, syst。
49)recvremote-file[Local-file):同get。
50)reget remote-file][Local-file]:类似于get,但若local-file存在,则从上次传输中断处继续传输。
51)rhelp[cmd-name]:请求获得远程主机的帮助。
52)rstatus[FILe-name]:若未指定文件名,则显示远程主机的状态,否则显示文件状态,
53)rename[FRom)[to]:更改远程主机文件名。
54)reset:清除回答队列。
55)restart marker:从指定的标志marker处,重新开始get或put,如:restartl30。
56)rmdirdir-name:删除远程主机目录。
57)mnique:设置文件名惟一性存储,若文件存在,则在原文件后加后缀.1,.2等
58)send local-file[remote-file):同put
59)sendport:设置PORT命令的使用。
60)siteargl,arg2。。。:将参数作为SITE命令逐字发送至远程卸主机。
61)sizefile-name:显示远程主机文件大小,如:Slteidle7200。
62)stares:。显示当前FTP状态。 ·
63)struct][struct-name]:将文件传输结构设置为struct-name,缺省时使用stream结构。
64)suniclue:将远程主机文件名存储设置为惟一(与mnique对应)。
65)system:显示远程主机的操作系统类型。
66)tenex:将文件:传输类型设置为TENEX机的所需的类型
67)tick:设置传输时的字节计数器
68)trace:设置包跟踪。
69)type[type-name):设置文件传输类型为type-name,缺省为ascii,
例如:typebinary,设置二进制传输方式。
70)umask][newmask):将远程服务器的缺省umask设置为newmask。 例如:umask 3。
71)user user-name ][passwordⅡaccount]:向远程主机表明自己的身份,需要口令时,必
须输入口令,如:useranonymousmy@emaiL
72)verbose:同命令行的-v参数,即设置详尽报告方式,FTP服务器的所有响应都将显
示给用户,缺省为on。
73)?[cmd]:同help


zjc4u 发表于:2005.10.11 20:12 ::分类: ( Unix和Informix ) ::阅读:(464次) :: Permanent link
===========================================================
SQL Server的Inner Join及Outer Join
===========================================================
在一个正规化的数据库环境中, 我们常会碰到这款情形: 所需的资料并不是放在同一个资料表中, 在这个时候, 你就要用到 Join
  当然 Join 如何将不同的数据库的资料结合, 还要看你如何使用它, 一共有四种不同的 Join 的方式, 在这篇文章中我们将为你介绍 Inner Join 及 Outer Join 以及其应用

  Inner Join
  Inner Join 应该是最常用的 Join 方式, 它只会传回符合 Join 规则的纪录, 还是先来看看语法
Select <要选择的字段> From <主要资料表> <次要资料表> [On ]
  现在我们利用 MS SQL 内建的北风数据库来实际练习一下! 想多了解 MS SQL 的内建数据库, 你可以看看 SQL Server 的内建数据库这篇文章
  请打开 QA (Query Analyzer), 为了使用北风数据库, 请先执行 Use Northwind, 然后执行
Select ProductId, ProductName, SupplierId From Products
  从 Products 产品资料表中取出三个字段, 分别是产品代码, 产品名称, 供货商代码, 但查询出来的结果保证让你的老板很不满意, 因为供货商代码对于人类实在是无什么意义, 这个时候 Join 就可以帮上忙了, 藉由 Join Suppliers 这个资料表我们便可以查询到供货商名称
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Inner Join Suppliers
Products.Suppliers = Suppliers.SupplierId
  这款的查询结果是不是清楚呢! Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉, 譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有出现在 Suppliers 资料表中, 那么这笔记录便会被排除掉

  Outer Join
  这款的 Join 方式是一般人比较少用到的, 甚至有些 SQL 的管理者也从未用过, 这真是一件悲哀的代志, 因为善用 Outer Join 是可以简化一些查询的工作的, 先来看看 Outer Join 的语法
Select <要查询的字段> From [Outer] Join On
  语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料, 接下来我们还是来做些实际操作, 仍然是使用北风数据库, 但要先做一些小小的修改, 才能达到我们要的结果
  首先要拿掉 Products 资料表的 Foreign Key, 否则没有法度在 Products 资料表新增一笔 SupplierId 没有对映到 Suppliers 资料表的纪录, 要知影一个资料表的 Constraint 你可以执行 SQL 内建的 sp_helpconstraint , 在 QA 执行
sp_helpconstraint Products
  接下来删除 FK_Products_Suppliers 这个 Foreign Key
Alter Table Products
Drop Constraint FK_Products_Suppliers
  再来新增一笔纪录于 Products 资料表, SupplierId 使用 50 是因为它并没有对映到 Suppliers 资料表中的记录
values ('Test Product','50','1')
  现在我们再执行头前的查询, 只是将 Inner Join 改为 Left Outer Join
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Left Outer Join Suppliers
Products.Suppliers = Suppliers.SupplierId
  比较一下两种 Join 方式的查询结果, 你应该就会知影其中的差别!
  再来看看 Right Outer Join, 请新增下底这笔记录
Insert Into Suppliers (CompanyName)
values ('LearnASP')
  现在请使用 Right Out Join 来作查询, 比较看看查询的结果和 Inner Join 有什么不同!
  寻找不相符纪录
  这里我们来看看如何使用 Out Join 来找不相符纪录, 可能是有子纪录却没有父纪录或是颠倒过来
Select Suppliers.CompanyName From Products
Right Join Suppliers
On Products.SupplierId = Suppliers.SupplierId
Where Products.SupplierId is Null
  执行结果你会找到一笔资料为 LearnASP, 该笔供货商资料存在, 但基本上已经没有产品是来自这个供货商, 想象一下如果不用 Outer Join 你要怎么以一个 SQL 指令完成同一查询结果! 知道 Outer Join 的好用了吧! 再执行
Select Products.ProductName
From Products
Left Join Suppliers
On Products.SupplierId = Suppliers.SupplierId
Where Suppliers.SupplierId is Null
  这个查询结果你会发现 Test Product 这项产品竟然找不到供货商的资料!
zjc4u 发表于:2005.09.24 15:25 ::分类: ( Unix和Informix ) ::阅读:(744次) :: Permanent link
自我介绍
切换风格
新闻聚合
博客日历
文章归档...
最新发表...
博客统计...
网站链接...