一篇文章讓Oracle DB學會MySql【未完待續】
隨筆前言:
本篇文章是針對已經能夠熟練使用Oracle數據庫的DB所寫的快速學會MySql,為什么敢這么說,是因為本人認為Oracle在功能性方面和難度方面都比MySql要高一些,所以精通Oracle的DB在學習MySql的時候,沒有必要從頭到尾再去搞一遍,只需要掌握兩者的用法區別即可。故本篇文章就針對Oracle和MySql的區別來把MySql的知識掌握住,在文章中,實例都是MySql環境下的實例,而Oracle可能知識一句話來概括,所以看本篇文章,一定要熟悉Oracle並有一定的經驗哦。
在本篇所有涉及的實例都是圍繞scott用戶/數據庫的操作。
當然了,如果你經驗豐富,在看文章的時候發現哪些是不合理的或者錯誤的,一定要留下你的見解,我在此先感謝了,下面我們就開始學習之旅吧!
一.用戶體驗角度。
從用戶體驗角度來說的話,其實MySql是稍微好一些的。
1.MySql是可以自動的將系統關鍵字改為大寫的,而Oracle不。
2.MySql可以使用tab鍵將關鍵字自動補全,而Oralce雖然有提示,但是因為它的強大性的局限,它不可能就一個tab來補全,因為選項太多,所以Oracle沒有自動補全的功能,而是可以通過提示去手選。
3.MySql的注釋可以使用"杠杠空格"和#來單行注釋、/*..*/多行注釋,Oracle多行注釋和它一樣,單行注釋只有--。
4.Oracle和MySql在代碼角度上來說都是不區分大小寫的,而在查看數據的時候確是區別的。就是MySql中的數據表示時保持你輸入時的狀態,而Oracle的數據表示時,都會把英文字母搞成大寫的。
二.存儲數據角度和創建存儲單位角度。
存儲數據角度:
- 從宏觀上來看,Oracle在存儲數據的時候,使用的是一個數據庫下面有多個用戶,用戶下面有對象等等;而MySql是一個用戶登錄上之后,有多個數據庫,每個數據庫下面有各自的對象。
- 從微觀上講,Oracle和MySql存儲一系列數據使用的是表空間,有系統給的,臨時的。每個表空間下還可以分區。
創建存儲單位角度:在這里就不說Oracle了,只說MySql。
- 創建數據庫。
CREATE DATABASE scott;
- 查看當前所有存在的數據庫,跟Oracle中的查看用戶的概念一樣。
SHOW DATABASES;
- 查看數據庫的定義。就是查看數據庫創建時語句,默認的字符編碼等。
SHOW CREATE DATABASE scott;
- 刪除數據庫。
drop database scott;
- 查看默認存儲引擎。
SHOW VARIABLES LIKE 'storage_engine';
三.常用數據類型的不同。
數據類型的差別還是挺大了,數值類型中沒有Oracle的number,字符類型中沒有Oracle的varchar2。其他常用的大致相同,MySql也有自己特有的數據類型。
MySql中的整數類型數據類型
類型名稱 | 存儲大小 | 說明 | 有符號取值范圍 | 無符號取值范圍 |
TINYINT | 1字節 | 極小整數 | -128~127 | 0~255 |
SMALLINT | 2字節 | 小整數 | -32768~-32767 | 0~65535 |
MEDIUMINT | 3字節 | 中等大小整數 | -8388608~8388607 | 0~16777215 |
INT|INTEGER | 4字節 | 普通整數 | -2147483648--2147483647 | 0-4294967295 |
BIGINT | 8字節 | 大整數 | 很大 | 很大 |
MySql中的浮點數類型數據類型
類型名稱 | 存儲大小 | 說明 | 有符號取值范圍 | 無符號取值范圍 |
FLOAT | 4字節 | 單精度 | -3.4E+38~-1.17E-38 | 0和1.17E-38~3.4E+38 |
DOUBLE | 8字節 | 雙精度 | -1.79E+308~-2.22E-308 | 0和2.22E-308~1.79+308 |
DECIMAL(M,D),DEC | M+2字節 | 定點數 | M表示總位數,D表示小數位數 | 無 |
MySql中的日期與時間類型數據類型
類型名稱 | 日期格式 | 日期范圍 | 存儲需求 |
YEAR | YYYY | 1901~2155 | 1字節 |
TIME | HH:MM:SS | -838:59:59~838:59:59 | 3字節 |
DATE | YYY-MM-DD | 1000-01-01~9999-12-3 | 3字節 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00~9999-12-3 23:59:59 | 8字節 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC | 4字節 |
MySql中的字符類型數據類型
類型名稱 | 說明 | 存儲需求 |
CHAR(M) | 固定長度 | M字節,1<=M<=255 |
VARCHAR(M) | 變長 | L+1字節,L<=M,1<=M<=255 |
TINYTEXT | 極小的非二進制字符串 | L+1字節,L<2^8 |
TEXT | 小的非二進制字符串 | L+1字節,L<2^16 |
MEDIUMTEXT | 中等大小的非二進制字符串 | L+1字節,L<2^24 |
LONGTEXT | 大的非二進制字符串 | L+1字節,L<2^32 |
ENUM | 枚舉類型,只能有一個枚舉字符串值 | 1或者2字節,最大65535 |
SET | 一個設置,字符串對象可以有0個或者多個SET成員 | 1,2,3,4,8個字節,取決於成員的數量,最多64個成員 |
char與varchar的區別。char和varchar都為4個字節的話,那么不管數據多大,都占4個字節,而varchar會根據數據所占的字節數再加1.如果數據為‘abcde’,那么char和varchar的最終結果都為‘abcd’,char為4個字節,varchar為5個字節。
MySql中的二進制數據類型
類型名稱 | 說明 | 存儲需求 |
BIT(M) | 位字段類型 | 大約(M+7)/8個字節 |
BINARY(M) | 固定長度 | M個字節 |
VARBINARY(M) | 可變長度 | M+1個字節 |
TINYBLOB(M) | 極小的BLOB | L+1字節,L<2^8 |
BLOB(M) | 小的BLOB | L+1字節,L<2^16 |
MEDIUMBLOB(M) | 中等BLOB | L+1字節,L<2^24 |
LONGBLOB(M) | 大的BLOB | L+1字節,L<2^32 |
四.對象表的不同。
- 創建表
在創建表之前,MySql中要先選擇在哪個database下來創建表,可以手動在工具欄那一行選,也可以在編輯框用use database_name來選擇,而Oracle中打開的編輯器就是某個用戶下的,所以不考慮這個問題。創建表的時候,MySql和Oracel中的語法和格式基本相同。
在這里也把約束的區別總結一下。
Oracle中的約束類型只多不少,MySql中的約束類型有主鍵,外鍵,非空,唯一,默認約束。基本的用法和格式都相同,在這里只說細節方面不同的兩點:
1.外鍵。Oracle中外鍵約束可以直接寫在列名的后面如:id int not null references a(id),這樣就可以起到外鍵的約束作用。MySql雖然也可以這樣寫,但是卻沒有外鍵約束的效果,而是必須在所有列的后面這樣寫:FOREIGN KEY(deptno) REFERENCES dept(deptno),這樣才能起到外鍵的約束效果,如建表語句。
2.唯一約束的不同。Oracle和MySql中都是說唯一約束的列可以有一個空值,但是在實際操作中,可能使軟件的原因把,Oracle可以有多列空值,而MySql中一個空值也不能有。
在這里也把MySql中scott的建表語句寫下供大家操作:
-- 創建員工表 CREATE TABLE EMP( EMPNO DECIMAL(4) PRIMARY KEY, ENAME VARCHAR(10), JOB VARCHAR(9), MGR VARCHAR(10), HIREDATE DATE, SAL DECIMAL(7,2), COMM DECIMAL(7,2), DEPTNO DECIMAL(2) , FOREIGN KEY(deptno) REFERENCES dept(deptno) ); -- 創建部門表 CREATE TABLE DEPT( DEPTNO DECIMAL(2) PRIMARY KEY, DNAME VARCHAR(14), LOC VARCHAR(13) ); -- 創建工資等級表 CREATE TABLE SALGRADE( GRADE INT UNIQUE PRIMARY KEY,-- 等級`salgrade``salgrade``salgrade` LOSAL INT, -- 等級中最低的薪水 HISAL INT -- 等級中最高的薪水 );
3.check約束不同。MySql中也有check約束,但是沒有數據檢測效果,因此是無用的。
- 修改表
1.修改表名和修改列的數據類型的用法與Oracle相同。
2.修改列名的用法不同,Oracle中是使用關鍵字COLUMN和RENAME,而MySQl只使用一個關鍵字CHANGE;並且MySql中修改列名時還要更改數據類型字段,如果不更改就設置為原先的就行了,語法如下:
ALTER TABLE table_name CHANGE old_name new_name 新數據類型;
3.添加列不同。Oracle在添加列的時候,可能沒有添加到指定位置的語法,我找樂很多資料都沒找到。但是MySql中可以。語法如下:
ALTER TABLE table_name ADD new_column_name 數據類型 約束條件 [FIRST|AFTER exist_column_name]
4.MySql中可以修改列在表中的位置。語法如下:
ALTER TABLE talbe_name MODIFY column1_name 數據類型 FIRST|AFTER column2_name;
- 刪除表
1.刪除整個表。Oracle和MySql都是Drop Table table_name;不過MySql中可以使用IF EXISTS關鍵字,更高端一些。
2.刪除表中某行。Oracle中是 ALTER TABLE table_name DROP COLUMN column_name;而MySql中則不需要COLUMN關鍵字。
3.刪除表中的外鍵約束。
Oracle中刪除外鍵的時候,不管你直接寫在列的后面還是寫在最后,你都得通過關鍵字CONSTRAINT 加約束名來刪除,如果你沒有添加約束名的話,系統會給你一會外鍵約束的系統名,你需要通過user_constraints視圖去查找到這個約束名,再刪除。語法是 :
ALTER TABLE table_name DROP CONSTRAINTS 約束名;
MySql中的語法不同,它刪除外鍵約束的時候是通過 FOREIGN KEY加外鍵約束名來刪,如果你沒有給外鍵起名字,那么可以通過SELECT * FROM table_constraints;來查到約束名再刪除。
ALTER TABLE table_name DROP FOREIGN KEY 外鍵約束名;
- MySql中有關表的查詢
1.顯示當前數據下的表。
SHOW TABLES;
2 .查看表的結構信息。
DESCRIBE emp;
3.查看表的創建信息。
SHOW CREATE TABLE emp;
4.查詢表的約束信息。
SELECT * FROM table_constraints;
五.DML語句的不同。
- 插入insert
1.單行插入數據時相同的。
2.多行插入數據不同。MySql中可以很簡單的插入多行數據,語法如:insert into table_name values(數值1..數值n),(數值1..數值n),..,(數值1..數值n);但是Oracle中稍微有點復雜,語法如下:
insert into table_name select 數值1,數值2,...數值n from dual union select 數值1,數值2,...數值n from dual union....union select 數值1,數值2,...數值n from dual;
- 刪除delete
刪除的時候Oracle中可以delete table_name來刪除,省略了from;但是MySql中必須加上from關鍵字。
- 更改update
更改數據時相同的。
update table_name set column_name='what' 條件where;
- 查詢select
查詢有很大的不同,而且用到的運算符也挺多,我們先從運算符開始說吧,只說不一樣的。
1.算數運算符的差別。
Oracle中沒有求余運算符,只能調用系統函數MOD(x,y);MySql中可以通過運算符%來求余。
2.關系運算符的差別。Oracle中有的MySql中基本上都有。MySql中還有其他的:
LEAST ——當有兩個或者多個參數返回時,取最小的值。相當於Oracle的函數MIN(m);
GREATEST——當有兩個或者多個參數返回時,取最大的值。相當於Oracle的函數MAX(m);
REGEXP ——正則表達式匹配;
'^': 匹配以該字符后面的字符開頭的字符串
'$': 匹配以該字符后面的字符開頭的字符串
'.': 匹配任意一個單字符
'...': 匹配方括號的任意字符。范圍用-來表示[0-9][a-z]
'*': 匹配0個或多個在它前面的字符串。例如"[0-9]*"匹配任何數量的數字;".*"匹配任何數量的的任意字符。
<=> ——安全的等於:當兩邊的值都是NULL時,返回的是1不是NULL;當一邊的值為NULL時,返回的是0而不是NULL;
3.邏輯運算符的區別。
ORACLE中有以下獨特的。
ANY:匹配任何一個
ALL:匹配所有
MySql中有以下獨特的和獨特的用法。Oracle中不可以select not 1 from dual,select 1 and 1 from dual;等等,但是MySql中卻可以,而且MySql中還不用加 from dual;
NOT|!:邏輯非
AND|&&:邏輯與
OR或者||:邏輯或
XOR:邏輯異或
4.位運算符。
| 位或:二進制或運算
& 位與:二進制與運算
^ 位異或:不同為1,相同為0的二進制運算
<< 位左移:二進制數左移,左邊丟棄,右邊補0
>> 位右移:二進制右移,右邊丟棄,左邊補0
~ 位取反,反轉所有比特:1取0,0取1的二進制運算。