数据类型比较: | ||||
类型 | Oracle | SQL Server | Symfoware | 注意 |
字符数据类型 | Char(size) | Char(n) | Char(size) | 如果Oracle列中数据值的长度小于或等于8000 bytes ,在SQLServer中使用varchar;否则,使用text |
Varchar2(size) | Varchar(n) | Varchar2(size) | ||
Nchar(size) | Nchar | Nchar(size) | ||
Nvarchar2(size) | Nvarchar | Nvarchar2(size) | ||
Long | Text | --- | ||
Number数据类型 | Number(p,s) | Numeric | Numric(p,s) | Oracle中数值型数据转换到SQLServer中时 |
Decimal | Decimal(p,s) | 1 - 255 tinyint | ||
Int | Integer | -32768 - 32767 smallint. | ||
Smallint | Smallint | -2,147,483,648 - 2,147,483,647 int | ||
Float(n) | Float(p) | 如果需要浮点型的数,使用numeric | ||
Real | Real | 注意: 不要使用float或者real, 因为可能会发生截断 | ||
Double precision | 如果不确定,使用numeric; 它同Oracle NUMBER数据类型非常相似。 | |||
Date数据类型 | Date | Datetime , Smaldatetime | Date | 在symfoware中有更多的数据类型。根据数据的性质,需要置换适当的类型。Symfoware中Date,Time类型可分别用jdbc的setDate,setTime方法 但timestamp在jdbc中无对应类型 |
Time | ||||
Timestamp | ||||
时间间隔 | --- | Interval | ||
LOB数据类型 | Blob | Image | Blob(size) | 如果Oracle列中数据值的长度小于或等于8000 bytes ,在SQLServer中使用varbinary;否则,使用image |
Raw(size) | Binary(n) , Varbinary(n) | |||
Long raw | ||||
Clob | Text | --- | ||
Nclob | ||||
Rowid数据类型 | Rowid | identity | Row_id (*1) | 在symfoware中,在select语句中,可以使用row_id。在host变量中保存取出的row_id。可以以此为基础进行数据操作(更新等)。但是,这一操作只在同一个transaction中有效。 |
urowid | --- | --- | ||
要点: | ||||
1.二进制大对象数据的处理: 一部分的JDBC drive不支持使用java.sql.Blob class的标准的使用方法,为了开发有必要进行独自的封装。 | ||||
2.目前,Symfoware数据库的jdbc driver不支持addBatch() 和 prepareCall()方法 | ||||
3.日期常数的表现方法: 在oracle中字符串可以转换成日期数据类型;但在symforware中不能转换数据类型,日期常数需要指定为"yyyy-mm-dd" Oracle 中: insert into emp values ("2001-01-01"); SQLServer中: insert into test (tt)values ('2000-1-1') Symforware 中:insert into emp values (date "2001-01-01"); |
||||
4.Oracle和SQLServer中可以向数值类型字段添加字符数据(必须是数字字符,否则报错);但在SymfoWare中不可以这样。 | ||||
例如: 向Symfoware数据库中添加记录: insert into test(aa) value(11) | ||||
在Oracle和SQLServer中也可以写为: insert into test(aa) values('11') | ||||
函数比较: | ||||
分类名 | 补充 | |||
单行的函数 | 数值函数 | 返回数值的函数的集合 | ||
字符函数 | 返回字符的函数的集合 | |||
日期函数 | 操作日期用的函数的集合 | |||
变换函数 | 类型变换的函数的集合 | |||
其它函数 | 以上不能分类的函数的集合 | |||
统计函数 | 统计函数的集合 | |||
数学函数: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | DBServer |
Arc tangent of n and m | ATAN2 | ATN2 | N/A | |
Smallest integer >= value | CEIL | CEILING | CEIL | |
Hyperbolic cosine | COSH | COT | N/A | |
Natural logarithm | LN | LOG | N/A | |
Logarithm, any base | LOG(N) | N/A | N/A | |
Logarithm, base 10 | LOG(10) | LOG10 | N/A | |
Modulus (remainder) | MOD | USE MODULO (%) OPERATOR | CAST ,FLOOR | |
Random number | N/A | RAND | N/A | |
Hyperbolic sine | SINH | N/A | N/A | |
Hyperbolic tangent | TANH | N/A | N/A | |
Truncate | TRUNC | N/A | TRUNC | |
Largest number in list | GREATEST | N/A | N/A | |
Smallest number in list | LEAST | N/A | N/A | |
Convert number if NULL | NVL | ISNULL | Coalesce | getNvlSqlString |
Largest integer number | Floor | Floor | Floor | |
四舍五入 | Round | CONVERT | round | |
要点: | ||||
1.由于各种数据库判断Null的方法不同,所以开发时对应DBMS分开处理。DBMS支持SQL92规定的SQL函数coalesce()时,使用该方法。但Oracle中使用nvl方法。这些操作都封装在getNvlSqlString(String strColName, String strDefaultValue)中,用这个方法可得到相应数据库处理Null值的语句 | ||||
2.Symfoware数据库中没有取余函数,可以使用cast和floor组合来取余,例如:cast(empno-floor(empno/3)*3 as int) | ||||
字符函数: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | DBServer |
字串连接 | CONCAT | (expression + expression) | (expression || expression) | getConcatSQLString |
把ASCII转换为字符 | CHR | CHAR | N/A | |
返回字符串中的开始字符(左起) | INSTR | CHARINDEX | position | |
填充字符串的左边 | LPAD | N/A | LPAD | |
字符串中的起始模式(pattern) | INSTR | PATINDEX | position | |
多次重复字符串 | RPAD | REPLICATE | rpad | |
重复空格的字串 | RPAD | SPACE | N/A | |
从数字数据转换为字符数据 | TO_CHAR | STR | N/A | |
子串 | SUBSTR | SUBSTRING | SUBSTRING | |
替换字符 | REPLACE | STUFF | REPLACE | |
将字串中的每个词首字母大写 | INITCAP | N/A | N/A | |
翻译字符串 | TRANSLATE | N/A | N/A | |
字符串长度 | LENGTH | DATELENGTH or LEN | length | |
列表中最大的字符串 | GREATEST | N/A | N/A | |
列表中最小的字符串 | LEAST | N/A | N/A | |
如果为NULL则转换字串 | NVL | ISNULL | Coalesce | getNvlSqlString |
把字符串变为日期 | To_date | CONVERT | Cnv_date | |
把字符变为数字 | To_number | CONVERT | cast | |
要点: | ||||
1.由于各种数据库判断Null的方法不同,所以开发时对应DBMS分开处理。DBMS支持SQL92规定的SQL函数coalesce()时,使用该方法。但Oracle中使用nvl方法。这些操作都封装在getNvlSqlString(String strColName, String strDefaultValue)中,用这个方法可得到相应数据库处理Null值的语句 | ||||
2.注意oracle中取字符子串的方法名与其他数据库不一样 | ||||
日期函数: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | DBServer |
日期相加 | (date_column +/- value) | DATEADD(type , value , column_name) | column_name +/- INTERVAL '2' type | getAddDaySqlString |
ADD_MONTHS(date_column , value) | ||||
两个日期的差 | (date column +/- value) or | DATEDIFF | Span_date | |
MONTHS_BETWEEN | ||||
当前日期和时间 | SYSDATE | GETDATE() | Current_timestamp | getSysdateName |
Current_date | ||||
Current_time | ||||
一个月的最后一天 | LAST_DAY | N/A | Last_day | |
时区转换 | NEW_TIME | N/A | N/A | |
日期后的第一个周日 | NEXT_DAY | N/A | N/A | |
代表日期的字符串 | TO_CHAR | DATENAME | Cnv_char | |
代表日期的整数 | TO_NUMBER | DATEPART | N/A | |
(TO_CHAR)) | N/A | |||
日期舍入 | ROUND | CONVERT | ROUND | |
日期截断 | TRUNC | CONVERT | N/A | |
字符串转换为日期 | TO_DATE | CONVERT | N/A | |
如果为NULL则转换日期 | NVL | ISNULL | Coalesce | getNvlSqlString |
日期的取整(四舍五入中的舍) | rngc | CONVERT | Trunc-date | |
要点: | ||||
1.由于各种数据库判断Null的方法不同,所以开发时对应DBMS分开处理。DBMS支持SQL92规定的SQL函数coalesce()时,使用该方法。但Oracle中使用nvl方法。这些操作都封装在getNvlSqlString(String strColName, String strDefaultValue)中,用这个方法可得到相应数据库处理Null值的语句 | ||||
2.各种数据库得到系统时间的方法不同,所以开发时对应DBMS分开处理。 Symfoware数据库中, current_date -- 系统日期; current_time -- 系统时间; current_timestamp -- 系统日期和时间 这些形式都封装在getSysdateName()中,用这个方法可得到相应数据库的系统时间方法 |
||||
3.各种数据库对日期加减计算的表示是不同的,所以开发时对应DBMS分开处理。这些表现形式都封装在getAddDaySqlString(String strColName, int nValue)中,用这个方法可以得到相应数据库的日期加减方法的表示 | ||||
转换函数: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | |
数字转换为字符 | TO_CHAR | CONVERT | N/A | |
字符转换为数字 | TO_NUMBER | CONVERT | cast | |
日期转换为字符 | TO_CHAR | CONVERT | Cnv_char | |
字符转换为日期 | TO_DATE | CONVERT | Cnv_date | |
16进制转换为2进制 | HEX_TO_RAW | CONVERT | N/A | |
2进制转换为16进制 | RAW_TO_HEX | CONVERT | N/A | |
要点: | ||||
各种数据库中类型转换方法可通过PreparedStatement.setXXX()做成不依靠DBMS的处理. | ||||
其他单行函数: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | DBServer |
返回第一个非空表达式 | DECODE | COALESCE | ||
当前序列值 | CURRVAL | N/A | N/A | |
下一个序列值 | NEXTVAL | N/A | NEXTVAL | getNextID |
如果exp1 = exp2, 返回null | DECODE | NULLIF | ||
用户登录账号ID数字 | UID | SUSER_ID | ||
用户登录名 | USER | SUSER_NAME | ||
用户数据库ID数字 | UID | USER_ID | ||
用户数据库名 | USER | USER_NAME | ||
用户环境(audit trail) | USERENV | N/A | ||
在CONNECT BY子句中的级别 | LEVEL | N/A | ||
统计函数: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | DBServer |
Standard deviation | STDDEV | STDEV or STDEVP | N/A | |
Variance | VARIANCE | VAR or VARP | N/A | |
统计行数 | count | count | count | count(*) |
要点: | ||||
1. SymfoWARE中,使用统计函数count时,不能够使用"count(1)"这样的形式,必须做成"count(*)"。 | ||||
操作符: | ||||
比较操作符: | ||||
算符 | Oracle | Microsoft SQServer | Symfoware | |
不大于,不小于 | N/A | !> , !< | N/A | |
提交集合中的所有值 | != ALL, <> ALL, < ALL, | != ALL, <> ALL, < ALL, | <> ALL, < ALL, | |
> ALL, <= ALL, >= ALL, != SOME, <> SOME, | > ALL, <= ALL, >= ALL, != SOME, <> SOME, | > ALL, <= ALL, >= ALL, <> SOME, | ||
< SOME, > SOME, | < SOME, > SOME, | < SOME, > SOME, | ||
<= SOME, >= SOME | <= SOME, >= SOME | <= SOME, >= SOME | ||
值{为|不为}空 | IS NULL, IS NOT NULL | Same. Also = NULL, | IS NULL, IS NOT NULL | |
!= NULL for backward compatibility (not recommended). | ||||
运算符 | Oracle | Microsoft SQ | Symfoware | DBServer |
连接运算符 | ║ | + | ║ | getConcatSQLString |
比较运算符 | !=,^=,〈〉 | 〈〉,!=,!>,!< | 〈〉 | |
[not in] | [not in] | [not in] | ||
Any | Any | Any | ||
Some | Some | Some | ||
All | All | All | ||
Between x and y | Between x and y | Between x and y | ||
Exists | Exists | exists | ||
X [not] like y | X [not] like y | X [not] like y | ||
Is [not] null | Is [not] null | Is [not] null | ||
理论运算符 | Not | Not | not | |
And | And | And | ||
Or | Or | or | ||
集合运算符 | Union | Union | Union | |
Union all | Union all | Union all | ||
intersect | exists | exists | ||
minus | Exists, not in | Exists, not in | ||
其它运算符 | (+)外部结合 | [left|right] outer join | ||
prior | --- | |||
要点: | ||||
1. SymfoWARE中,不能够使用"!=" 和"^=" , 必须使用"<>"。 | ||||
2. 数据库的交集操作: 取两个结果集的公共部分 | ||||
Oracle中,使用几何运算符intersect, | ||||
例如: (select aa from test1) intersect (select aa from test) | ||||
SQLServer中 ,没有交集运算符,需要使用exists运算符来达到交集的效果, | ||||
例如:select aa from test1 where exists (select aa from test where test.aa=test1.aa) | ||||
Symfoware与SQLServer一样都没有交集运算符,需要使用exists运算符来达到交集效果 | ||||
3. 数据库的差集操作: 从一个集合中减去两个集合的公共部分 | ||||
Oracle中,使用几何运算符minus, | ||||
例如: (select aa from test)minus (select aa from test1) | ||||
SQLServer中 ,没有差集运算符,需要使用exists和not in运算符来达到差集的效果, | ||||
例如:SELECT aa FROM test b WHERE EXISTS |
||||
(SELECT aa FROM test WHERE b.aa NOT IN (SELECT aa FROM test1 c WHERE b.aa = c.aa)) | ||||
Symfoware与SQLServer一样都没有差集运算符,需要使用exists和not in运算符来达到差集效果 | ||||
4. 数据库的并集操作: 取两个结果集的合集 | ||||
SymfoWare中,由union连接得子查询语句必须要用“()”包围,整个union连接不用“()”,并且union语句必须是最后一个语句块 | ||||
例如: | ||||
Oracle中, select aa from test union select aa from test1 | ||||
Symfoware中, select id from test_2 union select id from test_1 |
DML语句: | ||
SELECT statement | ||
INSERT statement | ||
DELETE statement | ||
UPDATE statement | ||
SELECT statements语句 | ||
Oracle和Microsoft SQL Server用的SELECT语句的语法是类似的。 | ||
Oracle | Microsoft SQ | Symfoware |
SELECT [/*+ optimizer_hints*/] [ALL | DISTINCT] select_list [FROM {table_name | view_name | select_statement}] [WHERE clause] [GROUP BY group_by_expression] [HAVING search_condition] [START WITH … CONNECT BY] [{UNION | UNION ALL | INTERSECT | MINUS} SE |
SELECT select_list [INTO new_table_] FROM table_source [WHERE search_condition] [ GROUP BY [ALL] group_by_expression [,…n] [ WITH { CUBE | ROLLUP } ] [HAVING search_condition] [ORDER BY order_expression [ASC | DESC] ] |
Select [{distinct│all} {column_name│expression [[as] alias]}… from { table_name [[as] alias]│(select clause) } [where condition] [group by expression [having condition]] [union [all] select clause] [order by column_name [asc│desc]] [parapel] [with option lock_mode (special locked mode)] |
说明: | ||
1. Symfoware在with option lock_mode语句中,可以指定加锁模式或不加锁;Oracle使用for update 获得锁 | ||
2. 获取分级构造的数据时,多用的SQL语法 START WITH ... CONNECT BY ... ,但它Oracle固有的语法,在其他DBMS中不能使用。 | ||
SQL Server不支持Oracle的START WITH…CONNECT BY子句。在SQL Server中,你可以用创建一个执行同样任务的存储过程来代替。 | ||
3. SQL Server不支持Oracle的INTERSECT和MINUS集合。SQL Server的EXISTS和NOT EXISTS子句可以完成同样的任务。 | ||
4. 使用Symfoware数据库时,用ResultSet.getXXXXX()指定列名时,必须使用大写字符。 | ||
例: | ||
下面的例子使用INTERSECT操作符来为所有有学生的班级找到课程代码和课程名称。注意EXISTS操作符是怎样代替INTERSECT操作符的。 | ||
Oracle | Microsoft SQ | Symfoware |
SELECT CCODE, CNAME | SELECT CCODE, CNAME | SELECT CCODE, CNAME |
FROM DEPT_ADMIN.CLASS | FROM DEPT_ADMIN.CLASS C | FROM DEPT_ADMIN.CLASS C |
INTERSECT | WHERE EXISTS | WHERE EXISTS |
SELECT C.CCODE, C.CNAME | (SELECT 1 FROM STUDENT_ADMIN.GRADE G | (SELECT 2 FROM STUDENT_ADMIN.GRADE G |
FROM STUDENT_ADMIN.GRADE G, | WHERE C.CCODE = G.CCODE) | WHERE C.CCODE = G.CCODE) |
DEPT_ADMIN.CLASS C | ||
WHERE C.CCODE = G.CCODE | ||
下例使用MINUS操作符来找出那些没有学生的班级。 | ||
Oracle | Microsoft SQ | Symfoware |
SELECT CCODE, CNAME | SELECT CCODE, CNAME | SELECT CCODE, CNAME |
FROM DEPT_ADMIN.CLASS | FROM DEPT_ADMIN.CLASSC | FROM DEPT_ADMIN.CLASSC |
MINUS | WHERE NOT EXISTS | WHERE NOT EXISTS |
SELECT C.CCODE, C.CNAME | (SELECT 1 FROM STUDENT_ADMIN.GRADE G | (SELECT 2 FROM STUDENT_ADMIN.GRADE G |
FROM STUDENT_ADMIN.GRADE G, | WHERE C.CCODE = G.CCODE) | WHERE C.CCODE = G.CCODE) |
DEPT_ADMIN.CLASS C | ||
WHERE C.CCODE = G.CCODE | ||
INSERT语句 | ||
Oracle和Microsoft SQL Server用的INSERT语句的语法是类似的。 | ||
Oracle | Microsoft SQ | Symfoware |
INSERT INTO | INSERT [INTO] | Insert into table_name |
{table_name | view_name | select_statement} | {table_name [ [AS] table_alias] | { |
[(column_list)]{values_list | select_statement} | WITH ( […n]) | default values│[column_name…] |
| view_name [ [AS] table_alias] | { | |
| rowset_function_limited } | values ({value│expression}) | |
{ [(column_list)] | [for special simplicity value]│ | |
{ VALUES ( { DEFAULT | NULL | select clause | |
| expression }[,…n] ) | } | |
| derived_table | } | |
| execute_statement } | [with option lock_mode (special locked mode)] | |
} | DEFAULT VALUES | ||
说明: | ||
1. Symfoware中使用with option lock_mode语句,可以指定查询数据的加锁模式,或者不加锁。 | ||
2. oracle 和symfoware都可以使用数组,统一插入多行 | ||
3. Transact-SQL语言支持插入表和视图,但是不支持SELECT语句中的INSERT操作 | ||
4. SQLServer中,关键字DEFAULT不能用于标识列。要产生下一个连续值,则有IDENTITY属性的列一定不能列入column_list或者values_clause。不一定非要用DEFAUL关键字来获得一列的缺省值。在Oracle中,如果该列没有被column_list引用并且它有一个缺省值,则缺省值将放入列中,这是执行移植时最兼容的方法。 | ||
5. Symfoware中要插入的字段名前不能带表名 | ||
例: | ||
Oracle | Microsoft SQ | Symfoware |
INSERT INTO | INSERT INTO GRADE | INSERT INTO GRADE |
(SELECT SSN, CCODE, GRADE FROM GRADE) | (SSN, CCODE, GRADE) | (SSN, CCODE, GRADE) |
VALUES ('111111111', '1111',NULL) | VALUES ('111111111', '1111',NULL) | VALUES ('111111111', '1112',NULL) |
一个有用的Transact-SQL选项(EXECute procedure_name)是执行一个过程并且用管道把它的输出值输出到一个目标表或者视图。Oracle不允许你这样做。 | ||
DELETE语句 | ||
大多数情况下,不必修改DELETE语句。但如果在Oracle中执行依赖SELECT语句的删除操作,就必须进行修改,因为在Transact-SQL不支持这种功能。(见下例) | ||
Oracle | Microsoft SQ | Symfoware |
DELETE [FROM] | DELETE [FROM ] | Delete from table_name |
{table_name | view_name | select_statement} | {table_name [[AS] table_alias] WITH | [where {condition│current of cursor name}] |
[WHERE clause] | (<table_hint_limited> […n]) | [with option lock_mode (special locked mode)] |
| view_name [ [AS] table_alias] | ||
| rowset_function_limited | ||
} | ||
[ FROM {<table_source>} [,…n] ] | ||
[WHERE | ||
{ <search_condition> | ||
| { [ CURRENT OF | ||
{ | ||
{ [ GLOBAL ] cursor_name } | ||
cursor_variable_name | ||
}] | ||
} | ||
] | ||
[OPTION (<query_hint> [,…n])] | ||
说明: | ||
1. Transact-SQL支持在WHERE子句中使用子查询,FROM子句也一样。后者可以产生更有效的语句。参看“UPDATE语句”中的例子。 | ||
2. Oracle和SQLServer可以省略from语句;Symfoware不能省略from语句。使用光标时,可以删除光标名。 | ||
3. Symfoware使用with option lock_mode语句,可以指定导入删除对象数据时的数据的加锁模式。 | ||
例: | ||
Oracle | Microsoft SQ | Symfoware |
delete from (select * from test2 where aa>40) | delete from test2 where aa>40 | delete from test2 where aa>40 |
delete (select * from test2 where aa>41) | delete test2 where aa>40 | |
delete test1 where aa > | delete test1 where aa > | delete from test_1 where id > |
(select max(aa) from test) | (select max(aa) from test) | (select max(id) from test_2) |
UPDATE语句 | ||
因为Transact-SQL支持Oracle的UPDATE绝大多数语法,所以只需要很小的修改。 | ||
Oracle | Microsoft SQ | Symfoware |
UPDATE | UPDATE | Update [table_name] |
{table_name | view_name | select_statement} | {table_name [ [AS] table_alias] WITH | set column_name={value│default} |
SET [column_name(s) = {constant_value | | ( <table_hint_limited> […n]) | [where {condition│current of cursor name}] |
expression | select_statement | column_list | | view_name [ [AS] table_alias] | [with option lock_mode (special locked mode)] |
variable_list} | | rowset_function_limited | |
{where_statement} | } | |
SET | ||
{column_name = {expression | DEFAULT | NULL} | ||
| @variable = expression | ||
| @variable = column = expression } [,…n] | ||
{{[FROM {<table_source>} [,…n] ] | ||
[WHERE | ||
<search_condition>] } | ||
| [WHERE CURRENT OF | ||
{ { [GLOBAL] cursor_name } | cursor_variable_name} | ||
] } [OPTION (<query_hint> [,…n] )] | ||
说明: | ||
1. Symfoware使用with option lock_mode语句,可以指定导入刷新对象数据时的数据加锁模式或者不指定锁。 | ||
2. Transact-SQL的UPDATE语句不支持依赖SELECT语句的更新操作。如果Oracle程序这样做了,可以把SELECT语句变成一个视图,然后在SQL Server的UPDATE语句中使用这个视图名字。 | ||
3. SymfoWare中要更新的字段前不可以跟表名,但where条件中可以跟表名。 | ||
4. Transact-SQL和Oracle SQL都支持在一个UPDATE语句中使用子查询。但是Transact-SQL的FROM子句可以用来创建一个基于节点的UPDATE。这个能力是你的UPDATE语法更加可读并且在某种意义上提高了性能。 | ||
Oracle | Microsoft SQ | Symfoware |
DECLARE | DECLARE | |
VAR1 NUMBER(10,2); | @VAR1 NUMERIC(10,2) | |
BEGIN | SELECT @VAR1 = 2500 | |
VAR1 := 2500; | UPDATE STUDENT_ADMIN.STUDENT | |
UPDATE STUDENT_ADMIN.STUDENT | SET TUITION_TOTAL=@VAR1 | |
SET TUITION_TOTAL = VAR1; | ||
END; | ||
UPDATE STUDENT_ADMIN.STUDENT S | UPDATE STUDENT_ADMIN.STUDENT S | UPDATE STUDENT_ADMIN.STUDENT S |
SET TUITION_TOTAL = 1500 | SET TUITION_TOTAL = 1500 | SET TUITION_TOTAL = 1500 |
WHERE SSN IN (SELECT SSN | WHERE SSN IN (SELECT SSN | WHERE SSN IN (SELECT SSN |
FROM GRADE G | FROM GRADE G | FROM GRADE G |
WHERE G.SSN = S.SSN | WHERE G.SSN = S.SSN | WHERE G.SSN = S.SSN |
AND G.CCODE = '1234') | AND G.CCODE = '1234') | AND G.CCODE = '1234') |
UPDATE (SELELCT AA | FROM clause: | |
FROM TEST | ||
WHERE AA=88) | UPDATE | |
SET AA=66 | STUDENT_ADMIN.STUDENT S | |
SET TUITION_TOTAL = 1500 | ||
FROM GRADE G | ||
WHERE S.SSN = G.SSN | ||
AND G.CCODE = '1234' | ||
模式匹配 | ||
Oracle | Microsoft SQ | Symfoware |
SELECT * FROM STUDENT_ADMIN.STUDENT | SELECT * FROM STUDENT_ADMIN.STUDENT | SELECT * FROM STUDENT_ADMIN.STUDENT |
WHERE LNAME LIKE 'A%' | WHERE LNAME LIKE '[ABC]%' | WHERE LNAME LIKE 'A%' |
OR LNAME LIKE 'B%' | OR LNAME LIKE 'B%' | |
OR LNAME LIKE 'C%' | OR LNAME LIKE 'C%' | |
说明: | ||
1. SQL Server的LIKE关键字提供了有用的通配符搜索功能;在Oracle中不支持这个功能;Symfoware只支持标准sql中的通配符。 | ||
2. 除了所有的RDBMS都支持的(%)和(_)通配符以外,SQL Server还支持([ ])和([^])通配符。 | ||
([ ])字符用来查询在一个范围内的所有单个字符。例如,如果你需要查询包含一个从a到f的字符的数据,你可以这样写:“LIKE '[a-f]'”或者“LIKE '[abcdef]'”。 | ||
([^])通配符用来标记那些不在特定范围内的字符。例如,如果除了a到f以外的所有字符都是可以接受的,你可以这样书写:LIKE '[^a - f]'或者LIKE '[^abcdef]'。 | ||
用SELECT语句创建表: | |||
Oracle | Microsoft SQ | Symfoware | |
CREATE TABLE newtable | SELECT * | ----------- | |
AS SELECT * FROM oldtable | INTO newtable FROM oldtable | ||
要点: | |||
1. SQLServer中,要SELECT…INTO能够起作用,必须将使用该程序的数据库的选项select into/bulkcopy设定为true。 | |||
2. SymfoWare中建表语句必须包含 ON TABLE_SPACE | |||
例:CREATE TABLE NEWTEST (ID NUMERIC(7) , NAME VARCHAR(30) , BIRTH DATE) ON ESMSPACE1 | |||
序列: | |||
Oracle | Microsoft SQ | Symfoware | DBServer |
有 | 无 | 有 | |
create sequence sequence_name | create table | create sequence sequence_name | |
sequence_table_name (id integer) | |||
insert into sequence_table_name | |||
values (initialValue) | |||
select sequence_name.nextval | select id from sequence_table_name | select seq_test.nextval | getNextID(Connection , String ) |
from dual | update sequence_table_name | from rdbii_system.rdbii_assisttable | |
set id=newValue | |||
要点: | |||
对于有序列概念的数据库直接创建序列来取得主键,没有序列概念的数据库使用一个一行一列的表来存储主键值,每次取得后 | |||
要更新这个值。这些操作都封装在getNextID方法中直接调用这个方法即可得到主键值。 | |||
TRUNCATE TABLE语句: | |||
在Oracle和Microsoft SQL Server中TRUNCATE TABLE语句的语法是相似的。TRUNCATE TABLE语句用来把一个表中的所有行清除掉,并且这个操作是不能后滚的。该表的结构和索引仍然存在。DELETE触发器不会被执行。如果该表被一个FOREIGN KEY引用,则该表不能被砍掉。 | |||
Oracle | Microsoft SQ | Symfoware | |
TRUNCATE TABLE table_name | TRUNCATE TABLE table_name | rdbfmt(-mid) | |
[{DROP | REUSE} STORAGE] | |||
1. 在SQL Server中,这个语句只能由表的所有者给出。 在Oracle中,只有当你是表的所有者或者有DELETE TABLE系统特权时才能使用该语句。 |
|||
2. Oracle的TRUNCATE TABLE命令可以随意的释放被表中的行占据的存储空间。 SQL Server的 TRUNCATE TABLE则总是回收被表中的数据和与之关联的索引占据的空间。 |
|||
连接子句(Join clauses) | |||
Microsoft SQL Server 7.0允许在一个连接子句中连接多达256个表,包括临时的和永久的表。在Oracle中,没有连接限制。 | |||
在Oracle中使用外部连接时,外部连接操作符(+)典型的放置在子列(foreign key)的后面。(+)依靠少数几个唯一值来识别该列。除非子列允许空值,否则总是这样的。如果子列允许空值,则(+)被放置在父列(PRIMARY KEY或者UNIQUE约束)上。你不能把(+)同时放在等号(=)的两边。 | |||
用SQL Server,你可以使用(*=)和(=*)外部连接操作符。(*)用来标识一个有很多唯一值的列。如果子列不允许空值,则(*)被放在等号的父列一边。在Oracle中,(*)的放置正好相反。不能把(*)同时放在等号的两边。 | |||
(*=)和(=*)被认为是传统的连接操作符。SQL Server也支持下面列出的SQL-92标准的连接操作符。建议你使用这种语法。SQL-92标准语法比(*)操作符更强大,限制更小。 | |||
Join操作 | 描述 | ||
CROSS JOIN | 这是两个表的交叉产物。如果在一个旧式的连接中没有指定WHERE子句,则返回同一行。在Oracle中,这种类型的连接叫做笛卡儿连接。 | ||
INNER | 该连接指定返回所有的内部行。任何不匹配的行将被丢弃。该连接同一个标准的Oracle表连接是一样的。 | ||
LEFT[OUTER] | 这种类型的连接指定返回右边表的所有外部行,即使没有发现任何匹配行。该操作符同Oracle外部连接(+)是一样的。 | ||
RIGHT[OUTER] | 这种类型的连接指定返回左边表的所有外部行,即使没有发现任何匹配行。该操作符同Oracle外部连接(+)是一样的。 | ||
FULL [OUTER] | 如果来自任一表的一行不匹配选择标准,指定该行被包括到结果集中,并且它的符合其它表的输出列被设定为NULL。这和把Oracle外部连接操作符放在“=”的两端是一样的(col1(+) = col2(+)),而在Oracle中,这是不允许的。 | ||
下面的例子返回所有学生都要上的课程的一个清单。在学生表和年级表之间定义的外部连接允许显示所有的学生,甚至那些没有参加任何课程的学生。在课程表上也有一个外部连接,该连接返回课程名字。如果课程表上没有加上外部连接,则不会返回那些没有参加任何课程的学生,因为他们的课程代码(CCDOE)是空值。 | |||
Oracle | Microsoft SQServer | Symfoware | DBServer |
SELECT S.SSN AS SSN, | SELECT S.SSN AS SSN, | SELECT S.SSN AS SSN, | isSupportSQL92OuterJoin() |
FNAME, LNAME | FNAME, LNAME | FNAME, LNAME | |
FROM STUDENT_ADMIN.STUDENT S, | FROM STUDENT_ADMIN.GRADE G | FROM STUDENT_ADMIN.GRADE G | |
DEPT_ADMIN.CLASS C, | RIGHT OUTER JOIN | RIGHT OUTER JOIN | |
STUDENT_ADMIN.GRADE G | STUDENT_ADMIN.STUDENT S | STUDENT_ADMIN.STUDENT S | |
WHERE S.SSN = G.SSN(+) | ON G.SSN = S.SSN | ON G.SSN = S.SSN | |
AND G.CCODE = C.CCODE(+) | LEFT OUTER JOIN | LEFT OUTER JOIN | |
DEPT_ADMIN.CLASS C | DEPT_ADMIN.CLASS C | ||
ON G.CCODE = C.CCODE | ON G.CCODE = C.CCODE | ||
说明: | |||
编写SQL连接语句时,首先要调用isSupportSQL92OuterJoin()方法判断要操作的数据库系统是否支持SQL92标准的外联接 |
条件测试 | ||||
Oracle的DECODE语句和Microsoft SQL Server的CASE表达式都执行条件测试。当test_value中的值和后面的任何表达式匹配的时候,相关的值就返回。如果没有找到任何匹配的值,就返回default_value。如果没有指定default_value,在没有匹配的时候,DECODE和CASE都返回一个NULL。下表显示了该语句的语法,同时给出了转换DECODE命令的示例。 | ||||
Oracle | Microsoft SQ | Symfoware | ||
DECODE (test_value, | CASE input_expression | ??? | ||
expression1, value1 | WHEN when_expression THEN result_expression | |||
[[,expression2, value2] […]] | [[WHEN when_expression THEN result_expression] [...]] | |||
[,default_value] | [ELSE else_result_expression] | |||
) | END | |||
CREATE VIEW STUDENT_ADMIN.STUDENT_GPA | CREATE VIEW STUDENT_ADMIN.STUDENT_GPA | |||
(SSN, GPA) | (SSN, GPA) | |||
AS SELECT SSN, ROUND(AVG(DECODE(grade | AS SELECT SSN, ROUND(AVG(CASE grade | |||
,'A', 4 | WHEN 'A' THEN 4 | |||
,'A+', 4.3 | WHEN 'A+' THEN 4.3 | |||
,'A-', 3.7 | WHEN 'A-' THEN 3.7 | |||
,'B', 3 | WHEN 'B' THEN 3 | |||
,'B+', 3.3 | WHEN 'B+' THEN 3.3 | |||
,'B-', 2.7 | WHEN 'B-' THEN 2.7 | |||
,'C', 2 | WHEN 'C' THEN 2 | |||
,'C+', 2.3 | WHEN 'C+' THEN 2.3 | |||
,'C-', 1.7 | WHEN 'C-' THEN 1.7 | |||
,'D', 1 | WHEN 'D' THEN 1 | |||
,'D+', 1.3 | WHEN 'D+' THEN 1.3 | |||
,'D-', 0.7 | WHEN 'D-' THEN 0.7 | |||
,0)),2) | ELSE 0 | |||
FROM STUDENT_ADMIN.GRADE | END),2) | |||
GROUP BY SSN | FROM STUDENT_ADMIN.GRADE | |||
GROUP BY SSN | ||||
CASE表达式可以支持用SELECT语句执行布尔测试,这是DECODE命令所不允许的。欲了解关于CASE表达式的详细信息,请参阅SQL Server联机手册。 |
用户定义函数 | |||
Oracle | Microsoft SQServer | Symfoware | DBServer |
SELECT SSN, FNAME, LNAME, ) TUITION_PAID, | SELECT SSN, FNAME, LNAME, TUITION_PAID, TUITION_PAID/SUM_MAJOR AS PERCENT_MAJOR | Symfoware中的用户定义方法内不能写sql语句 | isSupportUserDefinedFunction() |
TUITION_PAID/GET_SUM_ | FROM STUDENT_ADMIN.STUDENT, | ||
MAJOR(MAJOR) | (SELECT MAJOR, SUM(TUITION_PAID) SUM_MAJOR | getCallFunctionSqlString( | |
AS PERCENT_MAJOR | FROM STUDENT_ADMIN.STUDENT | String strFunctionName, | |
FROM STUDENT_ADMIN.STUDENT | GROUP BY MAJOR) SUM_STUDENT | String[] strParamNames) | |
WHERE STUDENT.MAJOR = SUM_STUDENT.MAJOR | |||
CREATE OR REPLACE FUNCTION GET_SUM_MAJOR | No CREATE FUNCTION syntax is required; use CREATE PROCEDURE syntax. | ||
(INMAJOR VARCHAR2) RETURN NUMBER | |||
AS SUM_PAID NUMBER; | |||
BEGIN | |||
SELECT SUM(TUITION_PAID) INTO SUM_PAID | |||
FROM STUDENT_ADMIN.STUDENT | |||
WHERE MAJOR = INMAJOR; | |||
RETURN(SUM_PAID); | |||
END GET_SUM_MAJOR; | |||
说明: | |||
要使用数据库的用户自定义函数(过程)前,首先要调用isSupportUserDefinedFunction()判断该数据库系统是否支持这种操作。如果支持,则可以使用getCallFunctionSqlString(functionName,paramterNames)得到调用用户自定义函数的sql语句 | |||
把值转换为不同的数据类型 | |||
Microsoft SQL Server的CONVERT和CAST函数都是多目标转换函数。它们提供了相似的功能,把一种数据类型的表达式转换为另一种数据类型的表达式,并且支持多种专门数据的格式。 | |||
CAST(expression AS data_type) | |||
CONVERT (data type[(length)], expression [, style]) | |||
CAST是一个SQL-92标准的函数。这些函数执行同Oracle的TO_CHAR、TO_NUMBER、TO_DATE、HEXTORAW以及RAWTOTEXT函数相同的功能。 | |||
这里所指的数据类型是任何表达式将被转换成为的系统数据类型。不能使用用户定义的数据类型。长度参数是可选的,该参数用于char、varchar、binary以及varbinary数据类型。允许的最大长度是8000。 | |||
转换 | Oracle | Microsoft SQServer | Symfoware |
字符到数字 | TO_NUMBER('10') | CONVERT(numeric, '10') | cast |
数字到字符 | TO_CHAR(10) | CONVERT(char, 10) | ------- |
字符到日期 | TO_DATE('04-JUL-97') | CONVERT(datetime, '04-JUL-97') | Cnv_date |
TO_DATE('04-JUL-1997', | CONVERT(datetime, '04-JUL-1997') | ||
'dd-mon-yyyy') | CONVERT(datetime, 'July 4, 1997') | ||
TO_DATE('July 4, 1997', | |||
'Month dd, yyyy') | |||
日期到字符 | TO_CHAR(sysdate) | CONVERT(char, GETDATE()) | Cnv_char |
TO_CHAR(sysdate, 'dd mon yyyy') | CONVERT(char, GETDATE(), 106) | ||
TO_CHAR(sysdate, 'mm/dd/yyyy') | CONVERT(char, GETDATE(), 101) | ||
16进制到2进制 | HEXTORAW('1F') | CONVERT(binary, '1F') | ------- |
2进制到16进制 | RAWTOHEX | CONVERT(char, binary_column) | ------- |
(binary_column) | |||
请注意字符串是怎样转换为日期的。在Oracle中,缺省的日期格式模型是“DD-MON-YY”如果你使用任何其它格式,你必须提供一个合适的日期格式模型。CONVERT函数自动转换标准日期格式,不需要任何格式模型。 | |||
从日期转换到字符串时,CONVERT函数的缺省输出是“dd mon yyyy hh:mm:ss:mmm(24h)”。用一个数字风格代码来格式化输出,使它能输出为其它类型的日期格式模型。欲了解CONVERT函数的详细信息,请参阅SQL Server联机手册。 | |||
下表显示了Microsoft SQL Server日期的缺省输出。 | |||
Without Century | With Century | Standard | Output |
- | 0 or 100 (*) | Default | mon dd yyyy hh:miAM (or PM) |
1 | 101 | USA | mm/dd/yy |
2 | 102 | ANSI | yy.mm.dd |
3 | 103 | British/French | dd/mm/yy |
4 | 104 | German | dd.mm.yy |
5 | 105 | Italian | dd-mm-yy |
6 | 106 | - | dd mon yy |
7 | 107 | - | mon dd, yy |
8 | 108 | - | hh:mm:ss |
- | 9 or 109 (*) | Default milliseconds | mon dd yyyy hh:mi:ss:mmm (AM or PM) |
10 | 110 | USA | mm-dd-yy |
11 | 111 | Japan | yy/mm/dd |
12 | 112 | ISO | yymmdd |
- | 13 or 113 (*) | Europe default | dd mon yyyy hh:mm:ss:mmm(24h) |
14 | 114 | - | hh:mi:ss:mmm(24h) |