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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章