|
Oracle |
mysql |
對比版本 |
Release 10.2.0.1.0 XE windowsXP |
5.0.45-community-nt-log MySQL Community Edition (GPL) |
當作計算器 |
SQL> select 1+1 from dual; |
mysql> select 1+1; |
mysql> select 1+1 from dual; |
||
顯示錶結構 |
SQL> desc 表名 |
mysql> desc 表名; |
SQL> describe 表名 |
mysql> describe 表名; |
|
mysql> explain 表名; 注意:explain 也可以用來獲取執行計劃。 |
||
需要訪問: User_tables、user_tab_cols、USER_COL_COMMENTS、USER_INDEXES等等字典表。 |
mysql> show columns from 表名; |
|
|
bin>mysqlshow 庫名錶名 |
|
日期的概念 |
一個完全不同於字符串的類型。日期類型沒有所謂的格式,日期就是日期,只有在顯示的時候可以指定轉換成的字符串的格式。絕對不會允許2008-00-00這種情況出現。對於日期轉換爲另一個日期相對比較簡單,比如select trunc(sysdate) fromdual; |
可以方便的和字符串進行比較、轉換。允許0000-00-00這種情況出現作爲null的替代品方便處理(個人不認爲這樣比較方便,反而給我造成困惑)。對於字符串轉換爲日期比較簡單,比如CREATETABLE`datetime` ( `dt` datetimeNOTNULLdefault'0000-00-00 00:00:00', PRIMARYKEY (`dt`) ); INSERTINTO `datetime` VALUES('2008-01-01 00:00:00'); select*from `datetime`; |
日期類型 |
date |
datetime |
無 |
Date 日期 |
|
無 |
Time 時間 |
|
無 |
Timestamp 如果表中其他字段變化,此類型的字段自動更新爲當前系統時間。 |
|
Timestamp 保存了毫秒級別的時間 |
不清楚 |
|
日期函數 |
SQL> select trunc(sysdate)from dual; |
mysql> select curdate(); mysql> select current_date; |
SQL> select sysdate from dual; |
mysql> select sysdate(); |
|
mysql> select now(); |
||
SQL> select to_char(sysdate,'HH24:Mi:SS')from dual; 注意此處返回結果爲字符串,而不是日期類型。Oracle不提供和mysql中time類型相應的類型。 |
mysql> select current_time; mysql> select curtime(); 注意:此處返回的是time類型。就是時間17:22:14這種時間。Oracle中沒有此類型。 |
|
毫秒級別: SQL> selectcurrent_timestampfrom dual; |
需要使用函數MICROSECOND。目前還不會。 |
|
日期格式化 |
SQL> select to_char(sysdate,'yyyy-mm-dd') from dual; |
mysql> select date_format(now(),'%Y-%m-%d'); |
SQL> select to_char(sysdate,'hh24-mi-ss') from dual; |
mysql> select time_format(now(),'%H-%i-%S'); |
|
日期函數 (增加一天) |
SQL> select sysdate+1from dual; 結果:2008-2-20 19:34:27 |
mysql> select date_add(now(),interval 1 day); |
mysql>select now()+interval 1 day; |
||
日期函數 (增加一個月) |
SQL> select add_months(sysdate,1)from dual; 結果:2008-3-19 19:34:27 |
mysql> select date_add(now(),interval 1 month); |
mysql>select now()+interval 1 month; |
||
別名 |
SQL> select1as a from dual; |
mysql> select1as a; |
SQL> select1 a from dual; |
mysql> select1 a; |
|
字符串截取函數 |
SQL> select substr('abcdefg',1,5)from dual; 結果:abcde |
mysql> selectsubstr('abcdefg',1,5); 結果:abcde |
去除空格: select trim('abc ')from dual; |
去除空格: select trim('abc ')fromdual; |
|
字符串拼接: SELECT CONCAT('a',' test')from dual; 結果:a test |
SELECT CONCAT('a',' test'); 結果:a test |
|
注意oracle中||爲字符串拼接 select'a'||' test'from dual; 結果:a test |
注意mysql中||爲或操作符。 select 0||1; 結果1; Select 0||0; 結果0。 |
|
判斷是否包含: select instr('abcd','bcd')from dual; 結果:2 |
mysql> SELECT INSTR('foobarbar', 'bar'); 結果:4 |
|
另有正則表達式。 |
另有SUBSTRING_INDEX(str,delim,count)函數 |
|
執行sql腳本 |
SQL >@a.sql |
1:mysql> source a.sql |
執行外部shell腳本 |
SQL>host test.sh |
目前還不會 |
SQL>! cd .. |
||
改表名 |
SQL> altertable T renameto T1; |
mysql> alter table t rename t1; |
mysql> alter table T1 rename to T; |
||
執行命令 |
;<回車> |
;<回車> |
/ |
go |
|
r |
ego |
|
run |
|
|
distinct用法 |
SQL> select distinct 列1 from 表1; |
mysql> select distinct 列1 from 表1; |
SQL> select distinct 列1,列2 from 表1; |
mysql> select distinct 列1,列2 from 表1; |
|
註釋 |
-- |
-- |
/* 與*/ |
/*與*/ |
|
REM |
# |
|
限制返回記錄條數爲5條 |
SQL> select * from 表名 where rownum<=5; |
mysql> select * from 表名 limit 5; |
分頁查詢 |
select* from ( select row_.*, rownum rownum_ from ( yourSqlHere ) row_ where rownum <= 100) where rownum_ > 20; |
select*from t limit20,100; |
外連接 |
(+) |
left join |
LEFTOUTERJOIN |
left outer join |
|
RIGHTOUTERJOIN |
|
|
查詢索引 |
SQL> select index_name,table_name from user_indexes; |
mysql> show index from 表名 [FROM 庫名]; |
通配符 |
“%” |
“%”和“_” |
如果存在則更新,否則插入 |
Merge into |
Replace into 參見,mysql的replace沒有oracle的merge嚴格: |
SQL語法 |
SELECT selection_list 選擇哪些列 |
SELECT selection_list 選擇哪些列 |
FROM table_list 從何處選擇行 |
FROM table_list 從何處選擇行 |
|
WHERE primary_constraint 行必須滿足什麼條件 |
WHERE primary_constraint 行必須滿足什麼條件 |
|
GROUP BY grouping_columns 怎樣對結果分組 注意:oracle如果需要排序必須指定order by 子句。 |
GROUP BY grouping_columns 怎樣對結果分組 注意:即使不存在order by子句,mysql也會按照group by 的列進行排序。甚至還能爲group by 語句指定asc/desc子句。 |
|
HAVING secondary_constraint 行必須滿足的第二條件 |
HAVING secondary_constraint 行必須滿足的第二條件 |
|
ORDER BY sorting_columns 怎樣對結果排序 |
ORDER BY sorting_columns 怎樣對結果排序 |
|
Oracle的結果集限定語句見:”分頁查詢” 注意:oracle的rownum和mysql的Limit完全不同。 |
LIMIT count 結果限定 |
|
對not in null的處理,是關於三值邏輯的問題。 |
CREATETABLE a ( code INT); INSERTINTO a VALUES(2); INSERTINTO a VALUES(NULL); SELECT1 FROM DUAL WHERE1NOTIN(SELECT code FROM a); 結果:無返回結果。 |
CREATETABLE a ( code INT); INSERTINTO a VALUES(2); INSERTINTO a VALUES(NULL); SELECT1 FROM DUAL WHERE1NOTIN(SELECTcode FROM a); 結果:無返回結果 |
對not exists的處理 |
CREATETABLE a ( code INT); INSERTINTO a VALUES(2); INSERTINTO a VALUES(NULL); SELECT1 FROM DUAL WHERENOTEXISTS(SELECT1 FROM a WHERE a.code =1); 結果:1 |
CREATETABLE a ( code INT); INSERTINTO a VALUES(2); INSERTINTO a VALUES(NULL); SELECT1 FROM DUAL WHERENOTEXISTS(SELECT1 FROM aWHERE a.code =1); 結果:1 |
獲取sql語句執行計劃 |
SQL>EXPLAIN PLAN FOR select * from t; 然後 SQL>select * from table(DBMS_XPLAN.DISPLAY) |
Mysql> explainselect*from t; |
執行計劃對照 |
全表掃描: TABLE ACCESS FULL |
Type=all |
Where條件過濾:FILTER |
Extra=Using where |
|
排序:SORT ORDER BY |
Extra=Using filesort |
|
事務管理 |
默認不自動提交 |
innoDB支持事務 |
默認自動提交autocommit |
||
阻塞讀取方式 |
|
|
Unique index的區別。 又是關於三值邏輯的問題。 |
CREATETABLE hr.t ( IDINTNOTNULL, DATACHAR(30)DEFAULTNULL, UNIQUE(ID,DATA) );
INSERTINTO hr.t VALUES(1,NULL);
INSERTINTO hr.t VALUES(1,NULL); |
mysql> CREATE TABLE t ( ID INT NOT NULL, DATA CHAR(30) DEFAULT NULL, UNIQUE (ID, DATA) ); INSERT INTO t VALUES (1, NULL); INSERT INTO t VALUES (1, NULL); select * from t; Query OK, 0 rows affected Query OK, 1 row affected Query OK, 1 row affected +----+------+ | ID | DATA | +----+------+ | 1 | NULL | | 1 | NULL | +----+------+ 2 rows in set |
ORA-00001: 違反唯一約束條件 (HR.SYS_C003999) |
最新Oracle 和 mysql 的對比參照
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.