小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Informix-SQL 使用匯總 - Unix愛好者家園

 昵稱90415 2009-02-24
Informix-SQL 使用匯總
 
作者:藍色鍵盤  出處:Unix愛好者家園unix-cd.com  更新時間: 2004年07月20日 
 
每個數(shù)據(jù)庫管理系統(tǒng)(DBMS)都有其自己的數(shù)據(jù)處理語言(DML),但所有DML都基于一種語言SQL語言——結(jié)構(gòu)化查詢語言(SQL),其發(fā)音為“sequel”或“S-Q-L”。 

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

  無論進行何種數(shù)據(jù)庫學習,SQL語言都是必學內(nèi)容。在我國數(shù)據(jù)庫語言SQL標準(GB12991)中規(guī)定了兩個數(shù)據(jù)庫語言的語法與語義: 


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


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

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

CREATE DATABASE database_name [WITH LOG IN “pathname”] 


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

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

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

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

BEGIN WORK等事務(wù)語句(可用START DATABASE語句來改變)。 

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

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

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



DATABASE databse-name [EXCLUSIVE] 

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

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

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

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

例:dtabase customerdb; 



CLOSE DATABASE 


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

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

此語句之后,只有下列語句合法: 

CREATE DATABASE; DATABASE; DROP DATABSE; ROLLFORWARD DATABASE; 

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

例:close database; 



DROP DATABASE database_name 


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

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

例:drop databse customerdb; 



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


[IN “pathname”] 

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

table-name :表名稱。 

column_name:字段名稱。 

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

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

TEMP用于指定建立臨時表;表名要唯一,字段要唯一;有CONNECT權(quán)限的用戶可建立臨時表;創(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:老字段名稱 

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

例:alter table user 

add ( c6 char(20) before c5); 



RENAME TABLE oldname TO newname 


修改表名。 

oldname:原名稱。 

newname:新名稱。 

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



DROP TABLE table-name 


刪除表。 

table-name:表名稱。 

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



RENAME COLUMN table.oldcolumn, TO newcolumn 


修改字段名。 

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

newcolumn:新字段名稱。 

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

例: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語句。 

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

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



DROP VIEW view-name 


刪除視圖。 

view-name:視圖名稱。 

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

例: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:升序或降序,缺省升序。 

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

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



ALTER INDEX index-name TO [NOT] CLUSTER 


修改索引性質(zhì)。 

index-name:索引名稱。 

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

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

例:alter index ix_user to not cluster; 



DROP INDEX index-name 


刪除索引。 

index-name:索引名稱。 

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

例:drop index ix_user; 



CREATE SYNONYM synonym FOR table-name 


創(chuàng)建同義名。 

synonym:同義名 

table-name:表名稱 

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

例:create synonym user_alias for user; 



DROP SYNONYM synonym 


刪除同義名。 

synonym:同義名 

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

例:drop synonym user_alias; 



UPDATE STATISTICS [FOR TABLE table-name] 


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

table-name:表名稱 

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

例:update statistics for table user;
GRANT {DBA|RESOURCE|CONNECT} TO {PUBLIC|user-list} 
授權(quán)命令。 

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

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

例:grant resource to pulbic; 

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


授表級權(quán)限。 

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

table-name:表名稱。 

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

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

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

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


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

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


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

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

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

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


ALTER:更改權(quán)限 

DELETE:刪除權(quán)限 

INDEX:索引權(quán)限 

INSERT:插入權(quán)限 

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

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

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



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

收權(quán)命令。 

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

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

例:revoke resource from john; 

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


收表級權(quán)限。 

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

table-name:表名稱。 

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

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

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

例;revoke update on user from dick; 



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

記錄級加鎖和表級加鎖或文件加鎖。 

table-name:表名稱。 

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

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

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

例:lock table user in exclusive mode; 



UNLOCK TABLE table-name 

取消記錄級加鎖和表級加鎖或文件加鎖。 

table-name:表名稱。 

例:unlock user; 



SET LOCK MODE TO [NOT] WAIT 

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

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

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



START DATABSE db_name [WITH LOG IN “pathname”] 

啟動事務(wù)處理。 

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

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

例;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 

查詢語句。 

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;排序時,NULL值小于非零值。 

table_name:臨時表名稱 

例:略 

附(常用函數(shù)) 

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

count(*)、 

sum(數(shù)據(jù)項/表達式)、avg(數(shù)據(jù)項/表達式)、max(數(shù)據(jù)項/表達式)、min(數(shù)據(jù)項/表達式) 

count(distinct 數(shù)據(jù)項/表達式)、sum(distinct數(shù)據(jù)項/表達式)、avg(distinct數(shù)據(jù)項/表達式) 

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

HEX(數(shù)據(jù)項/表達式)、ROUND(數(shù)據(jù)項/表達式)、TRUNC(數(shù)據(jù)項/表達式)、 

TAN(數(shù)據(jù)項/表達式)、ABS(數(shù)據(jù)項/表達式)、MOD(被除數(shù),除數(shù)) 

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

標準差,stdev()、方差,variance()、范圍,rang() 

(4)時間函數(shù) 

DAY(日期/時間表達式):返回數(shù)字型 

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

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

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

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

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

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

CURRENT:返回日期型 

(5)時間函數(shù) 

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

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

INFORMIX臨時表在下列情況下自動取消: 

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

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

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

D.退出程序時 


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ù)項列表。 

value_list:值列表  
select_statement:查詢語句。 

例:略 


DELETE FROM view_name|table_name WHERE search-conditions 
刪除語句。 

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ù)語句。 

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

value_1ist:字段值 

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

例:略 


CHECK TABLE table-name 
檢查索引語句。 

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

例:略 


REPAIR TABLE table-name 
修復索引。 

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

例:略 


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:得到當前數(shù)據(jù)庫上表的名字。 

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.select 語句中使用sort,或join 

如果你有排序和連接操作,你可以先select數(shù)據(jù)到一個臨時表中,然后再對臨時表進行處理。因為臨時表是建立在內(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 


這個語句返回34個經(jīng)過排序的記錄,花費了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條記錄,只花費了59秒。 


2.使用not in 或者not exists 語句 

下面的語句看上去沒有任何問題,但是可能執(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ā)現(xiàn)不是這樣。 

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


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

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

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

要比 

WHERE a IN ("B","C"

慢。 

有時甚至UNION會比OR要快。 


4.使用索引。 

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


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

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

例子: 

# 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的返回值對不同的isql不是都相同,因此這樣作不是很可靠,代替通過$?來檢查返回值的更好的主意是將標準錯誤重定向到一個文件中,然后在這個文件中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 


為什么不能對一個計算產(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ù)庫中的部分數(shù)據(jù)(例如10%)。 

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

SELECT firstname, lastname, city, state 

FROM bigdatabase 

WHERE state = "TX" 

回答: 

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

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

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


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

desc LIKE product.desc) 

你可以使用如下的語句: 

SELECT prodno, desc FROM product 

WHERE ROWID = -1 

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

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

想要下一個插入的serial類型的值比默認值大,可以用: 

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

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

INSERT INTO table (serial_column) valueS (2147483647); 

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

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


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

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

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

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

BEGIN WORK; 

INSERT INTO history 

SELECT * 

FROM current 

WHERE month = 11; 

DELETE FROM current 

WHERE month = 11; 

COMMIT WORK; 

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

DBACCNOIGN=1 


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

假定你使用dbaccess或者isql,設(shè)置環(huán)境變量DBFLTMASK=6 就可以設(shè)置為小數(shù)點后面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 


為什么我們有時會遇到sysprocplan表被鎖的提示? 

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

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

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




如何刪除掉表中重復的記錄? 

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

delete from sometable as a 

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

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

BEGIN WORK; 

SELECT DISTINCT * FROM Table INTO TEMP Temp1; 

DELETE FROM Table WHERE 1 = 1; 

INSERT INTO Table SELECT * FROM Temp1; 

COMMIT WORK; 

對于規(guī)模較小或中等的表,并且你有足夠的存儲空間來存儲整個的臨時表的時候,這種方法通常十分有效。 


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

通常“SELECT COUNT(DISTINCT)”這樣的操作要花費比較長的時間,如果你這樣作: 

SELECT UNIQUE xxx INTO TEMP XXX " 然后再"SELECT COUNT(*) FROM TEMP XXX"
NULL值的使用 

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

and 


 
  or 


 
  not 
  



 
  T 



  T 





 
  F 


 
  F 


 
 

 
   

 
 
   
 


結(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子句中的空值,每一個空值為一組。 
INSERT或UPDATE時,可使用關(guān)鍵字NULL/null表示空值。 
字段是否可以為空,由CREATE TABLE語句中是否有NOT NULL指定或由ALTER修改。 

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



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

LIKE 
MATCHES 
意義 



匹配0或多個字符 


 
匹配一個字符 



轉(zhuǎn)義字符 

無 
[] 
選擇匹配 


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


用SQL語句求表一中的關(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語句如下: 

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在不同月份的費用,由縱向變?yōu)闄M向。 

其中表一對一個id某個月份的記錄數(shù)可能>1。表一: 
id   d1  fee費用(分) 
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月份費用 2月份費用 …… … … 12月份費用 
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語句: 
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ū)別: 
方法一中是先對id某個月的錢進行累加,然后進行旋轉(zhuǎn); 
方法二中在表一對一個id某個月份的記錄數(shù)可能>1的情況時,先對每條記錄進行旋轉(zhuǎn),然后在累加求和。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多