最新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 这种情况出现。对于日期转换为另一个日期相对比较简单,比如 select trunc( sysdate ) from dual ;
可以方便的和字符串进行比较、转换 。允许 0000-00-00 这种情况出现作为null的替代品方便处理(个人不认为这样比较方便,反而给我造成困惑)。对于字符串转换为日期比较简单,比如 CREATE TABLE `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> select substr ( 'abcdefg' , 1 , 5 );
结果: abcde
去除空格:
select trim ( 'abc   ' ) from dual ;
去除空格:
select trim ( 'abc   ' ) from dual ;
字符串拼接:
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 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 严格 :
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 a WHERE 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值