亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 83476 | 回復(fù): 92
打印 上一主題 下一主題

informix SQL匯總 [復(fù)制鏈接]

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2003-05-29 20:07 |只看該作者 |倒序?yàn)g覽
每個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)都有其自己的數(shù)據(jù)處理語(yǔ)言(DML),但所有DML都基于一種語(yǔ)言SQL語(yǔ)言——結(jié)構(gòu)化查詢語(yǔ)言(SQL),其發(fā)音為“sequel”或“S-Q-L”。

  目前SQL的前身是E.F.Codd博士70年代發(fā)明的。第一個(gè)實(shí)現(xiàn)是在76年,稱為sequel。而SQL首先被采用是在IBM的System R項(xiàng)目中。86年10月由ANSI確定為正式的關(guān)系查詢語(yǔ)言標(biāo)準(zhǔn)。ISO在對(duì)其修改后在90年制定為國(guó)際工業(yè)標(biāo)準(zhǔn)。

  無(wú)論進(jìn)行何種數(shù)據(jù)庫(kù)學(xué)習(xí),SQL語(yǔ)言都是必學(xué)內(nèi)容。在我國(guó)數(shù)據(jù)庫(kù)語(yǔ)言SQL標(biāo)準(zhǔn)(GB12991)中規(guī)定了兩個(gè)數(shù)據(jù)庫(kù)語(yǔ)言的語(yǔ)法與語(yǔ)義:


模式定義語(yǔ)言(SQL-DDL),描述SQL數(shù)據(jù)庫(kù)的結(jié)構(gòu)與完整性的約束;


數(shù)據(jù)操縱語(yǔ)言(SQL-DML),描述操作數(shù)據(jù)庫(kù)的執(zhí)行語(yǔ)句
  在本文章中涉及以上兩個(gè)中的主要部分,(為敘述方便,以下對(duì)其統(tǒng)稱為SQL),由于SQL在嵌入C時(shí)表現(xiàn)略有不同,所以下面均以非嵌入時(shí)的SQL進(jìn)行。另外本文章也不是SQL的入門教材,閱讀者應(yīng)學(xué)習(xí)并實(shí)際用SQL操作過某種數(shù)據(jù)庫(kù)。

  如果你系統(tǒng)學(xué)習(xí)過數(shù)據(jù)庫(kù)理論,又能熟練操作INFORMIX關(guān)系數(shù)據(jù)庫(kù),甚至從事過有關(guān)數(shù)據(jù)庫(kù)程序的設(shè)計(jì),還那么作者在此恭喜你了。如果你尚未系統(tǒng)學(xué)習(xí)過數(shù)據(jù)庫(kù)理論,并對(duì)INFORMIX數(shù)據(jù)庫(kù)了解甚少,建議你先閱讀有關(guān)的文檔。

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
2 [報(bào)告]
發(fā)表于 2003-05-29 20:07 |只看該作者

informix SQL匯總

【主要SQL語(yǔ)句詳解】

CREATE DATABASE database_name [WITH LOG IN “pathname”]


創(chuàng)建數(shù)據(jù)庫(kù)。

database_name:數(shù)據(jù)庫(kù)名稱。

“pathname”:事務(wù)處理日志文件。

創(chuàng)建一database_name.dbs目錄,存取權(quán)限由GRANT設(shè)定,無(wú)日志文件就不能使用

BEGIN WORK等事務(wù)語(yǔ)句(可用START DATABASE語(yǔ)句來(lái)改變)。

可選定當(dāng)前數(shù)據(jù)庫(kù)的日志文件。

如:select dirpath form systables where tabtype = “L”;

例:create databse customerdb with log in “/usr/john/log/customer.log”;



DATABASE databse-name [EXCLUSIVE]

選擇數(shù)據(jù)庫(kù)。

database_name:數(shù)據(jù)庫(kù)名稱。

EXCLUSIVE:獨(dú)占狀態(tài)。

存取當(dāng)前目錄和DBPATH中指定的目錄下的數(shù)據(jù)庫(kù),事務(wù)中處理過程中不要使用此語(yǔ)句。

例:dtabase customerdb;



CLOSE DATABASE


關(guān)閉當(dāng)前數(shù)據(jù)庫(kù)。

database_name:數(shù)據(jù)庫(kù)名稱。

此語(yǔ)句之后,只有下列語(yǔ)句合法:

CREATE DATABASE; DATABASE; DROP DATABSE; ROLLFORWARD DATABASE;

刪除數(shù)據(jù)庫(kù)前必須使用此語(yǔ)句。

例:close database;



DROP DATABASE database_name


刪除指定數(shù)據(jù)庫(kù)。

database_name:數(shù)據(jù)庫(kù)名稱。 用戶是DBA或所有表的擁有者;刪除所有文件,但不包括數(shù)據(jù)庫(kù)目錄;不允許刪除當(dāng)前數(shù)據(jù)庫(kù)(須先關(guān)閉當(dāng)前數(shù)據(jù)庫(kù));事務(wù)中處理過程中不能使用此語(yǔ)句,通過ROLLBACK WORK 也不可將數(shù)據(jù)庫(kù)恢復(fù)。

例:drop databse customerdb;



CREATE [TEMP] TABLE table-name (column_name datatype [NOT NULL], …)


[IN “pathname”]

創(chuàng)建表或臨時(shí)表。

table-name :表名稱。

column_name:字段名稱。

data-type:字段數(shù)據(jù)類型。

path-name:指定表的存放位置

TEMP用于指定建立臨時(shí)表;表名要唯一,字段要唯一;有CONNECT權(quán)限的用戶可建立臨時(shí)表;創(chuàng)建的表缺省允許CONNECT用戶存取,但不可以ALTER。

例:create table user

( c0 serial not null, c1 char (10),

c2 char(2),

c3 smallint,

c4 decimal(6,3),

c5 date

) in “usr/john/customer.dbs/user;



ALTER TABLE


ALTER TABLE table-name

{ADD (newcol_name newcol_type [BEFORE oldcol_name], …) | DROP (oldcol_name, …)

| MODIFY (oldcol_name newcol_type [NOT NULL], … )}, …

修改表結(jié)構(gòu)。

table-name:表名稱。

newcol_name:新字段名稱

newcol_type:新字段類型

oldcol_name:老字段名稱

可以使用單個(gè)或多個(gè)ADD子句、DROP子句、MODIFY子句,但某個(gè)字句失敗,操作即中止;原字段是NULL,不允許MODIFY為NOT NULL,除非所有NULL字段中均非空,反之可以;ALTER使用者是表的擁有者或擁有DBA權(quán)限,或被授權(quán);事務(wù)中處理過程中不要使用此語(yǔ)句。

例:alter table user

add ( c6 char(20) before c5);



RENAME TABLE oldname TO newname


修改表名。

oldname:原名稱。

newname:新名稱。

RENAME使用者是表的擁有者或擁有DBA權(quán)限,或被授權(quán);事務(wù)中處理過程中不要使用此語(yǔ)句。 例:rename user to bbb;



DROP TABLE table-name


刪除表。

table-name:表名稱。

刪除表意味著刪除其中所有數(shù)據(jù)、各字段上的索引及對(duì)表的賦權(quán)、視圖等;用戶不能刪除任何系統(tǒng)目錄表;語(yǔ)句使用者是表?yè)碛姓呋驌碛蠨BA權(quán)限,事務(wù)中處理過程中不要使用此語(yǔ)句。



RENAME COLUMN table.oldcolumn, TO newcolumn


修改字段名。

table.oldcolumn:表名及原字段名稱

newcolumn:新字段名稱。

語(yǔ)句使用者是表的擁有者或擁有DBA權(quán)限或有ALTER權(quán)限的用戶,事務(wù)中處理過程中不要使用此語(yǔ)句。

例:rename column user.c6 to c7;



CREATE VIEW view-name column-list


CREATE VIEW view-name column-list AS select_statement [WITH CHECK OPTION]

創(chuàng)建視圖。

view-name:視圖名稱。

column-list:字段列表。

select_statement:SELECT語(yǔ)句。

以下語(yǔ)句不使用視圖:ALTER TABLE,DROP INDEX,ALTER INDEX,LOCK TABLE,CREATE INDEX, RENAME TABLE;視圖將延用基表的字段名,對(duì)表達(dá)式等虛字段和多表間字段重名必須指明標(biāo)識(shí)其字段名;若對(duì)視圖中某些字段命名,則所有字段都必須命名;視圖中數(shù)據(jù)類型延用基表中的數(shù)據(jù)類型,虛字段起訣于表達(dá)式;不能使用ORDER BY和UNION子句;對(duì)視圖中所有的字段要有SELECT權(quán)限;事務(wù)中處理過程中使用此語(yǔ)句,即使事務(wù)回滾,視圖也將建立,不能恢復(fù)。

例:create view v_user as select * from user where c1 = “B1”;



DROP VIEW view-name


刪除視圖。

view-name:視圖名稱。

用戶可刪除自己建立的視圖;視圖的后代視圖也被刪除;事務(wù)中處理中不要使用此語(yǔ)句。

例:drop view v_user;



CREATE INDEX


CREATE [UNIQUE/DISTINCT] [CLUSTER] INDEX index_name ON table_name

([column_name ASC/DESC],…)

創(chuàng)建索引。

index_name:索引名稱。

table_name:表名稱。

column_name:字段名稱。

UNIQUE/DISTINCT:唯一索引。

CLUSTER:使表的物理存放順序按索引排列。

ASC/DESC:升序或降序,缺省升序。

語(yǔ)句執(zhí)行時(shí),將表的狀態(tài)置為EXCLUSIVE;復(fù)合索引最多包含8個(gè)字段,所有字段長(zhǎng)度和不得大于120字節(jié);事務(wù)中處理過程中使用此語(yǔ)句,即使事務(wù)回滾,索引將建立,不能恢復(fù)。

例:create cluster index ix_user on user(c5);



ALTER INDEX index-name TO [NOT] CLUSTER


修改索引性質(zhì)。

index-name:索引名稱。

TO [NOT] CLUSTER:去掉或加上CLUSTER屬性。

語(yǔ)句執(zhí)行時(shí),將表的狀態(tài)置為EXCLUSIVE;事務(wù)中處理過程中使用此語(yǔ)句,即使事務(wù)回滾,索引性質(zhì)將改變,不能恢復(fù)。

例:alter index ix_user to not cluster;



DROP INDEX index-name


刪除索引。

index-name:索引名稱。

語(yǔ)句使用者是索引的擁有者或擁有DBA權(quán)限,事務(wù)中處理過程中不要使用此語(yǔ)句,否則事務(wù)無(wú)法恢復(fù)。

例:drop index ix_user;



CREATE SYNONYM synonym FOR table-name


創(chuàng)建同義名。

synonym:同義名

table-name:表名稱

數(shù)據(jù)庫(kù)的創(chuàng)建者可以使用同義名;沒有賦予同義名權(quán)限的用戶不能使用同義名;同義名不能和表名相同;事務(wù)中處理過程中不要使用此語(yǔ)句。

例:create synonym user_alias for user;



DROP SYNONYM synonym


刪除同義名。

synonym:同義名

可以刪除自己建立的同義名;事務(wù)中處理過程中不要使用此語(yǔ)句,否則無(wú)法恢復(fù)。

例:drop synonym user_alias;



UPDATE STATISTICS [FOR TABLE table-name]


更新數(shù)據(jù)庫(kù)的統(tǒng)計(jì)數(shù)字。

table-name:表名稱

此語(yǔ)句僅作用于當(dāng)前數(shù)據(jù)庫(kù);可提高查詢效率;只有執(zhí)行此語(yǔ)句,才改變統(tǒng)計(jì)數(shù)據(jù)。

例:update statistics for table user;

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
3 [報(bào)告]
發(fā)表于 2003-05-29 20:08 |只看該作者

informix SQL匯總

【續(xù)】
GRANT {DBA|RESOURCE|CONNECT} TO {PUBLIC|user-list}
授權(quán)命令。

PUBLIC|user-list:全部或指定的用戶。

三種權(quán)限居且僅居其一,事務(wù)處理過程中不要執(zhí)行GRANT語(yǔ)句。

例:grant resource to pulbic;

GRANT tab-privilege ON table-name TO {PUBLIC|user-list} [WITH GRANT OPTION]


授表級(jí)權(quán)限。

tab-privilege:表級(jí)權(quán)限。

table-name:表名稱。

PUBLIC|user-list:全部或指定的用戶。

[WITH GRANT OPTION]:表示被授權(quán)用戶有否權(quán)限進(jìn)行二次授權(quán)。

用戶可以在自己建立表達(dá)式或被[WITH GRANT OPTION]準(zhǔn)許的表中進(jìn)行賦權(quán);限定越多的權(quán)限優(yōu)先級(jí)越高。

例:grant update(c1,c6) on user to dick with grant option;


附(INFORMIX的權(quán)限)

(1) 數(shù)據(jù)庫(kù)的權(quán)限(控制對(duì)數(shù)據(jù)庫(kù)的訪問以及數(shù)據(jù)庫(kù)中表的創(chuàng)建和刪除)


DBA權(quán)限:全部權(quán)利,修改系統(tǒng)表,建立和刪除表與索引、增加和恢復(fù)表數(shù)據(jù),以及授予其他用戶數(shù)據(jù)庫(kù)權(quán)限等;

RESOURCE權(quán)限:允許對(duì)數(shù)據(jù)庫(kù)表中的數(shù)據(jù)進(jìn)行存取,建立永久性表以及索引。

CONNECT權(quán)限:只允許對(duì)數(shù)據(jù)庫(kù)表中的數(shù)據(jù)進(jìn)行存取,建立和刪除視圖與臨時(shí)表。

(2)表級(jí)權(quán)限(對(duì)表的建立、修改、檢索和更新等權(quán)限)


ALTER:更改權(quán)限

DELETE:刪除權(quán)限

INDEX:索引權(quán)限

INSERT:插入權(quán)限

SELECT [(cols)]:指定字段或所有字段上的查詢權(quán)限,不指明字段缺省為所有字段。

UPDATE [(cols)] :指定字段或所有字段上的更新權(quán)限,不指明字段缺省為所有字段。

ALL [PRIVILEGES]:以上所有表級(jí)權(quán)限



REVOKE {DBA|RESOURCE|CONNECT} FROM {PUBLIC|user-list}

收權(quán)命令。

PUBLIC|user-list:全部或指定的用戶。

三種權(quán)限居且僅居其一,事務(wù)處理過程中不要執(zhí)行GRANT語(yǔ)句。

例:revoke resource from john;

REVOKE tab-privilege ON table-name FROM {PUBLIC|user-list}


收表級(jí)權(quán)限。

tab-privilege:表級(jí)權(quán)限。

table-name:表名稱。

PUBLIC|user-list:全部或指定的用戶。

[WITH GRANT OPTION]:表示被授權(quán)用戶有否權(quán)限進(jìn)行二次授權(quán)。

用戶只能取消由其本人賦予其他用戶的表級(jí)存取權(quán)限;不能取消自己的權(quán)限,對(duì)SELECT和UPDATE作取消時(shí),將取消所有表中字段的SELECT 和UPDATE權(quán)限。

例;revoke update on user from dick;



LOCK TABLE table-name IN {SHARE|EXCLUSIVE} MODE

記錄級(jí)加鎖和表級(jí)加鎖或文件加鎖。

table-name:表名稱。

SHARE:允許讀表中數(shù)據(jù),但不允許作任何修改

EXCLUSIVE:禁止其他任何形式訪問表

每次只能對(duì)表瑣定一次;事務(wù)處理過程中,BEGIN WORK后立即執(zhí)行LOCK TABLE以取代記錄級(jí)加鎖,COMMIT WORK和ROLLBACK WORK語(yǔ)句取消所有對(duì)表的加鎖;若沒有事務(wù)處理,鎖將保持到用戶退出或執(zhí)行UNLOCK為止。

例:lock table user in exclusive mode;



UNLOCK TABLE table-name

取消記錄級(jí)加鎖和表級(jí)加鎖或文件加鎖。

table-name:表名稱。

例:unlock user;



SET LOCK MODE TO [NOT] WAIT

改變鎖定狀態(tài)。

TO [NOT]:等待解鎖,有可能被死鎖或不等待并提示錯(cuò)誤信息,表示此記錄被鎖,缺省值。

訪問一個(gè)EXCLUSIVE狀態(tài)下的記錄,將返回一個(gè)錯(cuò)誤。



START DATABSE db_name [WITH LOG IN “pathname”]

啟動(dòng)事務(wù)處理。

“pathname”:事務(wù)處理日志文件。

執(zhí)行該語(yǔ)句前,需要先關(guān)閉當(dāng)前數(shù)據(jù)庫(kù)。

例;clost database;

start databse customer with log in “/usr/john/log/customer.log”;



BEGIN WORK

開始事務(wù)。例:begin work;



COMMIT WORK

提交(正常結(jié)束)事務(wù)。例:commit work;



ROLLBACK WORK

回滾(非正常結(jié)束)事務(wù)。例:rollback work;



SELECT

SELECT select_list FROM tab_name|view_name

WHERE condition

GROUP BY column_name

HAVING condition

ORDER BY column_list

INTO TEMP table_name

查詢語(yǔ)句。

select_list:選擇表或*

tab_name:表名稱

view_name:視圖名稱。

condition:查詢條件,可使用BETWEEN、IN、LIKE、IS NULL、LIKE、MATCHES、NOT、

AND、OR、=、!=或<>;、>;、 >;= 、<=、<、ALL、ANY、SOME

column_name:分組字段名稱

condition:群聚條件

column_list:排序字段列表,缺省ASC,可指定DSC;排序時(shí),NULL值小于非零值。

table_name:臨時(shí)表名稱

例:略

附(常用函數(shù))

(1)集合函數(shù):

count(*)、

sum(數(shù)據(jù)項(xiàng)/表達(dá)式)、avg(數(shù)據(jù)項(xiàng)/表達(dá)式)、max(數(shù)據(jù)項(xiàng)/表達(dá)式)、min(數(shù)據(jù)項(xiàng)/表達(dá)式)

count(distinct 數(shù)據(jù)項(xiàng)/表達(dá)式)、sum(distinct數(shù)據(jù)項(xiàng)/表達(dá)式)、avg(distinct數(shù)據(jù)項(xiàng)/表達(dá)式)

(2)代數(shù)函數(shù)和三角函數(shù)

HEX(數(shù)據(jù)項(xiàng)/表達(dá)式)、ROUND(數(shù)據(jù)項(xiàng)/表達(dá)式)、TRUNC(數(shù)據(jù)項(xiàng)/表達(dá)式)、

TAN(數(shù)據(jù)項(xiàng)/表達(dá)式)、ABS(數(shù)據(jù)項(xiàng)/表達(dá)式)、MOD(被除數(shù),除數(shù))

(3)統(tǒng)計(jì)函數(shù)

標(biāo)準(zhǔn)差,stdev()、方差,variance()、范圍,rang()

(4)時(shí)間函數(shù)

DAY(日期/時(shí)間表達(dá)式):返回?cái)?shù)字型

MONTH(日期/時(shí)間表達(dá)式):返回整數(shù)

WEEKDAY(日期/時(shí)間表達(dá)式):0&#0;&#0;6,0星期天,1星期一;返回整數(shù)

YEAR(日期/時(shí)間表達(dá)式)、返回整數(shù)

DATE(非日期表達(dá)式):返回日期型

EXTEND(日期/時(shí)間表達(dá)式,[第一個(gè)至最后一個(gè)]):返回指定的整數(shù)

MDY(月,日,年):返回日期型

CURRENT:返回日期型

(5)時(shí)間函數(shù)

ROUND(),四舍五入。如:ROUND(10.95,position)position進(jìn)行四舍五入的前一位置

TRUNC(),截取。如:TRUNC(10.95,0)position截取的位置

INFORMIX臨時(shí)表在下列情況下自動(dòng)取消:

A.退出數(shù)據(jù)庫(kù)訪問工具(如DBACCESS)

B.SQL通話結(jié)束(DISCONNECT)

C.發(fā)出取消表語(yǔ)句

D.退出程序時(shí)


INSERT
INSERT INTO view_name|table_name [(column_list)] VALUES (value_list)

或 INSERT INTO view_name|table_name [(column_list)] select_statement

插入數(shù)據(jù)

view_name|table_name:視圖名或表名稱

column_list:數(shù)據(jù)項(xiàng)列表。

value_list:值列表

select_statement:查詢語(yǔ)句。

例:略


DELETE FROM view_name|table_name WHERE search-conditions
刪除語(yǔ)句。

view_name|table_name:視圖名或表名稱

search-conditions;刪除條件

例:略


UPDATE
UPDATE view_name|table_name SET column_1 = value_1ist WHERE search_conditions

或UPDATE view_name|table_name SET column_1|* = value_1ist WHERE search_conditions

更新數(shù)據(jù)語(yǔ)句。

view_name|table_name:表名稱或視圖表名稱

value_1ist:字段值

search_conditions:更新數(shù)據(jù)的條件

例:略


CHECK TABLE table-name
檢查索引語(yǔ)句。

語(yǔ)句使用者是表的擁有者或擁有DBA權(quán)限;不能對(duì)systable使用此語(yǔ)句。

例:略


REPAIR TABLE table-name
修復(fù)索引。

語(yǔ)句使用者是表的擁有者或擁有DBA權(quán)限;不能對(duì)systable使用此語(yǔ)句。

例:略


LOAD FROM “file-name” INSERT INTO table_name [(column_name[,…])]
將文本數(shù)據(jù)栽入表中。

例:load form “aa.txt” insert into user;


UNLOAD TO “pathname”
將表中數(shù)據(jù)卸為文本。

例:unload to “aa.txt” select * from user;


INFO
系統(tǒng)信息查詢。

INFO TABLES:得到當(dāng)前數(shù)據(jù)庫(kù)上表的名字。

INFO columns FOR table_name:指定表上的字段信息。

INFO INDEXES FOR table_name:指定表上的索引信息。

INFO [ACCESS|PRIVILEGES] FOR table_name:指定表上的存取權(quán)限。

INFO STATUS FOR table_name:指定表的狀態(tài)信息。


例: info tables;

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
4 [報(bào)告]
發(fā)表于 2003-05-29 20:08 |只看該作者

informix SQL匯總

【續(xù)】

1.select 語(yǔ)句中使用sort,或join

如果你有排序和連接操作,你可以先select數(shù)據(jù)到一個(gè)臨時(shí)表中,然后再對(duì)臨時(shí)表進(jìn)行處理。因?yàn)榕R時(shí)表是建立在內(nèi)存中,所以比建立在磁盤上表操作要快的多。

如:

SELECT time_records.*, case_name

FROM time_records, OUTER cases

WHERE time_records.client = "AA1000"

AND time_records.case_no = cases.case_no

ORDER BY time_records.case_no


這個(gè)語(yǔ)句返回34個(gè)經(jīng)過排序的記錄,花費(fèi)了5分鐘42秒。而:

SELECT time_records.*, case_name

FROM time_records, OUTER cases

WHERE time_records.client = "AA1000"

AND time_records.case_no = cases.case_no

INTO temp foo;

SELECT * from foo ORDER BY case_no

返回34條記錄,只花費(fèi)了59秒。


2.使用not in 或者not exists 語(yǔ)句

下面的語(yǔ)句看上去沒有任何問題,但是可能執(zhí)行的非常慢:

SELECT code FROM table1

WHERE code NOT IN ( SELECT code FROM table2 )


如果使用下面的方法:

SELECT code, 0 flag

FROM table1

INTO TEMP tflag;

然后:

UPDATE tflag SET flag = 1

WHERE code IN ( SELECT code

FROM table2

WHERE tflag.code = table2.code );

然后:

SELECT * FROM

tflag

WHERE flag = 0;

看上去也許要花費(fèi)更長(zhǎng)的時(shí)間,但是你會(huì)發(fā)現(xiàn)不是這樣。

事實(shí)上這種方式效率更快。有可能第一種方法也會(huì)很快,那是在對(duì)相關(guān)的每個(gè)字段都建立了索引的情況下,但是那顯然不是一個(gè)好的注意。


3.避免使用過多的“or"

如果有可能的話,盡量避免過多地使用or:

WHERE a = "B" OR a = "C"

要比

WHERE a IN ("B","C"

慢。

有時(shí)甚至UNION會(huì)比OR要快。


4.使用索引。

在所有的join和order by 的字段上建立索引。
在where中的大多數(shù)字段建立索引。
WHERE datecol >;= "this/date" AND datecol <= "that/date"
要比
WHERE datecol BETWEEN "this/date" AND "that/date" 慢


如何在shell腳本中使用一個(gè)sql查詢的結(jié)果?

以下的是一個(gè)運(yùn)行在sh/ksh下面的腳本。在online中,如果你想要更新一個(gè)有許多表的數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息。這個(gè)腳本不太好。因?yàn)檫@個(gè)腳本只能單個(gè)處理數(shù)據(jù)庫(kù)中的表,而不能同時(shí)處理大量的表。

例子:

# update_em

# Run UPDATE STATISTICS on a table by table basis

#

DATABASE=$1

if [ -z "$DATABASE" ]

then

echo "usage: update_em dbname" >;&2

exit 1

fi

isql $DATABASE - < dev/null | isql $DATABASE -

output to pipe "cat" without headings

select "update statistics for table ", tabname, ";"

from systables where tabid >;= 100 order by tabname;

EOF

exit 0


也許你已經(jīng)注意到exit的返回值對(duì)不同的isql不是都相同,因此這樣作不是很可靠,代替通過$?來(lái)檢查返回值的更好的主意是將標(biāo)準(zhǔn)錯(cuò)誤重定向到一個(gè)文件中,然后在這個(gè)文件中g(shù)rep “error"。例如:

# Generate the data

isql -qr <<!>;stage.rep 2>;$stage.err

database $database;

select ...

!

# Check for errors

if grep -i "error" $stage.err >;/dev/null

then

...error_handler...

fi


為什么不能對(duì)一個(gè)計(jì)算產(chǎn)生的字段創(chuàng)建視圖?

問題:為什么我不能創(chuàng)建視圖:

CREATE VIEW tst AS

SELECT ship_charge - totval cout

FROM orders WHERE ship_charge >; 0;

回答:你應(yīng)該這樣寫:

CREATE VIEW tst (cout) AS

SELECT ship_charge - totval

FROM orders WHERE ship_charge >; 0;


如何只select 出數(shù)據(jù)庫(kù)中的部分?jǐn)?shù)據(jù)(例如10%)。

問題:如果你想要得到一個(gè)select 語(yǔ)句正常返回的數(shù)據(jù)的一部分,例如:

SELECT firstname, lastname, city, state

FROM bigdatabase

WHERE state = "TX"

回答:

有一個(gè)方法可以返回一個(gè)近似值,只需要在where后加上:

AND rowid=(trunc(rowid/x)*x)

其中的x代表你想要返回的總的記錄的1/x。需要說明的是,這種方法只能返回一個(gè)近似的值,并且表中的數(shù)據(jù)在物理上分布的連續(xù)性。


如何創(chuàng)建一個(gè)表結(jié)構(gòu)和永久表完全一致的臨時(shí)表。 例如:CREATE TEMP TABLE mytemp (prodno LIKE product.prodno

desc LIKE product.desc)

你可以使用如下的語(yǔ)句:

SELECT prodno, desc FROM product

WHERE ROWID = -1

INSERT INTO TEMP mytemp

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
5 [報(bào)告]
發(fā)表于 2003-05-29 20:09 |只看該作者

informix SQL匯總

【續(xù)】

如何更改serial類型下一次插入操作產(chǎn)生的值?

我們知道serial類型的字段是系統(tǒng)自動(dòng)增加的整數(shù)字段,那么怎樣能控制下一個(gè)serial類型字段的值。

想要下一個(gè)插入的serial類型的值比默認(rèn)值大,可以用:

ALTER TABLE tabname MODIFY( ser_col_name SERIAL([new_start_number])

想要下一個(gè)插入的serial類型的值比默認(rèn)的值要小,首先需要將serial類型重新置為1:

INSERT INTO table (serial_column) VALUES (2147483647);

INSERT INTO table (serial_column) VALUES (0); -- 重新從1開始!

....然后執(zhí)行ALTER TABLE(就像上面的做法一樣)。


如何在發(fā)生錯(cuò)誤的時(shí)候終止sql腳本的執(zhí)行?

如果你創(chuàng)建了一個(gè)sql腳本,并且在UNIX命令行中使用以下的方式來(lái)執(zhí)行這個(gè)腳本:

$ dbaccess <database>; <腳本文件名>;

這時(shí),腳本中的所有的sql語(yǔ)句都會(huì)被執(zhí)行,即使其中的一個(gè)sql語(yǔ)句發(fā)生了錯(cuò)誤。例如,如果你腳本中為如下的語(yǔ)句:

BEGIN WORK;

INSERT INTO history

SELECT *

FROM current

WHERE month = 11;

DELETE FROM current

WHERE month = 11;

COMMIT WORK;

如果INSERT語(yǔ)句失敗了,DELETE語(yǔ)句仍舊會(huì)繼續(xù)執(zhí)行。直到commit work。這樣的后果可能會(huì)很嚴(yán)重。你可以通過設(shè)置一個(gè)環(huán)境變量來(lái)防止這種情況的發(fā)生。

DBACCNOIGN=1


如何設(shè)置decimal字段運(yùn)算結(jié)果的精度?

假定你使用dbaccess或者isql,設(shè)置環(huán)境變量DBFLTMASK=6 就可以設(shè)置為小數(shù)點(diǎn)后面6位,比如:

CREATE TEMP TABLE t

( col_a DECIMAL(8,4) NOT NULL,

col_b DECIMAL(8,4) NOT NULL,

col_c DECIMAL(8,4) NOT NULL

);

INSERT INTO t VALUES(1.2345, 3.4567, 5.6789);

SELECT (col_a + col_b) / col_c AS value FROM t;

value 0.826075

如果DBFLTMASK=7

value 0.8260755


為什么我們有時(shí)會(huì)遇到sysprocplan表被鎖的提示?

sysprocplan表是sysmaster庫(kù)中的一個(gè)表,其中記錄存儲(chǔ)過程經(jīng)過優(yōu)化的查詢計(jì)劃。每當(dāng)查詢樹中的數(shù)據(jù)庫(kù)對(duì)象有任何結(jié)構(gòu)上的變化,這個(gè)查詢計(jì)劃就會(huì)自動(dòng)更新。如果對(duì)查詢樹中存在的任何表有update statistics操作,也會(huì)自動(dòng)更新查詢計(jì)劃。在查詢計(jì)劃更新的時(shí)候,會(huì)對(duì)sysporcplan表中的相關(guān)記錄加鎖。

注意:每次你對(duì)一個(gè)表更新統(tǒng)計(jì)的時(shí)候,也同時(shí)會(huì)更新于這個(gè)表相關(guān)的存儲(chǔ)過程,即UPDATE STATISTICS FOR PROCEDURE 。

你可以作的另外一件事情就是:在存儲(chǔ)過程中使用SET OPTIMIZATION LOW,這會(huì)讓優(yōu)化器在存儲(chǔ)過程運(yùn)行的時(shí)候不會(huì)試圖去重新優(yōu)化它。否則存儲(chǔ)過程通常都會(huì)被重新優(yōu)化一次。




如何刪除掉表中重復(fù)的記錄?

假設(shè)“keycol”字段的值唯一,而且沒有對(duì)表進(jìn)行分片,并且沒有其它的人正在刪除"sometable"中的記錄,你可以執(zhí)行如下的SQL:

delete from sometable as a

where rowid <>; (select min(rowid) from sometable where keycol = a.keycol)

如果這個(gè)表使用表分片,rowid不存在,你還可以用如下的方法:

BEGIN WORK;

SELECT DISTINCT * FROM Table INTO TEMP Temp1;

DELETE FROM Table WHERE 1 = 1;

INSERT INTO Table SELECT * FROM Temp1;

COMMIT WORK;

對(duì)于規(guī)模較小或中等的表,并且你有足夠的存儲(chǔ)空間來(lái)存儲(chǔ)整個(gè)的臨時(shí)表的時(shí)候,這種方法通常十分有效。


如何加快SELECT COUNT(DISTINCT)的速度。

通!癝ELECT COUNT(DISTINCT)”這樣的操作要花費(fèi)比較長(zhǎng)的時(shí)間,如果你這樣作:

SELECT UNIQUE xxx INTO TEMP XXX " 然后再"SELECT COUNT(*) FROM TEMP XXX"

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
6 [報(bào)告]
發(fā)表于 2003-05-29 20:09 |只看該作者

informix SQL匯總

【續(xù)】

NULL值的使用

RDSQL中字段缺省值為空;并且對(duì)數(shù)值型的0和空值,以及字符型的空白和空值區(qū)別對(duì)待。
數(shù)值表達(dá)式中某個(gè)變?yōu)榭,則整個(gè)表達(dá)式值為空;
聚合函數(shù)中,對(duì)空值忽略不計(jì),若全部為空值,除COUNT(*)返回0外,其余返回空值。
布爾表達(dá)式中,結(jié)果可能為“未知”(見下表)。如TRUE AND NULL 結(jié)果為 “未知”,對(duì)“未知”結(jié)果在RDSQL中看作不符合查詢條件。

and
T
F
?
  or
T
F
?
  not
 
T
T
F
?
  T
T
T
T
  T
F

F
F
F
?
  F
T
F
?
  F
T

?
?
F
?
  ?
T
?
?
  ?
?


結(jié)合上表,分析下列子句 ,其中n1=20;n2為空;n3=30。結(jié)果如右。

where n1*n2 < 1000 and n3 = 30; 結(jié)果:不符合查詢條件
where n1*n2 < 1000 or n3 = 30; 結(jié)果:符合查詢條件

ORDER BY子句中的空值,每一個(gè)空值為一組。
INSERT或UPDATE時(shí),可使用關(guān)鍵字NULL/null表示空值。
字段是否可以為空,由CREATE TABLE語(yǔ)句中是否有NOT NULL指定或由ALTER修改。

Q:select count(*) from t1和select count(c1) from t1是否一樣?



字符查找,主要使用LIKE和MATCHES。

LIKE
MATCHES
意義

%
*
匹配0或多個(gè)字符

-
?
匹配一個(gè)字符

\
\
轉(zhuǎn)義字符

無(wú)
[]
選擇匹配


例:matches ‘*Sp’;匹配以任何字符開始,以Sp結(jié)束的字段值
matches ‘?l*’; 匹配第一個(gè)字符任意,第二個(gè)字符為l,其余字符任意的字段值
matches ‘[A-N]*’; 匹配以A到N的字符開始,其余字符任意的字段值
matches ‘*[sS]*’; 匹配含有s或S的字段值,擴(kuò)展以下可用于case insensitive查詢
like ‘%\%%’; 匹配含有%的字段值


用SQL語(yǔ)句求表一中的關(guān)于name有多少不同的num,結(jié)果如表二。
表一:                     表二:
id   name   num              name     count1
1    AA    1               CC       2
2    AA    2               BB       2
3    AA    3               AA       3
4    AA    1
5    AA    2
6    BB    4
7    BB    5
8    BB    4
9    BB    5
10   CC    6
11   CC    6
12   CC    7

SQL語(yǔ)句如下:

create table t1
(
id smallint,
name char(10),
num smallint
);

insert into t1 values(1,'AA',1);
insert into t1 values(2,'AA',2);
insert into t1 values(3,'AA',3);
insert into t1 values(4,'AA',1);
insert into t1 values(5,'AA',2);
insert into t1 values(6,'BB',4);
insert into t1 values(7,'BB',5);
insert into t1 values(8,'BB',4);
insert into t1 values(9,'BB',5);
insert into t1 values(10,'CC',6);
insert into t1 values(11,'CC',6);
insert into t1 values(12,'CC',7);


A:select name ,count(distinct num) from t1 group by name;


4)使用旋轉(zhuǎn)矩陣,將表一中關(guān)于id在不同月份的費(fèi)用,由縱向變?yōu)闄M向。

其中表一對(duì)一個(gè)id某個(gè)月份的記錄數(shù)可能>;1。表一:
id   d1  fee費(fèi)用(分)
1 2000-01-24 100
1 2000-04-24 100
2 2000-02-24 200
2 2000-06-24 200
3 2000-04-24 400
4 2000-04-24 400
5 2000-05-24 500
6 2000-06-24 600
7 2000-09-24 900
8 2000-11-24 1100

表二:
id 1月份費(fèi)用 2月份費(fèi)用 …… … … 12月份費(fèi)用
1  100 0  0  100  0  0  0  0  0  0  0   0
2  0  200 0  0   0  200 0  0  0  0  0   0
3  0  0  0  400  0  0  0  0  0  0  0   0
4  0  0  0  400  0  0  0  0  0  0  0   0
5  0  0  0  0   500 0  0  0  0  0  0   0
6  0  0  0  0   0  600 0  0  0  0  0   0
7  0  0  0  0   0  0  0  0  900 0  0   0
8  0  0  0  0   0  0  0  0  0  0  1100  0


SQL語(yǔ)句:
create table t3
(
id smallint,
d1 datetime year to day,
fee int
);

insert into t3 values(1,"2000-01-24", 100);
insert into t3 values(1,"2000-04-24", 100);
insert into t3 values(2,"2000-02-24", 200);
insert into t3 values(2,"2000-06-24", 200);
insert into t3 values(3,"2000-04-24", 400);
insert into t3 values(4,"2000-04-24", 400);
insert into t3 values(5,"2000-05-24", 500);
insert into t3 values(6,"2000-06-24", 600);
insert into t3 values(7,"2000-09-24", 900);
insert into t3 values(8,"2000-11-24", 1100); 

create table t4 –旋轉(zhuǎn)矩陣
(
m_code smallint,
y1 smallint,
y2 smallint,
y3 smallint,
y4 smallint,
y5 smallint,
y6 smallint,
y7 smallint,
y8 smallint,
y9 smallint,
y10 smallint,
y11 smallint,
y12 smallint
);

insert into t4 values(1, 1,0,0,0,0,0,0,0,0,0,0,0);
insert into t4 values(2, 0,1,0,0,0,0,0,0,0,0,0,0);
insert into t4 values(3, 0,0,1,0,0,0,0,0,0,0,0,0);
insert into t4 values(4, 0,0,0,1,0,0,0,0,0,0,0,0);
insert into t4 values(5, 0,0,0,0,1,0,0,0,0,0,0,0);
insert into t4 values(6, 0,0,0,0,0,1,0,0,0,0,0,0);
insert into t4 values(7, 0,0,0,0,0,0,1,0,0,0,0,0);
insert into t4 values(8, 0,0,0,0,0,0,0,1,0,0,0,0);
insert into t4 values(9, 0,0,0,0,0,0,0,0,1,0,0,0);
insert into t4 values(10,0,0,0,0,0,0,0,0,0,1,0,0);
insert into t4 values(11,0,0,0,0,0,0,0,0,0,0,1,0);
insert into t4 values(12,0,0,0,0,0,0,0,0,0,0,0,1);


--方法一
select id,month(d1) month,sum(fee) fei from t3 group by 1,2 into temp aa;
select id,
sum(y1*fei) y1,sum(y2*fei) y2,sum(y3*fei) y3,sum(y4*fei) y4,
sum(y5*fei) y5,sum(y6*fei) y6,sum(y7*fei) y7,sum(y8*fei) y8,
sum(y9*fei) y9,sum(y10*fei) y10,sum(y11*fei) y11,sum(y12*fei) y12
from aa, t4 where aa.month = t4.m_code
group by id order by id

--方法二
select id,
sum(y1*fee) y1,sum(y2*fee) y2,sum(y3*fee) y3,sum(y4*fee) y4,
sum(y5*fee) y5,sum(y6*fee) y6,sum(y7*fee) y7,sum(y8*fee) y8,
sum(y9*fee) y9,sum(y10*fee) y10,sum(y11*fee) y11,sum(y12*fee) y12
from t3, t4 where month(d1) = t4.m_code
group by id order by id


方法一和方法二的結(jié)果一樣,但有所區(qū)別:
方法一中是先對(duì)id某個(gè)月的錢進(jìn)行累加,然后進(jìn)行旋轉(zhuǎn);
方法二中在表一對(duì)一個(gè)id某個(gè)月份的記錄數(shù)可能>;1的情況時(shí),先對(duì)每條記錄進(jìn)行旋轉(zhuǎn),然后在累加求和。

論壇徽章:
11
數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-06-25 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-06-24 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-05-03 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-04-21 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-01-23 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2015-12-03 06:20:00綜合交流區(qū)版塊每周發(fā)帖之星
日期:2015-12-02 15:03:53數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2015-10-19 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2015-08-20 06:20:002015年辭舊歲徽章
日期:2015-03-03 16:54:15數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-07-30 06:20:00
7 [報(bào)告]
發(fā)表于 2003-05-29 22:15 |只看該作者

informix SQL匯總

我收!

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2003-05-30 06:25 |只看該作者

informix SQL匯總

不錯(cuò)!收藏ing~~后面還有沒有了。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2003-05-30 08:32 |只看該作者

informix SQL匯總

收。。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2003-05-30 17:57 |只看該作者

informix SQL匯總

頂!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP