Oracle与MySQL的学习


前言

已经入职几个月的时间了,不同于平常学习使用的 MySQL,公司内使用的是 Oracle 数据库。针对以前 MySQL 的学习笔记,这里主要总结下 Oracle 数据库,以及其与 MySQL 的一些区别。


用户与存储区别

mysql:

  • 对数据的管理可以有很多个用户,登录用户后可以看到该用户权限下的所有的数据库
  • 一般来讲都是一个项目对应着一个数据库,该数据库下存放着所有该项目所要用到的表,视图等东西
  • 查看所有的数据库命令:show databases;
  • 查看某数据库下的所有表命令:show tables;

oracle:

  • 对数据的管理同样有着很多个用户,同样的登录用户后可以看到该用户权限下的所有东西
  • 数据库只有一个,但是可以有很多个表空间
    【表空间就像是mysql中的一个个的数据库,用来区分项目与项目之间的所属东西】
  • oracle多了一个东西叫做数据字典,这其实就是系统字典表,我们只有查看的权限。系统字典表有很多张,需要细致的去学习
  • 查看所有表空间命令:select tablespace_name from dba_tablespaces;
    【dba_tablespaces – 所有表空间数据字典,user_tablespaces --当前用户权限下的所有表空间】
  • 查看当前用户下的所有表及对应的表空间命令:select table_name,tablespace_name from dba_tables;

总结
Oracle通过数据库用户,实现了对象级控制数据库访问和使用的机制。而数据库用户是定义在数据库中一个名称,是Oracle数据库的基本访问机制,且每一个数据库用户都拥有自己的数据库,拥有不同的权限,能够根据权限访问其他用户的数据库信息。一个实例有多个用户,每个用户默认拥有一个表空间,也可以操作多个表空间,多个用户可以同时用一个表空间。


字段数据类型区别

mysql:

  • 数值型:tinyint(超小整数)、smallint(小整数)、mediumint(中整数)、int(整数)、bigint(大整数)、float(单精度浮点型)、double(双精度浮点型)
  • 字符型:char(定长字符串)、varchar(变长字符串)、blob(二进制长文本)、text(长文本)、longblob(二进制超长文本)、longtext(超长文本)
  • 日期类型:date(日期)、time(时间)、year(年份)、datetime(时期加时间)、timestamp(时间戳)

oracle:

  • 数值型:number(m,n) 表示数据长度,n表示小数点位数;
  • 字符型:char(n) 用于标识固定长度的字符串;varchar2(n) 可变长度的字符串类型,最长为4000,不可以存储空字符串"",没有数据时为null;blob 相当于 mysql 的 longblob;clob 相当于mysql的 longtext
  • 日期类型:date、timestamp

其他区别

  • 提交方式:MySQL默认自动提交,Oracle则需要手动提交。
  • 分页查询:不支持MySQL中的 limit 功能,通过 ROWNUM 实现。
    select * from (
        select temp.*,ROWNUM RN from (select * from WJYTEST) temp where ROWNUM <= (pageNum*PageSize)
    ) where RN > ((pageNum-1)*PageSize);
    
  • 非空字段:MySQL的非空字段有空的内容(空字符),Orcale的非空字段不允许有空的内容(空字符),
  • 引号:MySQL中单引号与双引号相同,Orcale 只能用单引号包起字符串。
  • 自增字段:MySQL 可以直接给某个字段定义自增规则,Orcale 需要先定义序列。
    • 序列
      create SEQUENCE myque increment by 1 minvalue 1 maxvalue 9999 start with 1;  
      
    • SQL调用
      insert into WJYTEST(ID,IMAGE,CONTENT,HEHE) VALUES (myque.NEXTVAL,NULL,NULL,NULL);  
      
    • sql要和mysql一样,则需要定义触发器
      create or replace trigger mytrig before insert on WJYTEST for each row
      begin
          select myque.NEXTVAL into :new.ID from dual;
      end mytrig;
      insert into WJYTEST(IMAGE,CONTENT,HEHE) VALUES (NULL,NULL,NULL);
      
  • 函数调用:MySQL直接调用,Oracle需要写 from dual
    	select concat('12','34') from dual;
    
  • 存储过程
    • 创建:Oracle 使用 create or replace,不同于 MySQL 的先判断是否存在再 Drop 删除。
    • 参数: Oracle 参数类型 in/out/inout 写在参数名后面,且参数可以定义为表的字段类型。
  • 索引:不同于 MySQL 的最左匹配原则,Oracle 支持索引跳跃式扫描。使那些在where条件中没有对目标索引的前导列指定查询条件,但同时又对该索引的非前导列指定了查询条件的目标SQL依然可以用上该索引。跳跃式扫描,即就像在扫描该索引时跳过了它的前导列,直接从该索引的非前导列开始扫描(实际的执行过程并非如此)。

EXPLANIN 执行计划

Oracle 每条SQL语句都会经过优化器的评估,而EXPLAIN执行计划是一种用于优化应用的性能诊断工具。通过执行计划能够判断SQL是否进行了全表扫描,是否使用上了相关索引。
两种使用方式:

  • sql 语句前加上 explain plan for,然后查看 select * from table(dbms_xplan.display())
  • sqldeveloper 中选中具体的 sql 块,F10 查看对应的执行计划

查看的执行计划,通过 TABLE ACCESS 能够知道该 sql 是全表扫描还是索引,其他搜索路径常用字段:

  • Rows:该操作返回的结果集行数
  • Cost:该操作执行的成本(cpu耗费)
  • Time:Oracle估计执行该操作所需的时间

分区

Oracle 目前只能建表的时候定义分区
范围分区: 通常以 Date 类型的列作为范围分区键

	partition by range (create_time)
	(partition part1 values less than (to_date('01-JUN-2020',''DD-MON-YYYY)) tablespace  ORD_TS01 ,
	 partition part2 values less than ( to_date('01-JUN-2020',''DD-MON-YYYY)) tablespace  ORD_TS02)

列表分区: 对某一列使用列表值将表划分成几部分

	partition by list(sex)
	(partition part1 values('male') tablespace PROB_TS01,
	 partition part2 values('female') tablespace PROB_TS02
	)  

哈希分区: 对某一列(唯一/基本唯一)使用哈希函数把表分成几部分

	partition by hash(userid) partitions 4

复合分区: 同时使用两种分区方法对表进行分区

猜你喜欢

转载自blog.csdn.net/MOKEXFDGH/article/details/109133292