SQL Server与oracle两者区别之语法区别

 

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. (1)建立测试数据表。
  2. CREATE TABLE TEST
  3. (
  4. ID NUMBER,
  5. NAME VARCHAR2(20),
  6. PRIMARY KEY(ID)
  7. );
  8. (2)创建序列。
  9. CREATE SEQUENCE SEQ_TEST;
  10. (3)创建触发器。
  11. CREATE OR REPLACE TRIGGER AUTOINCREMENT
  12. BEFORE INSERT ON TEST
  13. FOR EACH ROW
  14. WHEN (NEW.ID IS NULL)
  15. BEGIN
  16. SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;
  17. END;
  18. (4)插入数据。
  19. INSERT INTO TEST(NAME) VALUES('NAME1');
  20. (5)查看插入结果。
  21. 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语句不能使用@符号,以冒号":"代替,如:

 

  1. --Sql Server的Sql 语句
  2. insert into Table (Column1,Column2) values (@Value1,@Value2)
  3. --Oracel中的Sql 语句
  4. Insert Into Table (Column1,Column2) values (:Value1,:Value2)

 

3.存储过程的不同

Oracle中的存储过程叫做包(Packages),一个包分为包头和包体,类似于C++中的类声明。包头定义了存储过程的名称和参数,包体除了名称和参数,还包括存储过程的所有语句。与SQL Server不同,在Oracle中存储过程一般写成Function,而不是Procedure。Oracle存储过程并不直接返回记录集,记录集以游标的形式通过参数返回。一个包(Packages)可以包含多个存储过程,使用存储过程时采用"包名.存储过程名"的方式,下面是一个典型的Oracle存储过程,它位于名称为"Test"的包(Packages)中,它的使用方式应为Test.GetList。

 

  1. Function GetList(keywords In varchar2,p_info_list_Cursor out

     

    get_data_cur_type)

  2.      Return Number
  3. As
  4. Begin
  5.         open p_info_list_Cursor For
  6.         Select * from Test where Key=keywords
  7. ;
  8.          Return 0;
  9. 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])]

注意:删除记录并不能释放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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值