Sqlserver Mysql Oracle 平时用法的区别
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 descMysql
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、 如何实现取每组的前几名()
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()都是常用且容易理解简单的函数。
19、触发器,储存过程语法区别,就不列了