之前一直使用mysql作为存储数据库,虽然中间偶尔使用sqlite作为本地数据库存储,但没有感觉多少差别。

  后来遇上了oracle,且以其作为主要存储,这下就不得不好好了解其东西了。oracle作为商业数据库里的佼佼者,肯定有其过人之处的。

  本文仅从使用的角度来说说感受,并无其他意思哟。(理解上也并不深入)

1. 自增主键

  mysql中要使用自增主键非常方便,只需要在建表时增加 auto_increment 关键字即可,样例如下:

  create table tb1 (id int(11) unsigned not null auto_increment);

  而在oracle中则不一样了,它需要使用另一个概念:序列号;我们可以简单将其理解为只有一个列的表,这个表提供了 nextval 的方法,辅助我们生成自增id,样例如下:

  -- 1. 建普通表
  create table tb1(id number not null);
  -- 2. 创建序列,参数比较多,自行查阅资料
  create sequence seq_tb1 increment by 1 start with 1 minvalue 1 maxvalue 999999999
  -- 3. 插入使用
  insert into tb1 (id) values (seq_tb1.nextval)

  可以看到,oracle的操作明显多了许多。当然了,自增这个属性,在许多数据库中确实也是不提供的,尤其是分布式数据库递增更难做。所以,要支持这功能,绕路也就在所难免了。

  

2. 创建索引

  索引的目的自然是为了提高查询效率,mysql中想要添加索引可以在建表时操作,也可以在后期更改;样例如下:

    -- 1. 建表时指定
create table tb1 (username varchar(50), index username (username));
-- 2. 后期更改
alter table tb1 add index username (usrrname);

  而在oracle中则不一样,它只能在建表完成之后操作;样例如下:

    CREATE INDEX tb1_username ON tb1(username);

  看起来差异不大,但oracle的索引是全局的,即所有表的索引名都不能重复,比如大家都有id索引,但却不能都叫id。

3. 字段表注释

  我们建一张表时,肯定都需要注释的,否则过两天连我们自己都不认识其含义了。mysql中在建表或增加字段时直接指定,样例如下:

    -- 1. 建表时指定
create table tb1(username varchar(50) comment '用户名标识') comment '测试建表';
-- 2. 修改表结构时指定
alter table tb1 add column nickname varchar (100) '昵称';

  而oracle中则不太一样,它只能在建表之后和创建字段之后才能进行注释;样例如下:

    -- 表注释
comment on table tb1 is '测试建表';
-- 字段注释
comment on tb1.username is '用户名称标识';
-- 删除表注释,置空
-- 删除列注释,置空

  我不是说它这设计不好,但是就感觉太烦了。

4. 分页实现

  mysql中的分页,使用limit,这也是大多数数据库的选择,样例如下:

    select username from tb1 limit 50, 100;

  而在oracle中则不太一样,它使用行号去定位记录,一般需要使用嵌套子查询;样例如下:

    select * from (select t.*,rownum num from tb1 t where rownum<=100 ) where num>50

  性能比limit怎么样我不清楚,反正是写得挺烦的。

5. 查询执行计划

  查询执行计划,可以看出哪些语句是需要优化的,这个工作实际上还是比较专业的。但如果想简单看看情况,mysql中可以这样做:

    explain select * from tb1 where username='xx' order by id limit 10;

  

  而oracle中要查看执行计划,则需要借助工具或者自己写,样例如下:

    -- 1. 执行查询执行计划语句
explain plan for select * from tb1 where username='xx';
-- 2. 查看执行计划结果
select * from table(dbms_xplan.display());

  oracle还有其他许多种查看执行计划的方式,就不列举了。也没啥好坏之分,能查看就行。

6. 客户端可视化工具

  这个简单说说,mysql有很多工具,sqlyog,navicat,mysqlworkbench。。。

  oracle也有很多,plsql,navicat。。。

  而具体操作上的差异则根据客户端工具的差异来,无可厚非。

7. 对超长文本的处理

  mysql中对超长文本使用text和longtext类型进行处理,和其他字段并没有太多差别(不能建有效索引除外)

  而oracle中则使用CLOB类型进行存在超长字符,但它有许多限制,普通查询无法显示clob,分号限制等等。但它可以容纳上G的数据。

8. 日期字段查询

  都支持date,timestamp数据类型。

  mysql支持直接使用字符串日期进行条件过滤,默认格式为:yyyy-MM-dd HH:ii:ss 比如:

    select * from tb1 where dt>'2020-09-13 12:15:01';

  而oracle则要求严格些,要求必须都是日期老式string格式才能比较;

    select * from tb1 where dt>to_date('2020-09-13 12:15:01', 'yyyy-MM-dd hi24:mi:ss');

  虽然加这么个格式东西也不复杂,但总感觉不爽。

9. 修改字段类型

  mysql中修改字段类型,直接改就好,但有可能失败。

    alter table tb1 change column f1_old f1_new int(11) comment 'xxx';

  

  而oracle中则分情况处理,空字段直接改,不允许修改有值字段类型,如果硬要改那就相当麻烦,如下:

    -- 空字段类型修改,可任意修改
alter table modify (f1_old number);
-- 非空字段类型修改,分类型匹配与不匹配情况
-- 如果类型匹配,可直接改,如nchar(20) -> nvarchar(20)
-- 否则不允许修改,只能主动新建字段替换回来,关键是不一定能成功
alter table tb rename column name to name_tmp;
/*增加一个和原字段名同名的字段name*/
alter table tb add name varchar2(40);
/*将原字段name_tmp数据更新到增加的字段name,可算可能失败*/
update tb set name=trim(name_tmp);
/*更新完,删除原字段name_tmp*/
alter table tb drop column name_tmp;

  很显然,oracle的做法更严谨,不允许更改字段名称,改类型必须保证正确;哎,但总感觉不爽;

10. group by 聚合

  group by可以按照某字段去重一些数据,并按需要聚合数据,mysql与oracle都差不多,差别点在于oracle不允许返回group by外的其他字段(或者说不能准确描述的字段),而mysql则会随机返回一个group by的字段值。mysql如下:

    select username, avg(score), grade from tb1 group by grade;

  

  oracle中则要求必须确定某值:

    select max(username), avg(score), grade from tb1 group by grade;

  看起来oracle是更严谨一些的。

11. 分区表创建

  分区表的目的,在于提高查询速度和方便隔离管理。

  mysql 创建分区表,Mysql不能自动创建分区,且要求分区字段必须是主键的一部分,如果想自动创建分区,需要使用mysql event事件的方式自动创建分区. 样例如下:

    create table tb1 (
id int(11),
day datetime not null
prmary key (id, day)
)
PARTITION BY RANGE (TO_SECONDS(day))
(PARTITION p20200912 VALUES LESS THAN (TO_SECONDS('')) ENGINE = InnoDB,
PARTITION p20200913 VALUES LESS THAN (TO_SECONDS('')) ENGINE = InnoDB);

  oracle 中创建分区表

    create table tb1 (
id NUMBER(20) not null,
create_time DATE
)
PARTITION BY RANGE (CREATE_TIME) INTERVAL (NUMTODSINTERVAL(1, 'day'))
(partition part_t01 values less than(to_date('2020-09-12', 'yyyy-mm-dd')));

  明显 oracle 支持得更好些呢。

12. with as 用法

  在做一些大型数据数据分析sql时,with as sql 非常有用,在mysql低版本中是不支持的,只能自己写临时表进行处理。

  而oracle则支持该通用语法:

    with a as (
select * from tb1 where dt = ''
),
b as (
select * from tb2 where dt = ''
)
select a.id aid, b.id bid from a join b on a.pid = b.id;

13. 事务支持

  在rdb中,通常事务是指对一批操作的原子性,一致性,隔离性,持久性的体现。大体上mysql与oracle表现是一致的。

  mysql是分存储引擎,如innodb,myisam,每个引擎的事务支持能力不同,原则不同,锁实现不同,如innodb锁行,而myisam 锁表等。

  oracle 中在建表时就可以指定事务槽数

    -- 建表时指定事务槽数
create table t3 (id int, num int ) INITRANS 6;
-- 创建索引时指定事务槽数
create unique index tb1_username_idx on tb1 (username) initrans 6;

14. 进程信息查询

  查询正在运行的任务情况,可用于查询慢查询的利器。

  mysql 中 直接使用 show full processlist 即可;但带条件的查询需要查表:

    show full processlist;
select * from information_schema.`PROCESSLIST` where duration > 5;

  oracle 进程信息:

SELECT b.sid oracleID,
b.username Oracle用户,
b.serial#,
spid 操作系统ID,
paddr,
sql_text 正在执行的SQL,
b.machine 计算机名
FROM v$process a, v$session b, v$sqlarea c
WHERE a.addr = b.paddr
AND b.sql_hash_value = c.hash_value;

  反正我是记不住这么长的sql的。

15. 数据同步

  mysql 中使用 binlog 可以方便的将数据同步到其他地方;

  oracle, 好像很复杂的样子, 待研究。

谈谈 mysql和oracle的使用感受 -- 差异的更多相关文章

  1. mybatis中mysql和oracle的差异

    1.applicationContext.xml中的配置差异: 在applicationContext.xml的数据源dataSource的配置中,mysql数据库需要心跳包的配置,而oracle中不 ...

  2. MySQL与Oracle 差异比较之四条件循环语句

    循环语句 编号 类别 ORACLE MYSQL 注释 1 IF语句使用不同 IF iv_weekly_day = 'MON' THEN       ii_weekly_day := 'MON';ELS ...

  3. sqlserver自带的导入导出工具,分别导入大批量mysql和oracle数据时的感受

    sqlserver自带的导入导出工具,分别导入大批量mysql和oracle数据时,mysql经常出现格式转换出错,不好导入  导入的数据量比较大时,还不如自己写个工具导入 今天在导oracle时,想 ...

  4. MySQL与Oracle主键Query性能测试结果

    测试结果总结如下: 1. 按主键读:SQL形式:SELECT * FROM table WHERE id=?. 1.1. 主键为数字.如果所有ID均不存在,纯比较SQL解析能力.MySQL解析SQL的 ...

  5. 谈谈MySQL数据表的类型(转)

    谈谈MySQL数据表的类型 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其 ...

  6. Mysql和Oracle的一些语法区别

    作为一个有追求的程序猿,当然要不断的学习,巴拉巴拉巴拉...好了,贴一个网址给大家,哈哈 MySQL与Oracle 差异比较:http://www.cnblogs.com/HondaHsu/p/364 ...

  7. 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

  8. mysql 和 Oracle 数据类型对照

    MySQL与Oracle两种数据库在工作中,都是用的比较多的数据库,由于MySQL与Oracle在数据类型上有部分差异,在我们迁移数据库时,会遇上一定的麻烦,下面介绍MySQL与Oracle数据库数据 ...

  9. 阿里云 如何减少备份使用量? mysql数据库的完整备份、差异备份、增量备份

    RDS for MySQL备份.SQL审计容量相关问题_MYSQL使用_技术运维问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/4 ...

随机推荐

  1. C#LeetCode刷题之#125-验证回文串(Valid Palindrome)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3899 访问. 给定一个字符串,验证它是否是回文串,只考虑字母和数 ...

  2. Vue在v-for中给css传递一个数组参数

    需求就是将很多个数据,以进度条的形式展示在页面上,形成一个可视化. 接下来是html代码 <!DOCTYPE html> <html> <head> <tit ...

  3. Java中的注解及自定义注解你用的怎么样,能不能像我这样应用自如?

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  4. 性能测试必备知识(10)- Linux 是怎么管理内存的?

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 内存映射 日常生活常说的内存是什么 比方说, ...

  5. 【BJOI2018】求和 - 倍增LCA

    题目描述 $master$ 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的$k$次方和,而且每次的$k$可能是不同的.此处节点深度的定义是这个节点到根的路 ...

  6. 谈谈BUG严重级别(severity)管理

    在软件工程理论中,BUG严重级别(severity)是用于指示软件质量问题导致的负面影响的程度.但在大部分实际的软件开发组织中,对BUG严重级别(severity)的定义和使用常常充斥着大量的争议和分 ...

  7. linux驱动之定时器的使用

    被文章摘自一下几位网友.非常感谢他们. http://blog.sina.com.cn/s/blog_57330c3401011cq3.html Linux的内核中定义了一个定时器的结构: #incl ...

  8. 客户端操作 2 HDFS的API操作 3 HDFS的I/O流操作

    2 HDFS的API操作 2.1 HDFS文件上传(测试参数优先级) 1.编写源代码 // 文件上传 @Test public void testPut() throws Exception { Co ...

  9. linux 基本命令整理--转

      推荐:http://www.cnblogs.com/lingiu/p/3446647.html 1. 查看目录文件:ls2. 查看目前路径:psw3. 查看文件内容:cat 文件名4. 打开编辑器 ...

  10. HTTP基础--网页基础

    网页的组成: 网页可以分为三大部分---HTML,CSS和JavaScript.如果把网页比作一个人的话,HTML相当于骨架,JavaScript相当于肌肉,CSS相当于皮肤,三者结合起来才能形成一个 ...