mysql user_tab_cols_最新Oracle 和 mysql 的对比参照----开发篇(转)
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
另有正則表達式。
另有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?tlimit?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
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)
總結
以上是生活随笔為你收集整理的mysql user_tab_cols_最新Oracle 和 mysql 的对比参照----开发篇(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 性能分析 命令_MySQL中
- 下一篇: 数据采集技术python网络爬虫答案_高