当前位置: 首页 > 工具软件 > MySQL Maria > 使用案例 >

Oracle与Maria的区别

柳项明
2023-12-01

目录

sysdate

sequence

分页

拼接字符串

decode与if

trunc与truncate

to_date与date_format

sysdate:

在oracle中的写法是:

select sysdate from dual

注意:必须加上from dual,否则报错,只支持sysdate ;mysql不一样,mysql的是sysdate()函数。

在mysql中写法:

select SYSDATE();
select now();
select SYSDATE() from dual;
select now() from dual;

 mysql中(1)可以加上from dual,可以不加;(2)有两个函数,分别是SYSDATE() 和 now() 函数。

 参考:oracle和mysql获取当前时间的不同

序列号:

最简单创建,Oracle和Maria都一样:

CREATE SEQUENCE seq_00;

但是默认生成的创建脚本却不一样:

# Maria
CREATE SEQUENCE "seq_00" start with 1 minvalue 1 maxvalue 9223372036854775806 
increment by 1 cache 1000 nocycle

# Oracle
CREATE SEQUENCE "db_name"."seq_00" minvalue 1 maxvalue 
9999999999999999999999999999
increment by 1 start with 1 cache 20 noorder nocycle nokeep global;

区别如下:

1.SQL的字段顺序不同,这个不影响;

2.SQL字母大小写不同,Maria除了CREATE SEQUENCE是大写字母,其余全是小写;Oracle全是大写字母,我上面的脚本是粘贴的,没有改变成Oracle原来的样子;这一点也不影响。不知道是否与客户端有关?

3.maxvalue取值不同,Maria不是以999...之类的取值方式,而是19位的数字;Oracle是28位都是9的数字;

4.cache数量不同,Maria和MySQL一样,都是缓存1000个序列号备用;而Oracle是20个;

5.控制字段数量不同。Oracle比Maria多了3个控制字段,分别是:noorder nokeep global;

noorder是配合cache使用的,在使用cache的时候并发情况下如果是noorder的话会导致数字跳过某一个或某几个,顾名思义。nokeep测试了各种情况没有发现什么影响,这里不作过多深入探究。global没有测试。

相同点如下:

1.默认都是从1开始计算,也就是说最小值都是1;

2.默认步长,也就是每次增加的数值,都是1;

3.默认都是nocycle,即不循环。如果是cycle的话,当取值到最大值之后会重新从设定的最小值循环。这里注意:

        初始值一定要介于最小值与最大值之间(等于也可以),不然会报错。

如果是nocycle,取值超过最大值后脚本会报错,只是两者给的报错的原因提示不一样:

Oracle的报错:

ORA-08004:序列 xxx exceeds MAXVALUE 无法实例化。。。

Maria的报错:

SQL 错误 [4084] [HY000]: (conn=20) Sequence 'SAOS.seq_04' has run out

 复杂创建方式,就自己定义参数取值了,这里不再赘述,可以参考其他优秀文章。

比如:

CREATE SEQUENCE `seq_03` start with 1 minvalue 5 maxvalue 10 increment 
by 1 cache 1000 cycle ENGINE=InnoDB;

实际上,以上代码执行会报错,因为我们上面说过,初始值必须介于最小值与最大值之间。

正确的如下:

CREATE SEQUENCE `seq_04` start with 5 minvalue 1 maxvalue 10 increment 
by 1 cache 1000 nocycle ENGINE=InnoDB;

查看下一个序列号:

Maria支持的方式比较多,如下:

# Maria查看下一个序列号和当前序列号
SELECT NEXTVAL(seq_01);
# Maria不支持此种方式,Oracle也不支持。
# SELECT CURRVAL(seq_01);
SELECT seq_01.nextval;
SELECT seq_01.currval;

SELECT seq_01.nextval from seq_01 ;
SELECT NEXTVAL(seq_01) from seq_01;
SELECT seq_01.currval from seq_01

SELECT seq_01.nextval from dual;
SELECT NEXTVAL(seq_01) from dual;
SELECT seq_01.currval from dual;
# 不支持
# SELECT CURRVAL(seq_01) from dual;

 Oracle支持的如下:

# Oracle
SELECT seq_01.nextval from dual;
SELECT seq_01.currval from dual;

关于序列号,改天抽空写一篇文章集中讲一讲。

分页:

Oracle常用分页方式:

SELECT 
    ROWN,
    ID,
    NAME,
    AGE,
    LST_UPD_TIME
FROM (
    SELECT
        ROWNUM ROWN,
        T.*
    FROM (
        SELECT
            ID,
            NAME,
            AGE,
            LST_UPD_TIME
        FROM
            USER
        WHERE
            ID = 'id'
    ) T
WHERE
    ROWN = 2;

Maria分页SQL:

SELECT
    ID,
    NAME,
    AGE,
    LST_UPD_TIME
FROM
    USER
LIMIT 0, 10;

拼接字符串:

Oracle是两个竖线:||。

Maria是concat(str1, str2),或者concat(separator, str1, str2)。其中str1/str2是要拼接的字符串;separator是拼接字符,也就是以什么来拼接。示例如下:

select CONCAT(id, userName, passWord) from `user` u ;
select CONCAT_WS("-", id, userName, passWord) from `user` u ;

取值分别如下: 

1zhangsan123456
2lisi123456
3wangwu123456
4maliu123456

1-zhangsan-123456
2-lisi-123456
3-wangwu-123456
4-maliu-123456

 字符串转数字

Oracle:

# Oracle。我们假设密码是纯数字的。
select * from user where id > 10 order by to_number(password);

Oracle的to_number()不能放在查询项中,即在select 之后,而且在order by之后使用,但是不能没有where条件,不然会报错。

 Maria:

SELECT * from `user` u WHERE passWord+0 < 123456;
SELECT * from `user` u WHERE passWord < 123456;
SELECT '00123'=123  from `user` u ;
SELECT '00123'=1234  from `user` u ;
SELECT * FROM `user` u order by passWord + 0;
ELECT * FROM `user` u order by passWord;

实际上Maria的字符串和数字比较带不带引号都一样的,都可以直接比较,但是order by的时候就不行了,必须转化,不然会出现不是我们要的结果。比如,123456比456小。

 取值分别如下:

1    zhangsan    123    2022-02-18 16:02:32.000
2    lisi    456    2022-02-18 16:02:32.000

 1    zhangsan    123    2022-02-18 16:02:32.000
2    lisi    456    2022-02-18 16:02:32.000

 1
1
1
1

0
0
0
0

1    zhangsan    123    2022-02-18 16:02:32.000
2    lisi    456    2022-02-18 16:02:32.000
3    wangwu    123456    2022-02-16 11:23:45.000
4    maliu    123456    2022-02-16 11:23:45.000 

 1    zhangsan    123    2022-02-18 16:02:32.000
3    wangwu    123456    2022-02-16 11:23:45.000
4    maliu    123456    2022-02-16 11:23:45.000
2    lisi    456    2022-02-18 16:02:32.000

 我们得出Maria的结论如下:

1.字符串和数字可以直接比较大小,前面是否有数字0不影响比较结果;

2.排序比较的话,如果是比较数字大小,必须转化,不然会出现不是我们结果;

3.字符串转数字的办法就是直接+0。

获取年、月、日

Oracle

select to_char(sysdate, 'YYYY') from dual;
select to_char(sysdate, 'MM') from dual;
select to_char(sysdate, 'DD') from dual;

Maria

SELECT date_format(SYSDATE() ,'%Y-%m-%d')  from dual;
SELECT date_format(SYSDATE() ,'%Y')  from dual;
SELECT date_format(SYSDATE() ,'%m')  from dual;
SELECT date_format(SYSDATE() ,'%d')  from dual;

decode与if

Oracle中有decode函数,它的作用是,如果满足条件则取值1,不满足则取值2;具体可以参考这篇文章:Oracle 中 decode 函数用法

同样的在Maria中有类似语法,那就是if。

IF(条件, str1, str2);

Oracle的trunc函数和MySQL的truncate函数

用于截取时间或者数值,返回指定的值。具体可以参考这篇文章:

trunc 函数用法

而在Maria中不存在trunc函数。不过针对时间的操作Maria有date_format——关于date_format请往上翻查看date_format的用法,针对数值的有truncate函数。具体可以参考这篇文章 :

Oracle的trunc函数与MySQL(Maria)的truncate函数

 类似资料: