SQL 实践和技巧 <2>
转自 http://i.cnblogs.com/EditPosts.aspx?opt=1
几个小技巧
(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 <whatever you need>
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分钟
SQL 实践和技巧 <2>的更多相关文章
- Oracle SQL性能优化技巧大总结
http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...
- 【转】PL/SQL Developer使用技巧、快捷键
原文链接:PL/SQL Developer使用技巧.快捷键 1.类SQL PLUS窗口:File->New->Command Window,这个类似于oracle的客户端工具sql plu ...
- mysql操作sql的小技巧
本篇集中整理一下执行sql的小技巧,这种方式不仅带来了操作上的便捷,也可以保证数据可以数据的安全性. 1:查询数据(保证查询性能) 首先想先解释一下 SELECT * 和 SELECT t.id , ...
- PL/SQL Developer使用技巧(部分)
PL/SQL Developer使用技巧(部分) 关键字自动大写 在sql命令窗口中输入SQL语句时,想要关键字自动大写,引人注目该怎么办呢? 一步设置就可以达成了.点击Tools->Prefe ...
- SQL高级查询技巧
SQL高级查询技巧 1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重 ...
- 【SQL实践】其他常用SQL汇总
[SQL实践]其他常用SQL汇总 1.联表更新 update students stu inner join course on course.STUDENT_ID=stu.id set stu.na ...
- sql server 小技巧(8) visual studio 2013里使用Sql server compact 4.0及发布问题处理
1. 安装 Microsoft SQL Server Compact 4.0 https://www.microsoft.com/zh-cn/download/confirmation.aspx?i ...
- sql server 小技巧(2) 删除sql server中重复的数据
with list_numbers as ( select Name, AuthorOrTime, Url, Price, EstimatePrice, Size, Category, ROW_NUM ...
- sql server 小技巧(1) 导入csv数据到sql server
1. 右击 DataBaseName,选择 Tasks->Import Data 2. 选择数据源: Flat File Source , 选择一个csv文件 Advance: 选择所有的列,改 ...
随机推荐
- 063——VUE中vue-router之重定向redirct的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SQL Server 调优系列基础篇 - 常用运算符总结
前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...
- 快速切题sgu126. Boxes
126. Boxes time limit per test: 0.25 sec. memory limit per test: 4096 KB There are two boxes. There ...
- Vue面试题整理
1:什么是MVVM MVVM是是Model-View-ViewModel的缩写,Model代表数据模型,定义数据操作的业务逻辑,View代表视图层,负责将数据模型渲染到页面上,ViewModel通过双 ...
- FormShortCut MainForm 和 二级FORM
发现,主FORM 定义的快捷键,在二级FORM里也有效. 反过来,就无效. 这样的话,就要考虑 快捷键的冲突问题 了,本来以为不同的FORM 是独立的. http://codeverge.com/em ...
- js取的随机数
Math.round(Math.random()*1000+1) ;//取得1-1000的随即数
- 《Python》反射、内置方法(__str__,__repr__)
一.反射 通过字符串的形式操作对象相关的属性.(使用字符串数据类型的变量名来获取这个变量的值) Python中的一切事物都是对象(都可以使用反射) 反射类中的变量 反射对象中的变量 反射模板中的变量 ...
- 《Hands-On Machine Learning with Scikit-Learn&TensorFlow》读书笔记
一 机器学习概览 机器学习的广义概念是:机器学习是让计算机具有学习的能力,无需进行明确编程. 机器学习的工程性概念是:计算机程序利用经验E学习任务T,性能是P,如果针对任务T的性能P随着经验E不断增长 ...
- 偶尔用得上的MySQL操作
数据库编码 查看数据库编码 use xxx show variables like 'character_set_database'; 切换数据库编码 alter database xxx CHARA ...
- .NET基金会成立
作者 Jonathan Allen ,译者 臧秀涛 发布于 2014年4月8日 随着.NET基金会的成立,微软在成为主要的开源参与者的道路上又前进了一步.该基金会的宗旨是“成为越来越多的开源.NET项 ...