Oracle和MySQL在SQL语句方面的区别

来源:互联网 发布:贵州大数据培训 编辑:程序博客网 时间:2024/06/06 05:47

在网上查找了许多的相关的资料,现在用这篇博客将他们总结一下。

资料来源:http://blog.csdn.net/alanzyy/article/details/8313484
http://www.csdn.net/article/2011-11-24/308040

1 .数据类型差异

数据类型

2 .DDL语句差异:

2.1 .删除表(异)

MySQL:
DROP TABLE IF EXISTS tableName

Oracle:
DROP DABLE tableName

注:Oracle没有if exists关键字,也没用类似if exists的SQL语法。

2.2 .修改列名(异)

MySQL:
ALTER TABLE tableName CHANGE columnNameOld columnNameNew VARCHAR(11);

Oracle:
ALTER TABLE tableName RENAME columnNameOld TO columnNameNew;

2.3. 修改列类型(说明)

Oracle中,在列有数据的时候,无法修改列类型;没有数据时可以。

MySQL中,无论列是否有数据都可以修改列类型。
但是当有数据是,直接修改列类型都可能对数据造成丢失等,所以一般需要结合具体的业务来对列数据做处理后,再修改列类型类型。所以修改列的类型并非使用SQL语句进行一步到位的修改,而是通过以下流程:
A. 添加临时列
B. 将需要更改的列的值经过类型转换的验证后,赋值给临时列
C. 删除原有列
D. 将临时列的列名修改为原有列列名

3 .索引:
在整个数据库内,MySQL的索引可以同名,也就是说MySQL的索引是表级别的;但是Oracle索引不可以同名,也就是说Oracle的索引是数据库级别的

3.1 .删除索引(异)
MySQL:
alter table tableName drop index indexName
Oracle:
drop index indexName

3.2. 查询表的索引(异)
MySQL:
show index from tableName
Oracle:要借助数据字典查询(USER_INDEXES)
select * from USER_INDEXES where table_name = ‘大写的表名’

4 . 空字符串问题:
Oracle中空字符串”就是null(也就是说,只有null,没有空字符),而MySQL是区分null和”的。
对于使用语句:select * from table1 where user_name <> ”来查询列user_name不为空(不为null且不为空字符)时,Oracle会查不出任何结果,而MySQL可以正常运行。这里MySQL之所以可以得到正确结果,还因为比较符号<>会先将列为null的内容进行过滤,然后再比较内容是否为空字符串。
这就要求一方面,以后在编写代码的时候,尽量保证不会往数据库插入空字符串”这样的值,要么保持有数据,要么保持为null。另外,对于MySQL中已经同时存在Null和”时,所有判断是否为null或者”的地方改为判断列的长度是否为0。

5. AS关键字:
Oracle中为表取别名时不需要也不能加AS关键字
实际上在MySQL和Oracle中定义表或者列别名时,都可以不使用AS关键字,只要有一个空格即

6.组函数用法规则

mysql中组函数在select语句中可以随意使用,但在oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的或者是group by子句中的列,否则报错.

eg:
select name,count(money) from user;
这个放在mysql中没有问题在oracle中就有问题了。

7.自动增长的数据类型处理

Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment(只能将主键设置为自动增长),插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;

Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可。
Orable eg:
CREATE SEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的长度来定,如果定义的自动增长的序列号NUMBER(6),最大值为999999
插入记录时:INSERT语句插入这个字段值为:序列号的名称.NEXTVAL

8.单引号的处理

MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

9.翻页的SQL语句的处理

翻页的SQL语句的处理 MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;
ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80

10.长字符串的处理

长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。

11.日期字段的处理

MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE,精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)
日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)

日期字段的数学运算公式有很大的不同。
MYSQL找到离当前时间7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)
ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7;

MYSQL中插入当前时间的几个函数是:
NOW()函数以`’YYYY-MM-DD HH:MM:SS’返回当前的日期时间,可以直接存到DATETIME字段中。
CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now())

而oracle中当前时间是sysdate

以上就是我的总结。如果有想了解更详细区别的,请参考下面的博客:
http://www.cnblogs.com/HondaHsu/p/3641116.html
这篇博客写的特别详细,如果想要了解的同学可与去学习学习

原创粉丝点击