MySQL和Oracle的区别:

MySQL和Oracle都是流行的关系数据库管理系统(RDBMS),在世界各地广泛使用。大多数数据库以类似的方式工作。
二者有何区别?两个数据库的特性是不同的,所以与Oracle相比,MySQL的使用方式不同;与MySQL相比,Oracle的使用情况有所不同。它们的特点也是不同的。

1.本质的区别:

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

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有很多可用的范围。

MySQL

1.比较运算符能用"!="就不用"<>":
"!="增加了索引的使用几率。
2.明知只有一条查询结果,那就使用"LIMIT 1":
"LIMIT 1"可以避免全表扫面,找到对应结果就不会再继续扫描了。
3.为列选择合适的数据类型
能用TINYINT就不用SMALLINT,能用SMALLINE就不用INT,道理你懂得,磁盘和内存消耗越小越好嘛。
4.将大的DELETE,UPDATE or INSERT查询变成多个小查询
能写一个几十行、几百行的SQL语句是不是显得逼格很高?然而,为了达到更好的性能以及更好的数据控制,应将它们写成多个小查询。
5.使用UNION ALL 代替 UNION,如果结果集允许重复的话。因为UNINON ALL不去重,效率高于UNION.
6.为获得相同结果集的多次执行,请保持SQL语句前后一致。这样做的目的是为了充分利用查询缓冲。
比如根据地域和产品ID查询产品价格,第一次使用了:
SELECT price FROM order WHERE id='123456' and region='BEIJING'
那么第二次同样的查询,请保持以上语句的一致性,比如不要将where语句里面的id和region位置调换顺序。
7.尽量避免使用"SELECT "
如果不查询表中的所有的列,尽量避免使用SELECT
,因为它会进行全表扫描,不能有效利用索引,增大了数据库服务器的负担,以及它与应用程序客户端之间的网络IO开销。
8.WHERE子句里面的列尽量被索引
只是”尽量“,并不是所有的列。因地制宜,根据实际情况进行调整,因为有时索引太多也会降低性能。
9.JOIN子句里面的列尽量被索引。同样只是”尽量“,并不是说所有的列。
10.ORDER BY 的列尽量被索引。OEDER BY的列如果被索引,性能也会更好。
11.使用LIMIT实现分页逻辑。不仅提高了性能,同时减少了不必要的数据库和应用间的网络传输。
12.使用EXPLAIN关键字去查看执行计划。EXPLAIN可以检查索引使用情况以及扫描的行。
总结:SQL调优方法很多,同样的查询结果可以有很多种不同的查询方式。其实最好的方法就是在开发环境中用最贴近真实的数据集和硬件环境进行测试,然后再发布到生产环境中。

Oracle

基本SQL语句:
查询:select from tab_name where conditions order by field1 desc;(精准查询) desc降序,asc升序
select
from tab_name where field1 like '%value1%'(模糊查询)
插入:insert into tab_name(field1,field2)values(value1,value2);
删除:delete from tab_name where conditions;
更新:update tab_name set field1=value1,field2=value2 where conditions;
提交数据:commit;
回滚数据:rollback;
总数:select count() from tab_name
求和:select sum(field1) as sumvalue from tab_name
平均:select avg(field1) as avgvalue from tab_name
最大:select max(field1) as maxvalue from tab_name
最小:select min(field1) as minvalue from tab_name
分组:grounp by:一张表,一旦分组完成后,查询只能得到组相关的信息。
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
in的用法:select from tab_name where a[not] in ('值1','值2','值3','值4')
两张关联表,删除主表中已经在副表中没有的信息:delete from tab1 where not exists (select
from tab2 where tab1.field1=tab2.field2)
四表联查: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
查询相同条目并记录重复次数(大于2):SELECT a,count(a) FROM tab_name GROUP BY a HAVING count(
) > 2
创建数据库:create database database-name;
删除数据库:drop database database-name;
创建新表:create table depart(
dept_id int(11) not null auto_increment,
depr_name varchar(255) default null,
primary key(dept_id)
);
根据已有的表创建新表:
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中来。这种方式比较灵活可以在复制原来表结构的同时指定要复制哪些字段,并且自身复制表也可以
根据需要增加字段结构。
删除表:drop table tab_name;
新增表的别名:comment on tab_name col is '测试'
更改表名:alter table tab_oldName rename to tab_newName
增加一个列:alter table tab_name add column_name type
添加主键:alter table tab_name add primary key(col)
删除主键:alter table tab_name drop primary key(col) 一个数据表只可以有一个主键,所以不存在删除某一列的主键。
创建索引:create [unique] index idxname on tab_name(col...)
删除索引:drop index idxname; 索引是不可以更改的,想更改必须删除重新建。
创建视图:create view viewname as select statement;
删除视图: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;

Oracle中的in参数的个数限制:
Oracle中in后括号中的参数个数有限制,Oracle 9i 中个数不能超过256,Oracle 10g个数不能超过1000。
当in的个数大于1000时,有以下两个解决办法:
(1)对参数进行处理,分成多个in,其中每个in列表中参数都小于1000。如 params in(1,2,3.........1000) or params in(1001,1002...2000)。
不过这种方法性能和维护性方面不好
(2)将in后面的字符串改成子查询,将in里面的数据保存到临时表中,params in(select ....from dual)

SQL语句中过滤条件where和having的区别:
where是一个约束声明,使用where约束来自数据库的数据,where是在结果返回之前起作用,where中不能使用聚合函数。
Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。
在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行。而where子句在查询过程中执行优先级高于聚合语句。