1.
SQL Server:
Oracle:
Select top 1 * from tablename
Select * from tablename where rownum < 2
Select A.*, B.* from A left Join B on A.bh=B.bh
Select A.*, B.* from A, B where A.bh=B.bh(+)
Select A.*, B.* from A right join B where A.bh=B.bh //oracle 9i 以后也支持了
Select A.*, B.* from A, B where A.bh(+)=B.bh
Select * from tablename where lrsj >= ‘2002-11-11’
Select * from tablename where lrsj>= to_date(‘2002-11-11’,’yyyy-mm-dd’)
Select getdate()
Select sysdate from dual
Select Field1+Field2 from A
Select Field1 || Field2 from A (指字符串的)
Oracle和SQL Server的语句区别
1.Oracle如何实现自增列
如果你一直都是用SQL Server作为开发数据库的,而新的项目需要使用Oracle数据库,那么你会突然发现SQL Server和Oracle还是有着很大的差别的。首先,我在SQL Server中用得很顺手的自增长字段就在Oracle中找不到了,取而代之,Oracle可以用序列来实现。示例如下。
- (1)建立测试数据表。
- CREATE TABLE TEST
- (
- ID NUMBER,
- NAME VARCHAR2(20),
- PRIMARY KEY(ID)
- );
- (2)创建序列。
- CREATE SEQUENCE SEQ_TEST;
- (3)创建触发器。
- CREATE OR REPLACE TRIGGER AUTOINCREMENT
- BEFORE INSERT ON TEST
- FOR EACH ROW
- WHEN (NEW.ID IS NULL)
- BEGIN
- SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;
- END;
- (4)插入数据。
- INSERT INTO TEST(NAME) VALUES('NAME1');
- (5)查看插入结果。
- SELECT * FROM TEST;
2.Parameter的区别
在SQL Server中我们可以按以下方式使用SQL语句:"Insert into Table (Field1,field2) values(@Value1,@Value2)",然后我们再new 几个Paramter:new SqlParameter("@Value1",value)...
在查询字符串中使用@+字符来描述参数,在SqlParameter中的参数名也要使用"@"符号。而在Oracle中SQL语句不能使用@符号,以冒号":"代替,如:
- --Sql Server的Sql 语句
- insert into Table (Column1,Column2) values (@Value1,@Value2)
- --Oracel中的Sql 语句
- Insert Into Table (Column1,Column2) values (:Value1,:Value2)
3.存储过程的不同
Oracle中的存储过程叫做包(Packages),一个包分为包头和包体,类似于C++中的类声明。包头定义了存储过程的名称和参数,包体除了名称和参数,还包括存储过程的所有语句。与SQL Server不同,在Oracle中存储过程一般写成Function,而不是Procedure。Oracle存储过程并不直接返回记录集,记录集以游标的形式通过参数返回。一个包(Packages)可以包含多个存储过程,使用存储过程时采用"包名.存储过程名"的方式,下面是一个典型的Oracle存储过程,它位于名称为"Test"的包(Packages)中,它的使用方式应为Test.GetList。
- Function GetList(keywords In varchar2,p_info_list_Cursor out
get_data_cur_type)
- Return Number
- As
- Begin
- open p_info_list_Cursor For
- Select * from Test where Key=keywords
- ;
- Return 0;
- End;
1、基本SQL语句的区别
l SELECT 语句
l SQL Server 不支持 Oracle 的 INTERSECT 和 MINUS 集合运算符。可使用 SQL Server EXISTS 和 NOT EXISTS 子句,实现相同的结果。
下面两条语句返回的数据是相同的。
Oracle(返回两个查询都有的行) |
Microsoft SQL Server |
SELECT CCODE, CNAME FROM DEPT INTERSECT SELECT C.CCODE, C.CNAME FROM STUDENT G, DEPT C WHERE C.CCODE = G.CCODE |
SELECT CCODE, CNAME FROM DEPT C WHERE EXISTS (SELECT * FROM STUDENT G WHERE C.CCODE = G.CCODE) |
下面两条语句返回的数据是相同的。
Oracle |
Microsoft SQL Server |
SELECT CCODE, CNAME FROM DEPT MINUS SELECT C.CCODE, C.CNAME FROM STUDENT G, DEPT C WHERE C.CCODE = G.CCODE |
SELECT CCODE, CNAME FROM DEPT C WHERE NOT EXISTS (SELECT * FROM STUDENT G WHERE C.CCODE = G.CCODE) |
l 将 SELECT 语句做为表名使用
Microsoft SQL Server 和 Oracle 均支持在执行查询时,把 SELECT 语句作为表的来源使用。SQL Server 需要一个别名;Oracle别名的使用是可选的。
Oracle |
Microsoft SQL Server |
SELECT SSN,LNAME,SUM_PAID FROM STUDENT, (SELECT SUM(TUITION) SUM_PAID FROM STUDENT) |
SELECT SSN, LNAME,SUM_PAID FROM STUDENT, (SELECT SUM(TUITION) SUM_PAID FROM STUDENT) SUM_STUDENT |
l INSERT 语句
T-SQL 语言支持对表和视图的插入,但不支持对 SELECT 语句的 INSERT 操作。如果 Oracle 应用程序代码执行对 SELECT 语句的插入操作,则必须对它进行修改。如:
Oracle |
Microsoft SQL Server |
INSERT INTO (SELECT SSN, CCODE, GRADE FROM GRADE) VALUES ('11', '1111',NULL) |
INSERT INTO GRADE (SSN, CCODE, GRADE) VALUES ('11', '1111',NULL) |
Transact-SQL values_list 参数提供了 SQL-92 标准关键字 DEFAULT,但 Oracle 不支持。此关键字指定了执行插入操作时使用列的默认值。如果指定列的默认值不存在,则插入 NULL。如果该列不允许 NULL,则返回一个错误消息。如果该列数据类型定义为 timestamp,则插入下一个有序值。
l DELETE 语句
如果要对 Oracle 中的 SELECT 语句执行删除操作,则必须修改 SQL Server 语法,因为 Transact-SQL 不支持这一功能。 Transact-SQL 支持在 WHERE 子句中使用子查询,以及在 FROM 子句中使用联接。后者可产生更有效的语句。请参见后面“UPDATE 语句”中的示例。
Oracle |
Microsoft SQL Server |
DELETE [FROM] {table_name | view_name | select_statement} [WHERE clause] |
DELETE [FROM ] { table_name [ [AS] table_alias] WITH ( <table_hint_limited> [Un]) | view_name [ [AS] table_alias] | rowset_function_limited } [ FROM {<table_source>} [,Un] ] [WHERE { <search_condition> | { [ CURRENT OF { { [ GLOBAL ] cursor_name } cursor_variable_name } ] } ] [OPTION (<query_hint> [,Un])] |
l EXISTS
Oracle |
Microsoft SQL Server |
在SQL*PLUS中不能正确执行这条语句: BEGIN IF EXISTS (SELECT * FROM ONLINEUSER) THEN DBMS_OUTPUT.PUT_LINE('OK'); END IF; END; |
在查询分析器中能正确地执行这条语句:
IF EXISTS (SELECT * FROM ONLINEUSER) PRINT('OK')
|
2、表数据复制
l 库内数据复制
MS SQL Server
Insert into 复制表名称 select语句 (复制表已存在)
Select 字段列表 into 复制表名称 from 表(复制表不存在)
Oracle
Insert into 复制表名称 select语句(复制表已存在)
create table 复制表名称 as select语句(复制表不存在)
l 文本文件转入、转出的批量处理
MS SQL Server
BCP命令行程序
Oracle
SQLLDR命令行程序
3、表数据更新
l 根据其它表数据更新你要更新的表。
MS SQL Server
Update A SET 字段1=B字段表达式 字段2=B字段表达式
From B WHERE 逻辑表达式
如:
UPDATE titles SET ytd_sales = t.ytd_sales + s.qty
FROM titles t, sales s
WHERE t.title_id = s.title_id
AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)
Oracle
Update A SET 字段1=(select 字段表达式 from B WHERE) 字段2=(select 字段表达式 from B WHERE) WHERE 逻辑表达式
假如A需要多个字段更新,显然MS SQL 语句更简练。
l T-SQL UPDATE 语句不支持对 SELECT 语句的更新操作。
如果 Oracle 应用程序代码对 SELECT 语句进行更新,则可以把 SELECT 语句转换成一个视图,然后在 SQL Server UPDATE 语句中使用该视图名称。请参见前面“INSERT 语句”中的示例。
Oracle UPDATE 命令只能使用一个 PL/SQL 块中的程序变量。而Transact-SQL 语言并不需要使用块。 如下图:
Oracle |
Microsoft SQL Server |
DECLARE VAR1 NUMBER(10,2); BEGIN VAR1 := 2500; UPDATE STUDENT SET TUITION = VAR1; END; |
DECLARE @VAR1 NUMERIC(10,2) SELECT @VAR1 = 2500 UPDATE STUDENT SET TUITION =@VAR1 |
在 SQL Server 中,DEFAULT 关键字可用于将一列设为其默认值。但不能使用 Oracle UPDATE 命令,将一列设为默认值。
Transact-SQL 和 Oracle SQL 均支持在 UPDATE 语句中使用子查询。但是,Transact-SQL FROM 子句可用来创建一个基于联接的 UPDATE。这一功能使 UPDATE 语法可读性更好,在某些情况下还能改善性能。
Oracle |
Microsoft SQL Server |
UPDATE STUDENT S SET TUITION = 1500 WHERE SSN IN (SELECT SSN FROM GRADE G WHERE G.SSN = S.SSN AND G.CCODE = '1234') |
Subquery: UPDATE STUDENT S SET TUITION = 1500 WHERE SSN IN (SELECT SSN FROM GRADE G WHERE G.SSN = S.SSN AND G.C
|