sql server, mysql, oracle的简单用法和区别

Sqlservermysqloracle三者是目前市场占有率最高的关系型数据库,其特点如下:

一、Oracle:最贵,功能最多,安装最不方便,Oracle环境里的其他相关组件最多,支持平台数据量一般,使用中等方便,开发中等方便,不开源,速度最慢、最安全。

二、SQL Server:中等贵,功能最少,安装中等方便,sqlserver环境里的其他相关组件最少,支持平台最少,使用最方便,开发最方便,运维最方便,不开源,速度中等,一般安全

三、Mysql:免费,功能中等,安装最方便,mysql环境里的其他相关组件数量中等,支持平台最多,使用最不方便,开发最不方便,运维最不方便,有开源版本,速度最快,最不安全。

本文档主要列出Sqlserver、mysql、oracle不同的地方,且以常用的日常的sql取数及存储过程的相关内容为主。

1、字符串拼接

Sqlserver +
Mysql concat()
Oracle ||

 

2、空值处理数

Sqlserver isnull()
Mysql ifnull()

注意:mysql也有isnull()函数,但意义不一样

select a.mobile,isnull(a.mobile) ,ifnull(a. mobile,’空’)

from ud_connect_new a;

Oracle Nvl()

 

3、获取系统时间

Sqlserver getdate()
Mysql now()
Oracle sysdate

 

4、日期格式化(以常用的yyyymmdd格式为例)

Sqlserver convert(varchar(8),getdate(),112)
Mysql date_format(xcs_received_date,’%Y%m%d’)
Oracle to_char(sysdate,’yyyymmdd’)

 

5、检查是否有表再删除

Sqlserver IF   OBJECT_ID(‘xxx’) IS NOT NULL

需要用到系统表(dbo.sysobjects )来判断

Mysql drop table if exists tablename
Oracle select count(1) from user_tables where table_name = ‘xxx’

 

6、日期增加一个时间间隔

Sqlserver SELECT DATEADD(month, -1, getdate())
Mysql select   date_sub(now(),interval 1 month)
Oracle select   add_months(sysdate,1) from dual;

 

 

7、查询部分记录

Sqlserver top关键字
Mysql limit
Oracle 不支持mysql中limit功能,但可以通过rownum来限制返回的结果集的行数

 

8、Rollup()

Sqlserver group   by with rollup(xx)

  • order   by xx desc
Mysql group   by with rollup(xx)

–mysql这边不能带order by 语句

Oracle group   by rollup(xx)

–区别于sqlserver及mysql没有with

 

9、定义变量

Sqlserver Begin

 

DECLARE @count int

SET @count=123

Select @count

 

end

 

Mysql set @num1=(select    max(rank) From tmp_ud_test where is_member=1)/3;

set @num2=(select    max(rank) From tmp_ud_test where is_member=1)/3*2;

set @num3=(select    max(rank) From tmp_ud_test where is_member=1)/3*3;

 

update tmp_ud_test a set type=

case when   a.rank<=@num1 then 1

when   @num1<a.rank and a.rank<=@num2 then 2

when @num2<a.rank   and a.rank<=@num3 then 3 end

where a.is_member=1;

Oracle declare

count    number := 20;

currtime  date := sysdate;

 

begin

update xxx set aa=   count ,bb=  currtime;

end;

 

 

10、     rownum为列

Sqlserver 可直接当作字段使用,自动生成序列
Mysql select a.* ,@rownum:=@rownum+1 as rownum

From UD_DAILY_REPORT a,(select @rownum:=0) b;

Oracle 同sqlserver

 

11、     如何实现取每组的前几名(场景:查询出每个班级成绩最高的前三名学生,用到的表名及字段如下:)

Table:tmp_class_score

班级:class_id

成绩:score

Sqlserver Select

From (select a.*,row_number() over(partition by class_id order   by score) rank

from   tmp_class_score a)

where rank<=3

Mysql select * from (

select b.*,@rownum:=@rownum+1 ,

if(@pdept=b.class_id,@rank:=@rank+1,@rank:=1) as rank,

@pdept:=b.class_id

from (

select * from tmp_class_score    order by class_id, score desc

) b ,(select @rownum :=0 , @pdept := null ,@rank:=0) c ) result

where rank<=3;

Oracle Select

From (select a.*,row_number() over(partition by class_id order   by score) rank

from   tmp_class_score a)

where rank<=3;

 

Sqlserver 及Mysql还有rank () OVER 用替换row_number()over 实现并列排序,就是如果一个班级最高的成绩有2个人那用这个函数,取出来的排序,这2个同学显示序号都是1,这2个同学下面的同学显示的序号就会跳过2直接为3。

12、if … else …

Sqlserver IF @count>0

Set @num=36

[ ELSE

set @num=30

 

Mysql IF search_condition THEN statement_list

[ELSEIF search_condition THEN statement_list]

[ELSE statement_list]

END IF ;

 

Oracle 同mysql

 

注意:对于mysql及oracle来说,then,end if是必须的。

13、主键自增长

Sqlserver create table tb(id int identity(1,1) primary key )
Mysql create table tb(id int auto increment primary key )
Oracle ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。

例:使用序列自动增长:
create sequence se_id
start with 1
increment by 1
–使用序列实现自动增长:se_id.nextval

 

14、大体上讲,Oracle的数字类型更加简单,大部分情况直接设置number类型就行。而不需要像mysql及sqlserver设置个种数值类型

15、Oracle对子查询的支持非常好。而Mysql中的子查询效率就非常低

16、提交方式

Sqlserver 默认是自动提交
Mysql mysql默认是自动提交
Oracle 默认不自动提交,需要用户手动提交。Sql脚本中经常用到commit;

17、MySQL支持insert into tabl1 values (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1)。而sqlserver及oracle则不能这么插入,可用union all实现

18、oracle中一些常用的一些函数非常使用使用简单如decode(xx,1,’是’,2,’否’,3’未知’),同case when xx=1 then’是’ when xx=2 then ‘否’when xx=3 then’未知’ end。 其他还有to_char()、add_month、last_day()都是常用且容易理解简单的函数。

当然,sqlserver、mysql及oracle差别实在太多,我这边列的仅是平时可能经常遇到的一些区别,如有错误和遗漏请留言指正谢谢。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片