当前位置--> 首 页 --> 文 章 -->OtherDatabase
|
|
※阅读文章※ |
SQL 实践和技巧 <2>作者:不祥 [文章出自: www.fanqiang.com] 几个小技巧 (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分钟 文章加入时间: 2004-11-17 14:45:02 责任编辑: w9 (2828 人次查阅) |