数据库Oracle和MySQL 的不同

时间:2024-02-16 22:32:39

实例区别:

MySQL是轻量型数据库,开源免费Oracle收费,这个不是重点,,重点是它贵。

MySQL一个实例可以操作多个库,而Oracle一个实例只能对应一个库。

MySQL安装只有300多兆Oracle3个G。

 

操作的区别

主键MySQL一般使用自动增长型,Oracle需要使用序列对象。

单引号处理:MySQL 里可以用双引号包起字符串Oracle里只可以用单引号包 起字符串

分页的SQL语句:MySQL LIMIT,而 Oracle 需要使用内建视图和 rownum 伪列。

事务处理:MySQL 默认是自动提交,而 Oracle 默认不自动提交,需要用户 CTL 语言进行事务提交。

 

MySQL创建数据库(MySQL的表的创建都需要在有数据库的情况下

创建数据库以及设置数据库的编码:

create database sxt default CHARACTER set utf8;

 

查看数据库:

show databases;

查看数据库编码:

select SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME from information_schema.SCHEMATA where SCHEMA_NAME=\'sxt\';

 

删除数据库命令:

drop database sxt;

 

创建表之前需要表示一下用哪个数据库  不然会报错的

use bjsxt;

 



MySQL拥有的数值类型

 

MySQL拥有的字符串处理类型

 

MySQL拥有的日期串处理类型

Oracle仅仅date表示日期和时间,MySQL的时间和日期是分开的

 

二进制数据(BLOB):

1)BLOB TEXT 存储方式不同,TEXT 以文本方式存储,英文存储区分大小写,而 Blob是以二进制方式存储,不分大小写。

2)BLOB 存储的数据只能整体读出。3)TEXT 可以指定字符集,BLOB 不用指定字符集。

 

Oracle和MySQL的DDL(数据库定义语言)都是相差不太多。

由于MySQL是默认自动提交的,所以不需要去手动commit,但是它也可以设置成手动提交数据。

mysql> start transaction;

这样设置,就需要自己手动提交数据了。

 

Oracle和MySQL的DML(数据库操作语言)俩者几乎没什么差距。

Oracle和MySQL的DQL(数据库查询语言)俩者一样。

MySQL有主键是自动增长类型。所以在设置这个属性有所不同:

alter table emp modify employee_id int auto_increment;

如果要删除主键约束和唯一约束(都有自动增长类型)需要先删除自动增长类型:

alter table emp modify employee_id int;

在添加约束和删除约束俩者都还差不多,不同之处还是这个自动增长

 

 

在插入数据时如果有主键或者唯一约束是自动增长类型,需要用default或者null ,0去占位

insert into departments values(default,"development",2);

自动增长类型:每次增长1,和Oracle的序列效果是一样的,只不过Oracle的序列比它的功能更多。

 

MySQL 中的自动增长类型要求:

一个表中只能有一个列为自动增长。

自动增长的列的类型必须是整数类型。

自动增长只能添加到具备主键约束与唯一性约束的列上。

删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长然后在删除约束。

 

默认值处理:

MySQL 中可以使用 DEFAULT 为字段设定一个默认值。如果在插入数据时并未指定该列的值,那么 MySQL 会将默认值添加到该列中

 

例:创建 emp3 表,该表包含 emp_id 主键且自动增长,包含 name,包含 address 该列默认 值为”未知”。

create table emp3(emp_id int primary key auto_increment,name varchar(30), address varchar(50) default \'Unknown\');

 

修改表添加列的默认值:

alter table emp3 add column job_id int default 0;

插入数据时的默认值处理:

如果在插入数据时并未指定该列的值,那么 MySQL 会将默认值添加到该列中。如果是完全项插入需要使用 default 来占位。

例:向 emp3 表中添加数据,要求 address 列与 job_id 列使用默认值作为该列的值。

insert into emp3(name) values("admin"); insert into emp3 values(default,"oldlu",default,default);

 

mysql update 的特点:

更新的表不能在 set where 中用于子查询;

• update 后面可以做任意的查询

 

在删除表中的列数据,MySQL有俩种方法:delete和truncate

• truncate 是整体删除(速度较快), delete 是逐条删除(速度较慢);

• truncate 不写服务器 logdelete 写服务器 log,也就是 truncate 效率比 delete 高的原因;

• truncate 是会重置自增值,相当于自增列会被置为初始值,又重新从 1 开始记录,而不是接着原来的值。而 delete 删除以后,自增值仍然会继续累加。

 

例:删除 emp3 表中 emp_id 为 5 的雇员信息。

delete from emp3 where emp_id = 5;

 

例:删除emp3表中的数据:

TRUNCATE table  emp2;

 

 

MySQL中SELECT 语句中的算术表达式:

+ :加法运算

- :减法运算

* :乘法运算

/ :除法运算,返回商

% :求余运算,返回余数

 

MySQL 中的连字符:

MySQL 中并不支持||作为连字符,需要使用 concat 函数。在参数数量上与 oracle concat函数有区别。

 

例:查询雇员表中的所有数据,将所有数据连接到一起,每列值中通过#分割。

select concat(employees_id,\'#\',last_name,\'#\',email,"#",salary,"#",commission_pct) from employees;

 

排序和比较,以及约束,模糊查询,逻辑运算符MySQL和Oracle都是一样。

MySQL没有到目前为止没有检查约束!!

• %表示任意多个任意字符

• _表示一个任意字符

 

注意:MySQL的伪表dual可以省略

 

MySQL的字符处理函数(Oracle的字符串处理类型):

CONCAT(str1,str2,...) str1str2 等字符串连接起来

select CONCAT(\'sdda\',\'sda\',\'weqw\')

 

 

TRIM(str) str 中删除开头和结尾的空格(不会处理字符串中间含有的空格)

select TRIM(\'  dad  sda  \')

select LENGTH(TRIM(\'  dad  sda  \'))

 

 

 

LTRIM(str) str 中删除左侧开头的空格

select LTRIM(\'  dad  sda  \')
select LENGTH(LTRIM(\'  dad  sda  \'))

 

RTRIM(str) str 中删除右侧结尾的空格

select rTRIM(\'  dad  sda  \');
select LENGTH(rTRIM(\'  dad  sda  \'));

 

 

数字函数俩个都是一样的(Oracle的数值类型

MySQL日期函数(Oracle日期处理类型

SYSDATE() 或者 NOW() 返回当前系统时间,格式为 YYYY-MM-DD hh-mm-ss

select SYSDATE()

 

CURDATE() 返回系统当前日期,不返回时间

SELECT CURDATE()

 

DAYOFMONTH(date) 计算日期 d 是本月的第几天

select DAYOFMONTH(SYSDATE())

 

DAYOFYEAR(date) 返回指定年份的天数

select DAYOFYEAR(SYSDATE())

 

DAYNAME(date) 返回 date 日期是星期几

select DAYNAME(SYSDATE())

 

CURTIME() 返回当前系统中的时间,不返回日期

select CURTIME()

 

DAYOFWEEK(date) 日期 d 今天是星期几,1 星期日,2 星期一,以此类推

select DAYOFWEEK(SYSDATE())

 

MySQL转换函数(Oracle的字符转换函数):

DATE_FORMAT(date,format) 将日期转换成字符串(类似 oracle 中的 to_char()

select DATE_FORMAT(sysdate(),\'%Y年%m月%d日\');

 

STR_TO_DATE(str,format) 将字符串转换成日期(类似 oracle 中的 to_date()

select STR_TO_DATE(\'2019年8月1日\',\'%Y年%m月%d日\')

 

 

MySQL通用函数(Oracle中的通用函数

IFNULL(expr1,expr2) 判断 expr1 是否为 null,如果为 null,则用 expr2 来代替 null (类似 oracle NVL()函数)

select IFNULL(null,25)

 

IF(expr1,expr2,expr3) 判断 expr1 是否为真(是否不为 null),如果为真,则使用 expr2 替代 expr1;如果为假,则使用 expr3 替代 expr1(类似 oracle NVL2()函数)

select IF(1=2,3,4)

 

全外链接:

注意:MySQL 中不支持 FULL OUTER JOIN 连接

可以使用 union 实现全完连接。

 

 例:查询所有雇员的名字以及他们的部门名称,包含那些没有雇员的部门以及没有部门的雇员。

(select e.last_name,d.department_name from employees e LEFT OUTER JOIN departments
d on e.dept_id = d.department_id) UNION (select e1.last_name,d1.department_name from employees e1 RIGHT OUTER JOIN departments d1 on d1.department_id = e1.dept_id)