1. 程式人生 > 其它 >Oracle資料庫對比mysql

Oracle資料庫對比mysql

基本

 

oracle預設埠:1521 預設使用者:system

mysql預設埠:3306  預設使用者:root

連線oracle:

 

sqlplus

-- 輸入使用者名稱

-- 輸入密碼

-- 查詢該使用者的表 select TABLE_NAME from user_tables;

連線mysql:

mysql -u root -p

-- 輸入密碼

-- 查詢所有資料庫 show databases;

-- 切換到 "test" 這個資料庫 use test;

-- 查詢該資料庫所有表 show tables;

注意:Oracle 登入需要授予登入使用者 session許可權,建表需要分配表空間

eg授予許可權:grant create 許可權名:session、table、sequence、view、procedure執行緒

分配表空間:alter user 使用者名稱 quota unlimited--大小  on users

常用欄位型別

Oracle
數值 number number(10) number(10,2)
字串 varchar2 varchar2(20)
日期 date

MySQL
數值 tinyint smallint mediumint int bigint decimal
字串 varchar(10) 必須指定
日期 date time datetime timestamp year

DML

Oracle:

create table t_student(
    sid int primary key ,
    sname varchar2(10) not null ,
    enterdate date,
    gender char(2),
    mail unique,
    age number check (age>19 and age<30)
)
insert into t_student values(stuseq.nextval,'Test',to_date('1990-3-4','YYYY-MM-DD'),'男','[email protected]',20);
commit;

MySQL

create table t_student(
    sid int primary key auto_increment,
    sname varchar(1) not null ,
    enterdate date,
    gender char(1),
    age int,
    mail varchar(10) UNIQUE
)

insert into t_student values(null,'Test','1990-3-4','男',30,'[email protected]')

MySQL插入日期使用now() 或 sysdate(),可以插入多條,使用逗號隔開
刪表資料:Oracle可以省略from:delete from t_student; (刪除所有資料)

外來鍵約束:Oracle是constraints,MySQL是constraint

級聯操作:

  • Oracle:on delete set null 或者on delete cascade
  • MySQL: on delete set null on update CASCADE

多表操作

Oracle:92語法:可以內連線,外連線99語法:可以內連線,外連線,全外連線(full join)

-- SQL92 左外連線(保留左邊, 注意(+)要放在右邊,記憶:左外,右邊會出現空行要+補齊) 
where e.department_id = d.department_id(+)
-- 

MySQL:只支援內連線、外連線,並且只能用類似oracle中99語法的格式寫,MySQL不完全符合SQL-92規範

SQL 語句

MySQL

大小寫不敏感(關鍵字和欄位名都不區分)

阿里巴巴Java開發手冊,在MySQL建表規約裡有:
【強制】表名、欄位名必須使用小寫字母或數字 , 禁止出現數字開頭,禁止兩個下劃線中間只出現數字。資料庫欄位名的修改代價很大,因為無法進行預釋出,所以欄位名稱需要慎重考慮

Windows 大小寫不敏感,檔名同名大小寫不同會覆蓋

MySQL 在 Windows 下不區分大小寫,但在 Linux 下預設是區分大小寫。因此,資料庫名、 表名、欄位名,都不允許出現任何大寫字母,避免節外生枝
MySQL 的欄位 大小寫都可以查到

Oracle

是Oracle大小寫不敏感的前提條件是在沒有使用雙引號 "" 的前提下(表名、欄位名)

CREATE TABLE "TableName"("id" number); // 如果建立表的時候是這樣寫的,那麼就必須嚴格區分大小寫

SELECT * FROM "TableName"; // 不僅要區分大小寫而且要加雙引號,以便和上面的第三種查詢方式區分開
Oracle預設是大寫,對欄位的具體值是敏感的

分頁

Oracle:

-- 利用rownum 
-- rownum從0開始
select * from
(select rownum rr,stu.* from (select * from t_student order by sid desc) stu )
where rr>=1 and rr<=5;

MySQL:

-- 記錄從0開始
-- 從第0條開始,取5條資料
select * from test2 order by sid desc  limit 0,5

時間日期

Oracle

Java中常用的 "yyyy-MM-dd mm:HH;ss" -> "2021-02-03 16:25:48"
在 Oracle 中的表示方式:'yyyy-mm-dd hh24:mi:ss'

MySQL

-- 獲取當前時間戳 
select unix_timestamp(); 
-- 1612340981

-- 獲取當前日期時間
select now();
2021-02-03 16:30:22

-- 獲取當前日期
select date(now());
-- 2021-02-03

-- timestamp -> datetime
select FROM_UNIXTIME(1612340981);
-- 2021-02-03 16:29:41

-- datetime -> varchar  (time與之類似:time_format(time,format))
select  DATE_FORMAT('2008-08-08 22:23:01','%Y %m %d %H %i %s');
-- 2008 08 08 22 23 01

-- varchar -> date   str_to_date(str, format)
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); 
-- 2008-08-09 08:09:30

Oracle

Oracle DML 需要手動提交或回滾事務
DML(Data Manipulation Language): 資料操縱語言 針對表資料的增刪改查
Oracle select 查詢必須有from 所以可以用from dual(這是一張神奇的表)

型別轉換

date <--> varchar2 <--> number

date --> varchar2 : to_char(sysdate,'yyyy-mm-dd')
varchar2 --> date : to_date('2020-02-02','yyyy-mm-dd')

number --> varchar2: to_char(1111111.11,'999,999,999') -- 輸出:1,111,111 使用'999,999,999'去匹配數字
varchar2 --> number :to_number('¥001,111,111','L000,000,000') from dual; -- 輸出:1111111

L表示:當地的貨幣符號 字串在運算時會自動隱式轉換,含有非數字字元會報錯:無效數字