1.
SQL Server:
Oracle:
Select top 1 * from tablename
Select * from tablename where rownum
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 ( [Un])
| view_name [ [AS] table_alias]
| rowset_function_limited
}
[ FROM {} [,Un] ]
[WHERE
{
| { [ CURRENT OF
{
{ [ GLOBAL ] cursor_name }
cursor_variable_name
}
]
}
]
[OPTION ( [,Un])]
注意:删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些被删除的数据块标成unused.如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间 TRUNCATE TABLE 表名,但此操作不可回退。
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')
注:在Oracle中函数或伪列 'EXISTS' 只能在 SQL 语句中使用
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