由于工作的原因,上家公司一直使用的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. 3D开源推荐:全球卫星地图 Esri-Satellite-Map

    演示网址:http://richiecarmichael.github.io/sat/index.html 开源网址:https://github.com/richiecarmichael/Esri- ...

  2. C++之不带指针类的设计——Boolean

    经典的类设计分类 带指针类 不带指针类 Header文件的布局 #ifndef __COMPLEX__ #define __COMPLEX__ #include <iostream.h> ...

  3. .Net中会存在内存泄漏吗

    所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中..Net 中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉.虽然.N ...

  4. matlab练习程序(模拟退火SA)

    模拟退火首先从某个初始候选解开始,当温度大于0时执行循环. 在循环中,通过随机扰动产生一个新的解,然后求得新解和原解之间的能量差,如果差小于0,则采用新解作为当前解. 如果差大于0,则采用一个当前温度 ...

  5. HttpWebResponse对gzip格式返回结果的处理

    HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); HttpWebRes ...

  6. BIEE入门(二)物理层的定义

    使用BIEE的第一步是使用admintool去建立一个多维数据模型,而建立多维数据模型的第一步则是建立物理层,请注意因为BIEE本身并不存 储数据,所以所谓BIEE物理层的意义是需要在BIEE里建立各 ...

  7. tdf sample

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  8. 西门子 1500 1200 PLC,位访问, 字节访问

    访问byte,word中的位 mybyte.%X1 myword.%X1 访问word/dword中的byte myword.%B0 myword.%B1 myDword.%B0 文中mybyte, ...

  9. GridView中的更新按钮不能触发RowUpdating事件

    当点击“编辑”按钮以后,可以看到“更新”和“取消”按钮,“取消”按钮可以正常触发RowCancelingEdit事件,但是“更新”按钮不能触发RowUpdating事件. 解决方案: 在<asp ...

  10. IOS 摇一摇的方法

    ● 监控摇一摇的方法 ● 方法1:通过分析加速计数据来判断是否进行了摇一摇操作(比较复杂) ● 方法2:iOS自带的Shake监控API(非常简单) ● 判断摇一摇的步骤:实现3个摇一摇监听方法 ● ...