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表示:當地的貨幣符號 字串在運算時會自動隱式轉換,含有非數字字元會報錯:無效數字