sql server,mysql,oracle平时用法的区别
由于工作的原因,上家公司一直使用的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)
|
|
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没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。 例:使用序列自动增长: |
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平时用法的区别的更多相关文章
- SQL Server,MySQL,Oracle三者的区别
SQL Server,MySQL,Oracle三者的区别 2016-10-14 转自:SQL Server,MySQL,Oracle三者的区别 目录 1 Oracle.Sql Server.MySql ...
- 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接
前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...
- Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决
Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...
- SQL SERVER与ORACLE的几点区别
1.数据类型不同. sql server 的数据类型 int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatet ...
- SQL Server,MySql,Oracle数据库的默认端口号
SQL Server默认端口号为:1433 MySQL 默认端口号为:3306 Oracle 默认端口号为:1521
- JMeter配置JDBC测试SQL Server/MySQL/ORACLE
一.配置SQL Server 1.下载sql驱动,将sqljdbc4.jar放到JMeter安装目录/lib下. 2.启动JMeter,右键添加->配置文件->JDBC Connectio ...
- 数据库 --> SQL Server 和 Oracle 以及 MySQL 区别
SQL Server 和 Oracle 以及 MySQL 区别 三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非 ...
- 【转】SQL Server与Oracle的区别
转自:http://soft.chinabyte.com/database/255/12258255.shtml SQL Server与Oracle的区别 2012-02-10 00:00 中国IT实 ...
- 【转】SQL Server、Oracle、MySQL和Vertica数据库常用函数对比
SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 1. 绝对值 S:select abs(-1) valu ...
随机推荐
- 在windows环境下运行compass文件出现的错误提示解决方案
在windows环境下运行compass文件出现的错误提示解决方案 例如:经常在项目中运行grunt命令编译scss文件的时候,会出现下面的错误提示 (Encoding::CompatibilityE ...
- ArcGIS Geodabase OBJECTID重新初始编号的间接方法
ArcGIS Geodabase OBJECTID为Long型,随着Feature的增加和删除自动编号,均为增加.即删除Feature后,再增加该号码自动只增加不重新编号. 间接方法可以实现重新从1编 ...
- Android上使用RecyclerView实现顶部悬浮标题效果的Sticky Title View
目前很多的项目都在使用顶部悬浮标题的效果,很明显,这的确是一个比较人性化,用户体验效果比较好的UI交互效果,对于这个效果,有很多种实现方式,如果说要用RecyclerView来实现一个分类信息展示,并 ...
- Unity 多个Android sdk 插件如何组织目录
一般Android 插件放在 Assets/Plugins/Android/ 下, 但是一个项目可能要用到多个sdk , 比如既要用 阿里九游的sdk 又要用 share sdk 怎么办呢, 难道要只 ...
- SELECT s.* FROM person p INNER JOIN shirt s ON s.owner = p.id WHERE p.name LIKE 'Lilliana%' AND s.color <> 'white';
SELECT s.* FROM person p INNER JOIN shirt sON s.owner = p.idWHERE p.name LIKE 'Lilliana%'AND s.color ...
- C#并行编程 z
目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-PLINQ:声明式数据并行 背景 基于任务的程序 ...
- June 09th 2017 Week 23rd Friday
The supreme happiness of life is the conviction that we are loved. 生活中最大的幸福就是,坚信有人爱着我们. One of my go ...
- 如何从ERP将Material的Batch信息下载到CRM并存储在settype COMM_PR_BATCH里
前提条件:必须先确保三个对象ATTRIBUTE, CLASS和OBJCL成功下载.可以到事物码R3AM1里查看,确保状态全部为Done. (1) 在事物码MM02里,切换到视图classificati ...
- python3乱码问题:接口返回数据中文乱码问题解决
昨天测试接口出现有一个接口中文乱码问题,现象: 1 浏览器请求返回显示正常 2 用代码请求接口返回数据中文显示乱码 3 使用的python3,python3默认unicode编码,中文都是可以正常显示 ...
- 20150103 海南铁汉vs哈尔滨毅腾
本文首发于『懂球帝』 这一场球赛虽然极其普通,在各位懂球帝面前或许不值得一提,但它极具历史意义,因为这是海南第一个职业联赛队伍的首场正式比赛,同时也是海南铁汉队第一次在正式比赛中与球迷们见面. 稍做一 ...