大家都知道,在企业的数据库应用中,就属Oracle和mysql数据库应用的最为广泛,oracle数据库通常用于大型企业的数据库构建,而中小型企业大多会选择mysql数据库,其运行和维护成本都较小,那么,oracle和mysql在语法上有哪些细微的区别呢,在进行详细的讨论之前,我先建一个示例表:
Create tablestudent(
Sno int primarykey,
Sname varchar(10)not null,
Sage int,
Sex char,
Address varchar(20)
);
1、修改表中的列定义
Mysql中修改列的数据类型用的是modify关键字(前提是该列中还没有数据),修改表的表名称用rename to,修改整个列(包括列名,数据类型和完整性约束)则是用的change,并且修改时要将整个列的定义完整的重新写一遍,即使只是修改一个地方。
eg:alter table student modify列名 新的列类型
alter table student change 原列名 新列名 新列类型 新完整性约束
2、主键自动增长
Mysql可以通过在定义主键时在后面加上auto_increment,即可实现插入数据时主键自动增长,避免出现插入数据时重复的问题。
eg: sno int primary key auto_increment
oracle不能设置列自动增长,但oracle可以用序列加触发器来解决自动增长问题达到与mysql一样的效果
3、分页查询功能
Mysql中的分页查询功能用limit关键字实现,用于缩小搜索范围,limit关键字也可用于数据的前后指定数目查询。
eg:Select sage from student where sno limit 0,5;(查询学生表中学号为1——5的学生年龄)
limit后的两个参数:第一个参数为查询的起始位置,但不包含该位置,即如果是0,则实际从第一个开始,如果是1,则实际从第二个数开始;第二个参数为要查询的记录条数。
Oracle的分页功能则是用的伪列(rownum),
eg:select * from student where rownum between 0 and 5.
4、列的连接操作
Oracle中用' || '来实现连接操作,而mysql则可用函数concat(列名1,列名2,…,列名n)来连接所有列,可进行任意字段的模糊查询
eg:查询所有家庭住址在武汉的学生的信息
select s.* from student s,(selectsno,concat(sno,sname,sage,sex,address) words from student) t where s.sno=t.snoand t.words like “%武汉%”;
5、外关联的连接查询
Oracle中可以(+)来实现,等号两边哪边有(+)就代表哪边在连接时数据可以为null,即另一边即为连接的主表,也可以用left/right join。mysql只能用left/right join。
6、获取系统当前日期
Oracle 用sysdate,mysql用now()函数
7、生成随机序列的函数
Oracle用sys_guid(),mysql用UUID()
8、时间格式化函数
将时间转换为字符串型时间 MySQL date_format(NOW(),'%Y-%m-%d') 对应Oracle的 Oracle中的 to_char(sysdate, 'YYYY-MM-DD');
将字符串型时间转换为时间类型 MySQL str_to_date('2019-01-01','%Y-%m-%d') 对应Oracle中的 to_date('2019-01-01', 'YYYY-MM-DD');
9、条件函数(nvl()、nvl2()、decode())
Oracle中的nvl(tab.columnName, 0):如果tab.columnName值为空,则返回值取0,否则取tab.columnName;对应的MySQL函数为:ifnull(tab.columnName, 0)。
Oracle中的nvl2(expr1,expr2,expr3):如果expr1不为null,则返回expr2,否则返回expr3;对应的MySQL函数为:if(expr1,expr2,expr3)。 Oracle中的DECODE(value, val1, val2, val3):如果value等于val1,则返回val2,否则返回val3;MySQL可用IF函数表示:if(value=val1, val2, val3);
Oracle中的 DECODE(value, if1, val1, if2,val2,...,ifn, valn, val):如果value等于if1,则返回val1,如果value等于if2,则返回value2...如果value等于ifn,则返回valn,否则返回val;MySQL对于这种判断可以通过case when then else end;l来判断,即:case when value=if1 then val1 when value=if2 then val2,,,when value=ifn then valn else val end;
10、类型转化函数
Oracle中的to_char(123):将数字123转换为字符串123;MySQL对应的函数为CAST(123 AS CHAR(3));
Oracle中的 to_number('123'):将字符串数字123转换为数字类型;MySQL对应的函数为cast('123' as SIGNED);
11、获取字符串长度的函数
Oracle中的length(str)对应mysql中的char_length(str)。
12、 将某个字段的多行合并成一行,以逗号分割
Oracle中用wm_concat(),或者LISTAGG() within group(order by ) 实现,mysql中用group_concat()来实现
eg:查询年龄大于18小于22的学生名称,以逗号连接
Oracle: select wm_concat(Sname, ',') sname from student where sage between 18 and 22;
select LISTAGG(Sname, ',') within group(order by sage ) sname from student where sage between 18 and 22;
Mysql: select group_concat(Sname) sname from student where sage between 18 and 22;
13、pl/sql块
mysql中只允许在存储过程和函数中写pl/sql,oracle允许直接执行pl/sql代码段(begin ...end包裹)。oracle中只能识别单引号,mysql中单双引号均可识别。
另外,还有一些sql语句在增删改查以及DDL语句上的细微差别在另一篇博客上有详细的解释,我就不再赘述了:
http://blog.youkuaiyun.com/alanzyy/article/details/8313484
此博客会随着博主的深入学习不断更新的。。。