GB | BIG5
|
| 首頁 > 數據庫 > 其它 > 正文 |
 |
| SQL 實踐和技巧 <2> |
| 本文出自: http://go3.163.com/~axiom999/ (2001-06-18 20:10:01) |
幾個小技巧
(1)||的使用:
select ‘(‘||phone[1,3]||’)’phone[5,12], from customer where customer_num=106;
Result:(415)389-8789
(2)TRIM的使用:select trim(fname) from customer; 刪除前導和繼空格。
select trim(leading ‘1’ from phone) from customer;
返回值中若phone字段以字符’1’開始,則刪除字符’1’。
(3)SERAIL值的插入:tt中有兩個字段,字段c1是serail ,字段c2是char(8);
insert into tt values(0, ‘AA’);insert into tt values(0, ‘BB’);
select * from tt;得到結果:1 AA, 2 BB;
對SERIAL的字段,插入0表示由數據庫系統自動插入序列值。
(4)DELIMITER的使用:
在LOAD和UNLOAD中指定字段值之間的間隔採用的字符
缺省時採用字符’|’。如:unload to ‘next.txt’ delimiter ‘;’ select * from tt ;
但不能使用'\', hex digits, tab 或 space。
(5)UNION和UNION ALL:
要求查詢返回的結果名字、類型相同;前者不重復,者顯示重復值。
在SELECTs 中使用 sorts 或 joins
如果在SELECTs 中使用 sorts 或 joins可以使用臨時表 例:
SQL1:
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
SQL2:
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
說明:語句二比語句一將更節省時間。
SELECTs 中使用 NOT IN or NOT EXISTS 子句
例:SQL1:(這條語句的執行將會很費時)
SELECT code FROM table1
WHERE code NOT IN ( SELECT code FROM table2 ) ;
SQL2:
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;
說明:大多數情況下語句二比語句一將更有效,但若table1.code和table2.code均有索引,
可能效果不明顯。
SET EXPLAIN ON的使用
"SET EXPLAIN ON" 是一個 SQL命令,它將產生文件sqexplain.out,其中含有SQL命令的診斷信息,'cost' 會指出命令的估計用時(有時可能有較大偏差)。
避免使用 "OR"
例:WHERE a = "B" OR a = "C"將比WHERE a IN ("B","C")慢 另外,有時使用UNION將比OR有效。
關索引
在joined 和ORDER BY的字段上加索引,WHERE子句涉及的字段也可以盡量加索引
AND和BWTWEEN的使用
例:
WHERE datecol >= "this/date" AND datecol <= "that/date"將比
WHERE datecol BETWEEN "this/date" AND "that/date"慢
在CLAC字段上建立視圖
CREATE VIEW tst AS
SELECT ship_charge - totval cout
FROM orders WHERE ship_charge > 0;
應改為
CREATE VIEW tst (cout) AS
SELECT ship_charge - totval
FROM orders WHERE ship_charge > 0;
如何存取當前庫以外的數據?
在OnLine版本中,使用下列語句
SELECT * FROM dbname@server:owner.tablename
注: 當前庫與dbname@server必須保持日志一致,即同為有日志或無日志。
"@server"和"owner."是可選的
某些OnLine版本中也可以使用同義名,如下
eg: CREATE SYNONYM Owner1.Table1 FOR Database2@Machine2:Owner2.Table2
在主表中查詢從表中沒有的數據
例:
SQL1:
SELECT * FROM invlin WHERE invlin.invoice NOT IN
(SELECT invmst.invoice FROM invmst)
優化的SQL2
SELECT invmst.*, invlin.invoice inv_invoice
FROM invmst, outer invlin
WHERE invmst.invoice = invlin.invoice
INTO TEMP lone_invoices;
SELECT
FROM lone_invoices
WHERE (inv_invoice IS NULL)
怎樣返回SELECT語句中正常返回記錄數的一部分?
例:
SQL1:
SELECT firstname, lastname, city, state
FROM bigdatabase
WHERE state = "TX"
使用語句
SELECT firstname, lastname, city, state
FROM bigdatabase
WHERE state = "TX"
AND rowid=(trunc(rowid/x)*x)
其中x是查詢部分的比例1/x,注意只能作到大約比例,且不保証隨機性.
如何創建與與永久表一樣的結構
例:
SQL1:
CREATE TEMP TABLE mytemp (prodno LIKE product.prodno desc LIKE product.desc)
SQL2:
SELECT prodno, desc FROM product
WHERE ROWID = -1
INSERT INTO TEMP mytemp
兩種方法都正確,你選擇那一個?
怎樣更改序列值
例:
改變自動生成的序列值的起始值(由小的序列值改為大的序列值):
ALTER TABLE tablename MODIFY( ser_col_name SERIAL(new_start_number))
改自動生成的序列值的起始值為1(由大的序列值改為小的序列值):
先改為1,再改為指定的值
INSERT INTO tablename (serial_column) VALUES (2147483647);
INSERT INTO tablename (serial_column) VALUES (0); -- Back to 1 again!
ALTER TABLE tablename MODIFY( ser_col_name SERIAL(new_start_number))
加速SELECT COUNT(UNIQUE)?
例:
SQL1: select count(unique xxx) ... 執行了約30分鐘.
SQL2: select unique xxx ... into temp aa; select count(*) from aa; 執行了7分鐘
(http://www.fanqiang.com)
進入【UNIX論壇】
|
|
| 相關文章 |
SQL 實踐和技巧 <2> (2001-06-18 20:10:01) SQL 實踐和技巧 <1> (2001-06-18 19:00:00)
|
|
|
|
 |
★ 樊強制作 歡迎分享 ★ |