1. 程式人生 > >Oracle和MySQL在SQL語句方面的區別

Oracle和MySQL在SQL語句方面的區別

因為公司的系統同時使用到了Oracle和MySQL資料庫,經常在編寫SQL時會遭遇不相容問題,在此進行整理和總結。

1 資料型別

MySQL

Oracle

Note

int/double

number

數值型

varchar

varchar2

小文字型

text

varchar2

對於普通文字大於255,且小於4000的列

text

blob

對於大於4000的comment

longblob

blob

2 表

2.1 建立表(同)

create table tableName(

columnName1 int,

columnName2 int

)

2.2 刪除表(異)

MySQL:

drop table if exists tableName

Oracle:

drop table tableName

注:Oracle沒有if exists關鍵字,也沒用類似if existsSQL語法。

3 列

3.1 新增列(異)

MySQL:

A. alter table tableNameadd columncolumnName1 int;

B. alter tabletableNameadd columncolumnName1 intadd columncolumnName2 int;

注:其中關鍵字column可有可無。

Oracle:

A. alter tabletableName add columnName1 int;

B. alter tabletableName add (columnName1 int);

C. alter table tableName add (columnName1 int, columnName2 int); 

注:對於A,只有新增單列的時候才可使用,對於新增多列時需要使用C,不能像MySQL那樣重複使用add column關鍵字。

3.2 刪除列(異)

MySQL:

A. alter tabletableName drop column columnName1

B. alter table

tableName drop column columnName1, drop column columnName2

注:其中關鍵字column可有可無。

Oracle:

A. alter table tableNamedrop column columnName2

B. alter tabletableName drop (columnName1)

C. alter table tableName drop (columnName1,columnName2)

注:對於A,只有刪除單列的時候才可使用,對於刪除多列時需要使用C,不能像MySQL那樣重複使用drop column關鍵字。

3.3 修改列名(異)

MySQL:

alter table tableName change column columnNameOld columnNameNew columnType;

Oracle:

alter table tableName rename column columnNameOld to columnNameNew;

3.4 修改列型別(說明)

Oracle中,在列有資料的時候,無法修改列型別;沒有資料時可以。

MySQL中,無論列是否有資料都可以修改列型別。

但是當有資料是,直接修改列型別都可能對資料造成丟失等,所以一般需要結合具體的業務來對列資料做處理後,再修改列型別型別。所以修改列的型別並非使用SQL語句進行一步到位的修改,而是通過以下流程:

A. 新增臨時列

B. 將需要更改的列的值經過型別轉換的驗證後,賦值給臨時列

C. 刪除原有列

D. 將臨時列的列名修改為原有列列名

4 索引

在整個資料庫內,MySQL的索引可以同名,也就是說MySQL的索引是表級別的;但是Oracle索引不可以同名,也就是說Oracle的索引是資料庫級別的。

4.1 建立索引(同)

create indexindexName on tableName (columnName);

4.2 刪除索引(異)

MySQL:

alter tabletableName drop indexindexName

Oracle:

drop indexindexName

4.3 查詢表的索引(異)

MySQL:

show index fromtableName

Oracle:

select index_name, table_name, column_name from user_ind_columns where table_name=' tableName ' 

5 空字串問題

Oracle中空字串''就是null(也就是說,只有null,沒有空字元),而MySQL是區分null和''的。

對於使用語句:select * from table1 where user_name <> ''來查詢列user_name不為空(不為null且不為空字元)時,Oracle會查不出任何結果,而MySQL可以正常執行。這裡MySQL之所以可以得到正確結果,還因為比較符號<>會先將列為null的內容進行過濾,然後再比較內容是否為空字串。

這就要求一方面,以後在編寫程式碼的時候,儘量保證不會往資料庫插入空字串''這樣的值,要麼保持有資料,要麼保持為null。另外,對於MySQL中已經同時存在Null和''時,所有判斷是否為null或者''的地方改為判斷列的長度是否為0。

6 Left Join + Order By問題

對於以下SQL:

SELECT * FROM ( 
SELECT DISTINCT v.fld_name,v.BASIN_NAME,v.COUNTRY,v.REGION,v.OPR_CMPNY,v.main_hc_type,v.fld_id,uf.username,v.fld_id as resource_id 
FROM integrated_fld_view v, user_fldid uf, repax_udm_user_info ruui
WHERE ...(省略)

ORDER BY v.MAIN_HC_TYPE ASC ,v.FLD_NAME
) a
LEFT JOIN (SELECT in_faks, resource_id FROM user_filter_status WHERE username = 'XXX:200202030002') ufs ON ufs.resource_id = a.resource_id

MySQL能夠正確的被Order By進行排序,而Oracle則不行,必須要把放在第一個子查詢中的Order By語句提取出來放到整個SQL的最後才可以,原因終於查清楚了:是因為使用了DISTINCT關鍵字的緣故,有這個關鍵字Order By裡面的列必須出現在Select裡面。

7 AS關鍵字

在為表名或者列名定義別名時,我們會使用到AS關鍵字:

SELECT DISTINCT v.fld_name,v.main_hc_type,v.fld_id,uf.username,v.fld_id as resource_id,ruui.company 
FROM integrated_fld_view as v, user_fldid as uf, repax_udm_user_info as ruui

上面的SQL在MySQL中能夠正確執行,但是在Oracle中不能:因為Oracle中為表取別名時不需要也不能加AS關鍵字。

實際上在MySQL和Oracle中定義表或者列別名時,都可以不使用AS關鍵字,只要有一個空格即可:

SELECT DISTINCT v.fld_name,v.main_hc_type,v.fld_id,uf.username,v.fld_id resource_id,ruui.company 
FROM integrated_fld_view v, user_fldid uf, repax_udm_user_info ruui

相關推薦

PHP中includerequire語句區別

warning mar 處理 生成 區別 war 插入 php 通過 通過 include 或 require 語句,可以將 PHP 文件的內容插入另一個 PHP 文件(在服務器執行它之前)。 include 和 require 語句是相同的,除了錯誤處理方面:

選擇結構if語句switch語句區別

sys oid 建議 查詢 ron span .cn scan blog 1.選擇結構if語句格式及其使用 A:if語句的格式:    if(比較表達式1) {      語句體1;   }else if(比較表達式2) {      語句體2;   }else if(

sql中inexist語句區別?(補充了left joinright join)

有用 表數 from 部分匹配 exist 循環 targe 從表 exists in和exists(摘錄自百度)in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。如果兩個表中一個較小,一個是大表,則子查詢表大的用

break語句continue語句區別

break語句: 可以用在switch語句中,跳出switch語句 特點: 1.可以用在迴圈,可以退出本層迴圈(距離最近的原則) 2.break之後的語句不會執行 while(true) { if(true) { break; //

java:breakcontinue語句區別--基礎篇

1.Break語句:      break用於強行退出迴圈,不執行迴圈中剩餘的語句 【示例1-1】break語句 public static void main(String[] args) { int cunt = 0;

總結ORACLEMYSQL的一些區別

一、ORACLE是大型資料庫,MYSQL是中小型資料庫 二、ORALCE支援高併發、大訪問量,是OLTP最好的工具 三、ORACLE和MYSQL操作上面的一些區別: ①:MYSQL一般使用的是自動增長型別,在建立表的時候只要指定主鍵為auto increment,插入記錄時

accessSQL語句區別

1、對於日期欄位欄位 access表示為1,對於日期欄位欄位access表示為:#1981-28-12#:#1981-28-12# SQLSERSQLSERVER2000表示為:‘‘1981-02-12‘‘2、SQL語句區別,select ,update 在對單表操作時都差

OracleMySQL在SQL語句方面區別

因為公司的系統同時使用到了Oracle和MySQL資料庫,經常在編寫SQL時會遭遇不相容問題,在此進行整理和總結。 1 資料型別 MySQL Oracle Note int/double number 數值型 varchar varchar

OracleMySQL刪除語句的一個區別

-c fff mysq delete 刪除 ron ffffff spa 刪除語句 Oracle: DELETE * FROM 表; OK DELETE FROM 表; OK DELETE 表1,表2 FROM 表1,表2; WRONG MySQL: D

Oraclemysql的區別

oracle和myslq的區別一、數據庫的主要類型 數據庫類型主要可分為:網狀數據庫、關系數據庫、樹狀數據庫、面向對象數據庫。在商業中最主要的是關系型數據庫,例如:Oracle、DB2、Sybase、My SQL Server、Informax、Redis、MySQL等。Oracle和mysql

include包含頭文件的語句中,雙引號尖括號的區別

標準庫 targe 搜索 環境 com tro 位置 區別 文件 include包含頭文件的語句中,雙引號和尖括號的區別 #include <>格式:引用標準庫頭文件,編譯器從標準庫目錄開始搜索 #incluce ""格式:引用非標準庫的頭文件,編譯器從用戶

JavaScript中:表達式語句區別

運算 false 第一個 ron 為我 error 直接 -- 組成 1.語句和表達式 JavaScript中的表達式和語句是有區別的.一個表達式會產生一個值,它可以放在任何需要一個值的地方,比如,作為一個函數調用的參數.下面的每行代碼都是一個表達式: myvar3

ORACLE in與exists語句區別(一)

表數 內存 全部 sel 一個 性能 where 情況 lec (轉載:https://www.cnblogs.com/iceword/archive/2011/02/15/1955337.html) select * from Awhere id in(select id

Oracle中的TruncateDelete語句

class 單獨 table ted 行記錄 www. 資源 一次 數據 Oracle中的Truncate和Delete語句 首先講一下,truncate命令: 語法:TRUNCATE TABLE table; 表格裏的數據被清空,存儲空間被

Oracle的sql語句,查詢條件加括號與不加括號區別 -

ont 執行 ora 語句 oracl lar AC rac oracle 例如: SELECT ename, job, deptno FROM emp WHERE deptno in (10, 20) AND (ename like ‘%

oracle函數NVL,NVL2NULLIF之間的區別使用

style nbsp from oracl expr nvl2 出現 圖片 null oracle用這麽幾個函數,可以幫助我們解決數據上null或0的處理 1、NVL()函數 1.1)介紹:NVL(expr1,expr2),若expr1為null, 返回expr2; 不為

oracle日期格式java日期格式區別 HH24:mm:ssHH24:mi:ss的區別

-m sys 查詢 數據查詢 uri select dual article 分鐘 轉載自:https://blog.csdn.net/yubin_yubin/article/details/18655553 在日期數據庫數據查詢出來的時候經常會to_char()一下,格式

Oracle中用sql語句建立管理表

建立語法 create table [schema.]tablename (column datatype [default expr] [constaint], ....) 查看錶結構 desc tablename 克隆表 克隆整個表: create table e

java面試問題:oracle儲存過程(procedure)函式(function)的區別

oracle儲存過程(procedure)和函式(function)的區別 儲存過程 函式 用於在資料庫中完成特定的操作或者任務(如插入、刪除等) 用於特定的資料(如選擇)

sql語句中的insert insert into 的區別?into有什麼用?

insert into tableName values(........)insert tableName (欄位名1,欄位名2,。。。)values(。。。。。。)看語句結構就知道區別了 。insert into 是直接對應表所有欄位,values裡必須包含所有欄位。insert是指定欄位對應,value