由于工作的原因,上家公司一直使用的oracle,后来接触了的几个项目,既有使用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 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差别实在太多,我这边列的仅是平时可能经常遇到的一些区别,肯定还有一些遗漏或不准确的地方。

sql server,mysql,oracle平时用法的区别的更多相关文章

  1. SQL Server,MySQL,Oracle三者的区别

    SQL Server,MySQL,Oracle三者的区别 2016-10-14 转自:SQL Server,MySQL,Oracle三者的区别 目录 1 Oracle.Sql Server.MySql ...

  2. 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接

    前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...

  3. Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决

    Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...

  4. SQL SERVER与ORACLE的几点区别

    1.数据类型不同.      sql server 的数据类型 int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatet ...

  5. SQL Server,MySql,Oracle数据库的默认端口号

    SQL Server默认端口号为:1433 MySQL 默认端口号为:3306 Oracle 默认端口号为:1521

  6. JMeter配置JDBC测试SQL Server/MySQL/ORACLE

    一.配置SQL Server 1.下载sql驱动,将sqljdbc4.jar放到JMeter安装目录/lib下. 2.启动JMeter,右键添加->配置文件->JDBC Connectio ...

  7. 数据库 --> SQL Server 和 Oracle 以及 MySQL 区别

    SQL Server 和 Oracle 以及 MySQL 区别 三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非 ...

  8. 【转】SQL Server与Oracle的区别

    转自:http://soft.chinabyte.com/database/255/12258255.shtml SQL Server与Oracle的区别 2012-02-10 00:00 中国IT实 ...

  9. 【转】SQL Server、Oracle、MySQL和Vertica数据库常用函数对比

    SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 1. 绝对值 S:select abs(-1) valu ...

随机推荐

  1. SQL Server日期格式化

    0   或   100   (*)     默认值   mon   dd   yyyy   hh:miAM(或   PM)       1   101   美国   mm/dd/yyyy       ...

  2. 禁止IOS双击上滑

    var agent = navigator.userAgent.toLowerCase(); var iLastTouch = null; if (agent.indexOf("iphone ...

  3. java面试题----String、StringBuffer、StringBudder区别

    面试题1 - 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好? 面试题2 - 请说出下面程序的输出. class ...

  4. 使用 yield生成迭代对象函数

    https://www.cnblogs.com/python-life/articles/4549996.html https://www.liaoxuefeng.com/wiki/001431608 ...

  5. 成功解决:FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is

    问题原因: 包内出错,是h5py包 解决思路: 执行如下操作: pip -- install h5py==2.8.0rc1 注意:如果执行pip install h5py==2.8.0rc1 成功话, ...

  6. /etc/hosts.allow和/etc/hosts.deny详解

    今天遇到一台服务器22端口正常,但是通过ssh连接的问题.排查了防火墙和端口问题,半天没有找出来原因,后来求助大神,终于明白了通过etc目录下hosts.deny和hosts.allow文件可以限制远 ...

  7. Windows快捷操作技巧

    隐藏技能 在当前路径打开命令行 shift + 右键点击文件夹内的空白处,你会看到右键弹出菜单多了个选项 "在此处打开命令窗口",省去了打开命令行再cd到当前路径的麻烦. 快捷键 ...

  8. Fiori里花瓣的动画效果实现原理

    Fiori里的busy dialog有两种表现形式,一种是下图里的花朵形状,由5个不断旋转的花瓣组成.另一种是下图的3/4个圆环不断旋转的效果. 关于前者的效果,可以看我制作的这个视频.这个视频是手动 ...

  9. python+pymssql+selenium 获取短信验证码登录(实战练习)

    登录页面输入手机号, 获取短信验证码(验证码有10分钟有效期) 1 连接sql server数据库,获取10分钟之内的有效短信验证码 2 页面输入手机号,并获取验证码.若存在有效验证码则输入验证码,若 ...

  10. Hibernate 一对一关联关系

    双向一对一关联关系: 域模型: 例如,部门只有一个部门经理,一个经理也只能管理一个部门.即,Department 中有一个Manager的引用,Manager 中又有一个Department 的引用. ...