目录
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和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函数
用于截取时间或者数值,返回指定的值。具体可以参考这篇文章:
而在Maria中不存在trunc函数。不过针对时间的操作Maria有date_format——关于date_format请往上翻查看date_format的用法,针对数值的有truncate函数。具体可以参考这篇文章 :