首先聲明,我使用的是Informix7.x版本,
1、不等于 :<>
2、判斷是否為空:is null
3、nvl函數
NVL(expr1,expr2):如果expr1是NULL,則返回expr2,否則返回expr1.返回值與expr1類型相同,除非expr1是字符串類,在這種情況下將返回VARCHAR2類型.這個函數用于確保查詢記錄集中不包含NULL值。
NVL(expr1,expr2,expr3) :如果expr1是NULL,則返回expr2,否則返回expr3.返回值與expr2類型相同,除非expr2是字符類型,在這種情況下返回VARCHAR2類型;
NULLIF(a,b) :如果a等于b返回NULL,如果不等于返回b。
4、substr()函數
substr(str,startindex,count);其他數據庫一般用substring(str,startindex,count);
5、string轉換成sql的date型:to_date('2006-12-25','%Y-%m-%d');
6、得到昨天的日期:today-1
7、查看sql的執行過程:
1)登錄:su - informix
2)建立SQL文件,里面放要執行的sql語句,同時在前面加一行,set explain on;sql 語句;
3)導入sql文件執行:isql -s databasename<filename
4)查看執行過程:cat sqexplain.out
8、使用臨時表:
into temp tablename with no log ;最好加上with no log;
9、建立存儲過程:
1)文件命名為zeng.sql
drop procedure zeng;
create procedure zeng(deptstr varchar(20),time1 char(10),time2 char(10))
returning decimal(14,2);
define mysum decimal(14,2);
select a.ownid,a.masterid,c.sendsum from distribute a,order_bankbill b,bankbill c where a.orderid=b.orderid and b.bankbillid=c.id and a.deptno=deptstr and c.sendtime >=time1 and c.sendtime <=time2 into temp mytemp with no log ;
select nvl(sum(sendsum),0) into mysum from mytemp where ownid=masterid;
return mysum WITH RESUME;
end procedure
2)導入到數據庫:
dbaccess databasename zengchao.sql
3)進入數據庫,執行
dbaccess databasename
……
execute procedure zeng ('00xm010101','2006-03-01','2006-03-25');
10、update的一種用法
update distribute set (masterid,mastername)=
((select nvl(groupmanager,0),nvl(groupmanagername,'') from department where distribute.deptno=department.departmentno ))
where opertime>='2007-02-11';//注意后面不要漏掉一層括號
11、unique與distinct的區別:
unique是distinct的同義詞,功能完全相同。distinct是標準語法,其他數據庫 sql server,db2,oracle,sybase,mysql等都支持。unique,informix數據庫認識,其他數據庫有的認識,有的不認識。
12、Case語句用法:
select name,case when id=9188 then 'ttt' else name end from employee where departmentno ='00xm';
13、使用優化器(update statistics):
優化使系統表的信息與實際一致,使搜索樹的路徑最優。同時,整理索引樹。例:
1. update statistics for table
2. update statistics for procedure
3. update statistics for table rta1(bm_cert)
4. update statistics high for table rta1(bm_cert) resolution 0.5
14、連接字符串(||):
select id ||':'|| name from employee
15、JDBC事務與游標
注意要先關閉ResultSet然后提交事務;
16、informix備份表數據(isql)
1)導出:unload to "zengchao.data" select * from position;
2)導入:load from "zengchao.data" insert into position;
17、關于like與[]
select count(*) from employee where departmentno like '00xm01%';
select count(*) from employee where departmentno[1,6]='00xm01';
這兩條語句,執行差不多,但是估計成本是第二個比第一個好
18、informix下更改表名
update systables set tabname='oldredeploy' where tabname='redeploy';
19、count(name)與count(*)區別
如果name列有null值,那么如下兩條語句得到的返回值不等
select count(*) from tablename
select count(name) from tablename
20、鎖表的解決方法(轉)
1、找到被鎖表的partnum:select hex(partnum) from systables where tabname = ”tabalname”;
2、onstat -k|grep partnum 找到該鎖的owner;
3、onstat -u | grep owner 找到用戶會話session號;
4、onmode -z sesid 殺掉該session;
5、如果第4步失敗,則進一步onstat -g ses | grep sesid 找到該發起該會話的pid;
6、kill pid 或 kill -9 pid;
7、特殊情況:在第2步中,如果發現鎖的owner為0,則檢查:
onstat -x
onstat -G
看是否存在全局事務,若有全局事務,則繼續以下步驟:select hex(tx_addr) trans_addr,hex(tx_lklist) lock_addr from systrans where hex(tx_addr) like '%c000000007674c58%';需要說明的是,c000000007674c58是使用onstat -x 或 onstat -G得到的全局事務的地址。上面SQL語句提供出該全局事務對應的鎖地址,這時如果得到的鎖地址與鎖表的鎖地址相同的話,你就必需從應用端(通常是三層結構的中間件)發命令讓該全局事務回滾或提交,否則該鎖會被一直持有,直到你執行oninit -i。
21、從數據庫的數據導成Excel格式
方法一:
1)導成csv文件:isql -s databasename unload to data.csv select * from tablename;
2)轉換成Excel:用Excel中的“數據”->“導入外部數據”->“導入文本文件”,選擇分隔符為'|';
方法二:
用Excel中的“數據”->“導入外部數據”->“新建數據庫查詢”,然后配置數據源
22、配置Informix-CLI
1、配置Informix-Setnet32

上面的czzymis修改為online_web

2)配置Odbc-Administrator
a)新建一用戶DNS

b)配置DNS

c)高級屬性
23、系統表(syscolumns)中字段類型(coltype)字段的含義
coltype定義在informix/incl/esql/sqltypes.h文件中,如下圖

注意:如果,某字段要求非空,則在原類型上加256。例如,SERIAL對應的是6,SERIAL not NULL類型對應的是(6+256)=262。
24、常用函數(來自網絡)
聚集函數:
avg,求平均值
count,統計記錄的條數
max,求最大值
min,求最小值
range,計算所選行的最大值與最小值的差
stdev,計算所選行的標準偏差
sum,求和函數
variance,函數返回值樣本的方差做為所有選擇行的方差的無偏估計。公式,(sum(xi**2)-sum(xi)**2)/N)/(N-1),其中xi是列中的每個值,N是列中值的總和。

時間函數:
day,mdy,month,weekday,year 這些函數返回與用來調用函數的表達式或自身變量的值。Current返回當前的日期和時間值,可以用extend函數來調整date或datetime值的精度。使用day和current 函數來將列值與當前日期進行比較。
date函數將字符串函數轉換為DATE值。例date(‘12/7/04’)
to_char函數將datetime和date值轉化為字符值。
to_date函數將字符值轉化為datetime類型的值。例to_date(“1978-10-07 10:00” ,”%Y-%m-%d %H:%M)

基數函數:
cardinality(僅適用IDS)函數對集合包含的元素數目計數。

智能大對象函數(僅適用與IDS):
filetoblob( ),將文件復制到BLOB列中
filetoclob( ),將文件復制到CLOB列中
locopy( ),將BLOB或CLOB類型的數據復制到另一個BLOB或CLOB列中
lotofile( ),將BLOB或CLOB復制到文件中

字符串處理函數:
lower,將字符串中每個大寫字母轉換為小寫字母
upper,將字符串中每個小寫字母轉換為大寫字母
initcap,將字符串中每個詞的首寫字母轉換成大寫
replace,將字符串中的某一組字符轉換成其他字符,例replace(col,'abc','')
substr,返回字符串中的某一部分,例substr(col,1,2)
substring,返回字符串中的某一部分,例substring(col,from 1 to 4)

其他函數:
hex,返回表達式的十六進制數
round,返回表達式的四舍五入值
trunc,返回表達式的截斷值
length,計算表達式的長度
user,返回執行查詢的用戶的用戶名(登陸帳戶名)
today,返回當前系統日期
dbservername,返回數據庫服務器的名稱,同sitename
dbinfo,返回數據庫的相關信息
decode,函數來將一個具有一個值的表達式轉換為另一個值
decode(test,a,a_value,b,b_value,c,c_value……),decode函數不支持TEXT和BYTE類型。
nvl,來將求值為空的表達式轉化為另一個想要指定的值。
25、修改/添加表的列的屬性
例如:alter table student modify studentno integer not null;
alter table student add sex char(1) not null;
26、導出數據庫的表結構
導出特定的某個表:dbschema -t tabname -d databasename tarfilename
導出整個數據的所以表:dbschema -d databasename tarfilename
posted on 2007-09-05 15:29
破繭而出 閱讀(1767)
評論(0) 編輯 收藏 所屬分類:
數據庫