玖叶教程网

前端编程开发入门

MySQL和Oracle相关(mysql和oracle的数据类型对比)

概述

MySQL和Oracle都是流行的关系数据库管理系统(RDBMS),在世界各地广泛使用。大多数数据库以类似的方式工作。

二者有何区别?两个数据库的特性是不同的,所以与Oracle相比,MySQL的使用方式不同;与MySQL相比,Oracle的使用情况有所不同。它们的特点也是不同的。

区别:

1.本质的区别:

  • Oracle数据库是一个对象关系数据库管理系统(ORDBMS)。它通常被成为OracleRDBMS或简称为Oracle,是一个收费的数据库。
  • MySQL是一个开源的关系数据库管理系统(RDBMS)。它是世界上使用最多的RDBMS (Relational Database Management System,关系数据库管理系统) ,作为服务器运行,提供多个数据库的多用户访问。它是一个开源、免费的数据库。

2.数据库安全性:

  • MySQL使用三个参数来验证用户,即用户名、密码和位置;
  • Oracle使用了许多安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等。

3.SQL语法的区别:

Oracle的SQL语法与MySQL有很大不同。Oracle为称为PL/SQL的编程语言提供了更大的灵活性。Oracle的SQL*Plus工具提供了比MySQL更多的命令,用于生成报表输出和变量定义。

4.存储上的区别:

与Oracle相比,MySQL没有表空间,角色管理,快照,同义词和包以及自动存储管理。

5.对象名称的区别:

虽然某些模式对象名称在Oracle和MySQL中都不区分大小写,例如列,存储过程,索引等。但在某些情况下,两个数据库之间的区别大小写是不同的。

  • Oracle对所有对象名称都不区分大小写;
  • 而某些MySQL对象名称(如数据库和表)区分大小写(取决于底层操作系统)。

6.运行程序和外部程序支持:

  • Oracle数据库支持从数据库内部编写,编译和执行的几种编程语言。此外,为了传输数据,Oracle数据库使用XML。
  • MySQL不支持在系统内执行其他语言,也不支持XML。

7.MySQL和Oracle的字符数据类型比较:

两个数据库中支持的字符类型存在一些差异。

  • 对于字符类型,MySQL具有CHAR和VARCHAR,最大长度允许为65535字节(CHAR最多可以为255字节,VARCHAR为65535字节)。
  • 而Oracle支持四种字符类型,即CHAR、NCHAR、VARCHAR2和NVARCHAR2;所有四种字符类型都需要至少1个字节长;CHAR和NCAHR最大可以是2000个字节,VARCHAR2和NVARCHAR2的最大限制是4000个字节。可能会在最新版本中进行扩展。

8.MySQL和Oracle的额外功能比较:

  • MySQL数据库不支持其服务器上的任何功能,如Audit Vault。
  • Oracle支持其数据库服务器上的几个扩展和程序,例如Active Data Guard,Audit Vault,Partitioning和Data Mining等。

9.临时表的区别:

Oracle和MySQL以不同方式处理临时表。

  • 在MySQL中,临时表是仅对当前用户会话可见的数据库对象,并且一旦会话结束,这些表将自动删除。
  • Oracle中临时表的定义与MySQL略有不同,因为临时表一旦创建就会存在,直到它们被显式删除,并且对具有适当权限的所有会话都可见。但是,临时表中的数据仅对数据插入表中的用户会话可见,并且数据可能在事务或用户会话期间持续存在。

10.MySQL和Oracle中的备份类型:

  • Oracle提供不同类型的备份工具,如冷备份,热备份,导出,导入,数据泵。Oracle提供了最流行的称为RecoveryManager(RMAN)的备份实用程序。使用RMAN,我们可以使用极少的命令或存储脚本自动化我们的备份调度和恢复数据库。
  • MySQL有mysqldump和mysqlhotcopy备份工具。在MySQL中没有像RMAN这样的实用程序。

11.Oracle和MySQL的数据库管理:

在数据库管理部分,Oracle DBA比MySQL DBA更有收益。与MySQL相比,Oracle DBA有很多可用的范围。

SQL相关基本语句

  1. 查询数据:
select * from tab_name where conditions order by field1 desc;(精准查询)
desc降序,asc升序
select * from tab_name where field1 like '%value1%'(模糊查询)
  1. 插入记录:
insert into tab_name(field1,field2)values(value1,value2);
  1. 删除记录:
delete from tab_name where conditions;
  1. 更新记录:
update tab_name set field1=value1,field2=value2 where conditions;
  1. 提交数据:
commit;
  1. 回滚数据:
rollback;
  1. 总数:
select count(*) from tab_name
  1. 求和:
select sum(field1) as sumvalue from tab_name
  1. 平均:
select avg(field1) as avgvalue from tab_name
  1. 最大:
select max(field1) as maxvalue from tab_name
  1. 最小:
select min(field1) as minvalue from tab_name
  1. 分组:
grounp by:一张表,一旦分组完成后,查询只能得到组相关的信息。
  1. between的用法,between限制查询数据范围时包括了边界值,not between不包括:
select * from tab_name where time between time1 and time2
select a,b,c from tab_name where a not between num1 and num2
  1. in的用法:
select * from tab_name where a [not] in ('值1','值2','值3','值4')
  1. 两张关联表,删除主表中已经在副表中没有的信息:
delete from tab1 where not exists 
(select * from tab2 where tab1.field1=tab2.field2)
  1. 四表联查:
select * from a 
left inner join b on a.a=b.b 
right inner join c on a.a=c.c 
inner join d on a.a=d.d 
where conditions
  1. 查询相同条目并记录重复次数(大于2):
select a,count(a) from tab_name group by a having count(*) > 2
  1. 创建数据库:
create database database-name;
  1. 删除数据库:
drop database database-name;
  1. 创建新表:
create table depart(
 dept_id int(11) not null auto_increment,
 depr_name varchar(255) default null,
 primary key(dept_id)
 );
  1. 根据已有的表创建新表:
create table tab_new like tab_old;(使用旧表B创建新表A) (MySQL)

备注:此种方式在将表B复制到A时候会将表B完整的字段结构和索引复制到表A中来。但不会复制数据。

create table tab_new as select col1,col2... from tab_old definition only; 

备注:此种方式只会将B表的字段结构复制到表A中来,但不会复制表B中的索引到表A中来。这种方式比较灵活可以在复制原来表结构的同时指定要复制哪些字段,并且自身复制表也可以根据需要增加字段结构。

  1. 删除表:
drop table tab_name;
  1. 新增表的别名:
comment on tab_name col is '测试'
  1. 更改表名:
alter table tab_oldName rename to tab_newName
  1. 增加一个列:
alter table tab_name add column_name type
  1. 添加主键:
alter table tab_name add primary key(col)
  1. 删除主键:
alter table tab_name drop primary key(col) 

一个数据表只可以有一个主键,所以不存在删除某一列的主键。

  1. 创建索引:
create [unique] index idxname on tab_name(col...)
  1. 删除索引:
drop index idxname;

索引是不可以更改的,想更改必须删除重新建。

  1. 创建视图:
create view viewname as select statement;
  1. 删除视图:
drop view viewname;

pro

查询锁:

select * from dba_blockers;

查询被阻塞的会话:

select * from dba_waiters;

显示两个表内的相同数据:

select column_name from tab_old intersect select column_name from tab_new;

面试:

  1. 查出销量前十的记录:
  2. Oracle:
过度设计:
select id,col from(
select rownum rn,uo.* from (select * from table order by sales desc) uo
where rownum<=10 ) ua;
最优:
select * from table order by sales desc where rownum<=10; 

MySQL:

select * from table order by sales desc limit 10; 
  1. 查找表中多余的重复记录,重复记录是根据单个字段(UserId)来判断
select * from table
where UserId in 
(select UserId from table group by UserId having count(UserId) > 1)
  1. 删除表中多余的重复记录,重复记录是根据单个字段(UserId)来判断,只留有rowid最小的记录
delete from table
where UserId in 
(select UserId from table group by UserId having count(UserId) > 1)
and rowid not in 
(select min(rowid) from table group by UserId having count(UserId)>1)
  1. 查找表中多余的重复记录(多个字段)
select * from table a
where (a.UserId,a.seq) in 
(select UserId,seq from table group by UserId,seq having count(*) > 1)
  1. 删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from table a
where (a.UserId,a.seq) in 
(select UserId,seq from table group by UserId,seq having count(*) > 1)
and rowid not in 
(select min(rowid) from table group by UserId,seq having count(*)>1)
  1. 查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from table a
where (a.UserId,a.seq) in
(select UserId,seq from table group by UserId,seq having count(*) > 1)
and rowid not in
(select min(rowid) from table group by UserId,seq having count(*)>1)

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言