|
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這種情況出現。對於日期轉換為另一個日期相對比較簡單,比如selecttrunc(sysdate) from dual; |
可以方便的和字串進行比較、轉換 。允許0000-00-00這種情況出現作為null的替代品方便處理(個人不認為這樣比較方便,反而給我造成困惑)。對於字串轉換為日期比較簡單,比如CREATETABLE `datetime` ( `dt` datetime NOT NULL default‘0000-00-00 00:00:00‘, PRIMARY KEY (`dt`) ); INSERT INTO `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> select current_timestamp from 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+1 from 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> select 1 as a from dual; |
mysql> select 1 as a; |
SQL> select 1 a from dual; |
mysql> select 1 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 |
另有Regex。 |
另有SUBSTRING_INDEX(str,delim,count)函數 |
執行sql指令碼 |
SQL >@a.sql |
1:mysql> source a.sql |
執行外部shell指令碼 |
SQL>host test.sh |
目前還不會 |
SQL>! cd .. |
改表名 |
SQL> alter table T rename to 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 limit 20,100; |
外串連 |
(+) |
left join |
LEFT OUTER JOIN |
left outer join |
RIGHT OUTER JOIN |
|
查詢索引 |
SQL> select index_name,table_name from user_indexes; |
mysql> show index from 表名 [FROM 庫名]; |
萬用字元 |
“%” |
“%”和“_” |
如果存在則更新,否則插入 |
Merge into |
Replace into 參見,mysql的replace沒有oracle的merge嚴格: http://www.bitbybit.dk/carsten/blog/?p=128#comment-50048 |
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的處理,是關於三值邏輯的問題。 |
CREATE TABLE a ( code INT ); INSERT INTO a VALUES (2); INSERT INTO a VALUES (NULL); SELECT 1 FROM DUAL WHERE 1 NOT IN (SELECT code FROM a); 結果:無返回結果。 |
CREATE TABLE a ( code INT ); INSERT INTO a VALUES (2); INSERT INTO a VALUES (NULL); SELECT 1 FROM DUAL WHERE 1 NOT IN (SELECT code FROM a); 結果:無返回結果 |
對not exists的處理 |
CREATE TABLE a ( code INT ); INSERT INTO a VALUES (2); INSERT INTO a VALUES (NULL); SELECT 1 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM a WHERE a.code = 1); 結果:1 |
CREATE TABLE a ( code INT ); INSERT INTO a VALUES (2); INSERT INTO a VALUES (NULL); SELECT 1 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM aWHERE a.code = 1); 結果:1 |
擷取sql語句執行計畫 |
SQL>EXPLAIN PLAN FOR select * from t; 然後 SQL>select * from table(DBMS_XPLAN.DISPLAY) |
Mysql> explain select * from t; |
執行計畫對照 |
全表掃描: TABLE ACCESS FULL |
Type=all |
Where條件過濾:FILTER |
Extra=Using where |
排序:SORT ORDER BY |
Extra=Using filesort |
| |
|
| |
|
交易管理 |
預設不自動認可 |
innoDB支援事務 |
預設自動認可autocommit |
阻塞讀取方式 |
|
|
Unique index的區別。 又是關於三值邏輯的問題。 |
CREATE TABLE hr.t ( ID INT NOT NULL, DATA CHAR(30) DEFAULT NULL, UNIQUE (ID, DATA) ); INSERT INTO hr.t VALUES (1, NULL); INSERT INTO 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) |