基本
Oracle默認端口:1521 默認用戶:system
MySQL默認端口:3306 默認用戶:root
連接MySQL:
mysql -u root -p
-- 輸入密碼
-- 查詢所有數據庫
show databases;
-- 切換到 "test" 這個數據庫
use test;
-- 查詢該數據庫所有表
show tables;
連接Oracle:
sqlplus
-- 輸入用戶名
-- 輸入密碼
-- 查詢該用戶的表
select TABLE_NAME from user_tables;
注意:Oracle 登錄需要授予登錄用戶 session權限,建表需要分配限額
常用字段類型
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'),'男','1@outlook.com',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,'2@outlook.com')
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表示:當地的貨幣符號 字符串在運算時會自動隱式轉換,含有非數字字符會報錯:無效數字
參考資料
mysql和oracle的區別
Oracle| Oracle大小寫敏感問題
SQL連接標准 SQL92\SQL99
MySQL 獲得當前日期時間 函數