??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
MS SQLSERVER
SQL Server 支持临时表。时表是那些名称以井?(#) 开头的表。如果当用户断开q接时没有除M时表QSQL Server 自动除M时表。时表不存储在当前数据库内Q而是存储在系l数据库 tempdb 内?
临时表有两种cdQ?
本地临时?/b>Q本C时表的名UC单个数字W号 (#) 打头Q它们仅对当前的用户q接是可见的Q当用户?Microsoft SQL Server 2000 实例断开q接时被删除?
全局临时?/b>Q全局临时表的名称以数学符?(##) 打头Q创建后对Q何用户都是可见的。如果在创徏全局临时表的q接断开前没有显式地除去q些表,那么只要所有其它Q务停止引用它们,q些表即被除厅R当创徏全局临时表的q接断开后,新的d不能再引用它们。当前的语句一执行完,d与表之间的关联即被除去;因此通常情况下,只要创徏全局临时表的q接断开Q全局临时表即被除厅R?
例如Q如果创建名?employees 的表Q则M人只要在数据库中有用该表的安全权限可以用该表,除非它已删除。如果创建名?#employees 的本C时表Q只有您能对该表执行操作且在断开q接时该表删除。如果创建名?##employees 的全局临时表,数据表中的Q何用户均可对该表执行操作。如果该表在您创建后没有其他用户使用Q则当您断开q接时该表删除。如果该表在您创建后有其他用户用,?SQL Server在所有用h开q接后删除该表?
现在Q时表的许多传l用途可由具?table 数据cd的变量替换?
ORACLE
Oracle支持临时表。时表用来保存事务或会话期间的中间l果。在临时表中保存的数据只有对当前会话是可见的QQ何会话都不能看到其他会话的数据,即在当前会话COMMIT数据以后也是不可见的。多用户q行不是问题Q一个会话从来不d另一个会话用时表。即佉K定时表Q一个会话也不会d其他会话使用临时表。时表比正常表产生的REDO得多,然而,׃临时表必M生包含数据的UNDO信息Q所以会产生一定数量的REDO日志?
临时表将从用户时表I间的的目前日志中分配空_或者如果从有定义权的程序中讉KQ将使用E序所有者的临时表空间。全局临时表实际上只是表本w的模板。创Z时表的行Z包括存储I间的分配,也不包括INITIAL的分配。因此,在运行时当一个会话首先将数据攑ֈ临时表中Ӟq时创个会话的临时Dc由于每个会话获取自q临时D,每个用户可能在不同的表空间中Z时表分配I间。USER1的default临时表空间ؓTEMP1Q他的时表从TEMP1中分配空_USER2的default临时表空间ؓTEMP2Q他的时表从TEMP2中分配空间?
临时表在每个数据库中只需创徏一ơ,不必在每个存储过E中创徏。时表L存在的,除非手动的删除他。时表作ؓ对象存在数据字典中,q且L保持为空Q直到有会话在其中放入数据。Oracle允许创徏Z临时表的视图和存储过E?
临时表可以是以会话ؓ基础的,也可以是以事务ؓ基础的。ON COMMIT PRESERVE ROWS子句使时表成ؓZ会话的模式。行留在此表中Q直C话断开或通过DELETE或TRUNCATE从物理上删除q些行。ON COMMIT DELETE ROWS子句使时表成ؓZ事务的模式。当会话提交后,行消失。这个时表的自动清除过E不会有额外的开销?
在oracle中,应用E序需要的临时表应该在E序安装时创建,而不是在E序q行时创建。(q是与ms sqlserver或sybase的用的不同Q?
在Q何数据库中,临时表的一个缺ҎQ事实上优化器在临时表中没有真正的统计功能。然而,在oracle中,一pd较好的统计猜可以通过DBMS_STATS包在临时表中讄?
DB2
可?DECLARE GLOBAL TEMPORARY TABLE 语句来定义时表。DB2的时表是基于会话的Q且在会话之间是隔离的。当会话l束Ӟ临时表的数据被删除,临时表被隐式怸。对临时表的定义不会在SYSCAT.TABLES中出?
下面是定义时表的一个示例:
DECLARE GLOBAL TEMPORARY TABLE gbl_temp
LIKE empltabl
ON COMMIT DELETE ROWS
NOT LOGGED
IN usr_tbsp
此语句创Z个名?gbl_temp 的用户时表。定义此用户临时?所使用的列的名U和说明?empltabl 的列的名U和说明完全相同。隐式定?只包括列名、数据类型、可为空Ҏ和列缺省值属性。未定义所有其他列属性,包括唯一U束、外部关键字U束、触发器和烦引。执?COMMIT 操作Ӟ 若未对该表打开 WITH HOLD 游标Q则该表中的所有数据都被删除。不记录 对用户时表所作的更改。用户时表被放在指定的用户临时表空间中。此表空间必d在,否则此表的声明将p|?
户定义时表不支持:
DATALINK ?/font>
]]>
三、多数据库的考虑
1. 字符串连接必ȝ?/span>||”符P不用?/span>+”。注意:?/span>Oracle中一?/span>nullg?/span>nullD接,l果为非null|?/span>DB2?/span>SqlServer中相反。?/span>nvl?/span>null转换?/span>’’?br />
2. 通配W不能用?/span>[a-c]%?/font>q种形式Q应写成如:select * from table_name where col1 like ‘[a]%?OR col1 like ‘[b]%?OR col1 like ‘[c]%??br />
3. 在对charcd比较?/span>,要对列加?/span>rtrim()函数,否则?/span>Oracle中不会得到正结果。例如若test表中的字D?/span>f1的长度ؓ10Q内有一个gؓ?/span>aa?/font>Q的U录Q则语句select len(f1) from test;?/span>SqlServer的执行结果ؓ2Q在Oracle的执行结果ؓ10?br />
4. ?/span>Case when语句中只能出?/span> =?/span>>=?/span><= 以及is nullq算W,不能出现 <?/span>>?/span><>?/span>!=、以?/span>is not nullq算W?/span>否则?/span>Oracle?/span>decode函数无法表达?br /> 当必M?/font> <, >, != Q?/span>is not nullӞ采用如下变通方法:
1Q?/span> !=Ӟ例如 case when A!=B then e,
可改?/span>Q?/span> case A=b then e1 else e (间接实现 A!=B)
2Q?/span> < Ӟ例如 case when A<B then e,
可改?/span>Q?/span> case A<=b then case A=B then e1 else e (间接实现 A<B)
?/span> case A>=b then e1 else e (间接实现 A<B)
3Q?/span> > Ӟ例如 case when A>B then e,
可改?/span>Q?/span> case A>=b then case A=B then e1 else e (间接实现 A>B)
?/span> case A<=b then e1 else e (间接实现 A>B)
4Q?/span>is not null Ӟ例如 case when A is not null then e,
可改为: case A is null then e1 else e (间接实现 A is not null)
特别说明Q当执行大数据量的操作时Q?/span>sql Server ?/span> case when 的执行效率极低,甚至可能会死机,因此希望大家量不要使用case when?br />
5. 参与左连接的列不能ؓ帔R。例如,不允许如下语句: select * from t1 left outer join t2 on t1.f1='A'?br />
6. 左连接的写法必须带?/span>outer”关键字。例如: select f1 from t1 left outer t2 on t1.f1 = t2.f1Q而不是: select f1 from t1 left t2 on t1.f1 = t2.f1?br />
7. 只能使用以下函数Q如要用新的函数必ȝ报,审批后才能用。函敎ͼcoalesce, cast, len, left, replace, right, substring, lower, upper, ltrim, rtrim, abs, acos, asin, atan, cos, ceiling, exp, floor, log, power, round, sign,sin, square, sqrt, tan, count, max, min, sum, avg?br />
8. substring函数中v始位|ؓ1Q表CZ头开始?br />
9. Like 的一边必L字符Ԍ只能在一边出现表列?br />
10. ?/span>SQL语句中不能直接?/span>null,必须?/span>null指明cd,在判断某gؓnull旉外?br />
11. 对于一?/span>char/varchar的字D늚|即?/span>0,1Q?/span>2?/font>{|也必表达ؓ?chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="? w:st="on">0??chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="? w:st="on">1??chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2" unitname="? w:st="on">2’…?br />
12. ?/span>cast?/span>convert语句中只支持到字W型、日期型和数字型的{换,且日期型只支?/span>UFDate的格式,?/span>’YYYY?‘MM?‘DD’?br />
13. insert 语句不通过SQL译器,?/span>insert中不允许使用select?br />
14. 不能通过?/span>percent n 限制查询l果集的记录敎ͼ也不能?/span> select top n 的语?br />
15. outer join 前后的表不能互相q接,不能重复q接Q即不能出现以下形式的语句:
a left outer join c on a.fda=c.fdsf left outer join b on b.fdsa=c.fsdff (该语句中?/span>a?/span>b同时q接C?/span>c?/span>)
a left outer join b on a.fda=b.fdsf left outer join a on b.fdsa=a.fsdff (该语句中?/span>a?/span>b互联)
16. join ?/span>on 必须严格匚wQ不允许出现没有on?/span>join?br />
17. join…on 后面慎用 or,如果用到Q请?/span>or的范围用( )括v?br />
18. 如果某个表有别名Q则必须引用它的别名Q不许引用它原来的表?br />
19. 在子查询中前后必d上括?br />
20. order by 后的列名?/span>select后有多个相同的列Q例如不能写为:
select a, b, a, a from fdsf order by a (a ?span lang="EN-US">select后出C多次)可以l?span lang="EN-US">a 加别?br />
21. 不能使用select into 的格?br />
22. l某个字W型的列赋值时Q如果其值含有单引号Q例如:set col=’fsdf’fdsfdsf’sdf’? 有两U解x?
1Q将单引号写?span lang="EN-US">’??/font> set col=’fsdf’’fdsfdsf’’sdf?br /> 2Q通过set的方式赋|卻Iset col= Q??br /> 然后Q?/font>setString(8,?’fsdf’fdsfdsf’sdf’?
]]>
一、概q?br />
本手册侧重于
SQL
开发书写过E中的规范问题。尽可能的在ȝ以往开发过E中形成?/span>
SQL
开发方法,q对在软gl护?/span>
SQL
语句跨多数据库、操作系l适配中出现问题的解决办法的基上,提出的一?/span>
SQL
开发规范?br />
二、书写风?br />
1.
SQL
语句全部使用写Q除?/span>
SQL
中用引号括v来的帔R外,请用单字节?br />
2.
引用字符时用单引受如Q?/span>
update testable set idcol=’abcd?/font>
?/span>
3.
量使用
prepareStatement
Q利用预处理功能。少?/span>
createStatement
?br />
4. ?/font>
D
SQL
的时候,使用
StringBuffer,
不要?/span>
String+String
的方式?br />
5.
严禁使用
select * …?
形式的语句,要指?/span>
select
的具体字Dc?br />
6.
严禁使用
insert into table value(?????)
Q要指出具体要赋值的字段?/span>
7.
SQL
语句包含多表q接Ӟ必须Ҏ个表命名别名Q对每个字段的用都要带上别名?br />
8.
?/span>
SQL
语句含有q算W时Q运符需与其他字W串用空格区?/span>
(
或者用括号分开
)
。否则容易导致以下类似问题。在语句
select a–b from table
中,
a
Q?/span>
b
均ؓ变量。拼写该语句Ӟ如果
a=6
Q?/span>
b= -3
Q则语句变ؓ
select 6--3 from table
?/span>
--
变ؓ
Sql
的注释,语句报错?br />
9.
避免隐含的类型{换。例如在
where
子句?/span>
numeric
型和
int
型的列的比较或相加?br />
10.
d是指通过
JDBC
d的数据格式,保存是指保存?/span>
VO
中的数据格式Q插入或者更新是?/span>
insert
或?/span>
update
语句中的数据格式?br />
a)
整型字段Q读取时Ҏ字段讄保存?/span>
Integer
或?/span>
Long
?br />
b)
数字型字D:d?/span>
BigDecimal
Qƈ保存?/span>
UFDouble
Q插入或者更新时?/span>
BigDecimal
?br />
c)
字符型字D:d?/span>
String
Qƈ保存?/span>
String
Q插入或者更Cؓ
String
?br />
d)
布尔型字D:d?/span>
String(‘Y?OR ‘N?
Qƈ保存?/span>
UFBoolean
Q插入或者更新时?/span>
String(‘Y?OR ‘N?
?br />
e)
旉字段Q读取ؓ
String
Qƈ保存?/span>
UFDateTime
Q插入或者更新时的时间格式由中间件统一处理Q有单独需求的要申请后才能军_?br />
11.
量不用右q接?br />
12.
在?/span>
UNION
?/span>
UNION ALL
的前后的两个
SQL
需要加
( )
?/font>