Oracle和mysql数据库中sql语句的一些细微差别

大家都知道,在企业的数据库应用中,就属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.csdn.net/alanzyy/article/details/8313484

此博客会随着博主的深入学习不断更新的。。。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值