设为首页 收藏本站
查看: 1125|回复: 0

[经验分享] sql server, mysql, oracle平时用法的区别

[复制链接]

尚未签到

发表于 2017-12-10 23:42:30 | 显示全部楼层 |阅读模式
  由于工作的原因,上家公司一直使用的oracle,目前加入acxiom后接触的几个项目,既有使用mysql的又有使用sqlserver,自己在使用sqlserver及mysql要实现某功能时,经常要在网上找来找去,所以打算大概整理下这3个数据库在平时取数的一些不同点。
  Sqlserver、mysql、oracle三者是目前市场占有率最高的关系型数据库,网上总结的这3个数据库总体的特点如下:
  一、              Oracle:最贵,功能最多,安装最不方便,Oracle环境里的其他相关组件最多,支持平台数据量一般,使用中等方便,开发中等方便,不开源,速度最慢、最安全。
  二、              Microsoft 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>  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>  ) b ,(select @rownum :=0 , @pdept := null ,@rank:=0) c ) result
  where rank<=3;
  Oracle
  Select

  From (select a.*,row_number() over(partition by>  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>  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差别实在太多,我这边列的仅是平时可能经常遇到的一些区别,肯定还有一些遗漏或不准确的地方。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-422824-1-1.html 上篇帖子: 手动安装Oracle的Maven依赖 下篇帖子: 连接并传参查询Oracle数据库(C#)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表