SQL Server 和 MySql 语法和关键字的区别

SQL Server MySql 语法和关键字的区别

------用于SQLServer到MySql的转换

  1. mysql的ifnull()函数对应sql的isnull()函数;
  2. mysql的存储过程中变量的定义去掉@;
  3. mysql的每句结束要用";"
  4. SQLServer存储过程的AS在MySql中需要用begin .....end替换
  5. 字符串连接用concat()函数;

如 SQLServer: Temp='select * from '+'tablename'+...+...

MySql:Temp=concat('select * from', 'tablecname',...,...)

  1. mysql的uuid()对应sql的GUID();
  2. MySql的out对应SQLServer的output,且mysql 的out要放在变量的前面,SQLServer的output放在变量后面

MySql out,in,inout的区别------

MySQL 存储过程 "in" 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible)。

MySQL 存储过程 "out" 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值。

MySQL 存储过程 inout 参数跟 out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout 参数传递值给存储过程。

(8)MySQL的if语句为

if (条件) then

end if;

或者

If (条件) then

Else

End if

或者

If(条件)then

Elseif (注意不能写成 Else if )

Elseif

...

End if

(9)Mysql的Execute对应SqlServer的exec;

(注意:必须像下面这样调用)

Set @cnt='select * from 表名';

Prepare str from @cnt;

Execute str;

(10)MySql存储过程调用其他存储过程用call

Call 函数名(即SQLServer的存储过程名)('参数1','参数2',......)

(11) mysql的日期

1获得当前日期函数:curdate(),current_date()

2获得当前时间函数:curtime();

3获得当前日期+时间:now();

4MySQL dayof... 函数:dayofweek(), dayofmonth(), dayofyear()分别返回日期参数,在一周、一月、一年中的位置。

(注:周日=1,周一=2,周二=3,......)

5返回本月的天数:select day(last_day(now()));

6MySQL 为日期增加一个时间间隔:date_add()

select date_add(CURRENT_DATE(),interval '要增加的天数' day) as Fdate

7MySQL 为日期减去一个时间间隔:date_sub()

select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

8MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

9MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)

例:select makedate(2001,31); -- '2001-01-31'

select makedate(2001,32); -- '2001-02-01'

10本周时间(起始)

select date_sub(CURRENT_DATE(),interval dayofweek(curdate())-2 day) as Fdate

11本周时间(结束)

select date_add(CURRENT_DATE(),interval dayofweek(curdate())+3 day) as Fdate

12上周时间(起始)

select date_sub(CURRENT_DATE(),interval dayofweek(curdate())+5 day) as Fdate

13上周时间(结束)

select date_sub(CURRENT_DATE(),interval dayofweek(curdate())-1 day) as Fdate

14本月时间(起始)

select DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY) as Fdate

15本月时间(结束)

Select date_add(current_date(),interval day(last_day(CURDATE())) -day(CURDATE()) day) as Fdate

16上月时间(起始)

select DATE_SUB(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE()) DAY),interval day(last_day(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE()) DAY)))-1 day) as Fdate

17上月时间(结束)

select DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE()) DAY) as Fdate

18今年时间(起始)

select makedate(year(curdate()),1) as FDate

19今年时间(结束)

select DATE_SUB(makedate(year(curdate())+1,1) ,INTERVAL 1 day) as Fdate

20去年时间(起始)

select makedate(year(curdate())-1,1) as Fdate

21去年时间(结束)

select DATE_SUB(makedate(year(curdate()),1) ,INTERVAL 1 day) as FDate

22DATE_FORMAT(date,format):根据format字符串格式化date值。下列修饰符可以被用在format字符串中

%M 月名字(January......December)

%W 星期名字(Sunday......Saturday)

%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)

%Y 年, 数字, 4 位

%y 年, 数字, 2 位

%a 缩写的星期名字(Sun......Sat)

%d 月份中的天数, 数字(00......31)

%e 月份中的天数, 数字(0......31)

%m 月, 数字(01......12)

%c 月, 数字(1......12)

%b 缩写的月份名字(Jan......Dec)

%j 一年中的天数(001......366)

%H 小时(00......23)

%k 小时(0......23)

%h 小时(01......12)

%I 小时(01......12)

%l 小时(1......12)

%i 分钟, 数字(00......59)

%r 时间,12 小时(hh:mm:ss [AP]M)

%T 时间,24 小时(hh:mm:ss)

%S 秒(00......59)

%s 秒(00......59)

%p AM或PM

%w 一个星期中的天数(0=Sunday ......6=Saturday )

%U 星期(0......52), 这里星期天是星期的第一天

%u 星期(0......52), 这里星期一是星期的第一天

%% 一个文字"%"。

例:所有的其他字符不做解释被复制到结果中。

mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');

->'Saturday October 1997'

mysql>select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');

-> '22:23:00'

mysql>select DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j');

->'4th 97 Sat 04 10 Oct 277'

mysql>select DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w');

->'22 22 10 10:23:00 PM 22:23:00 00 6'

(12)MySql存储过程中没有return函数,在MySql中可以用循环和out参数代替

If EXISTS(SELECT * FROM T_Chance WHERE FCustID=CostomerID) return 0

改写为:

(在参数中定义一个out变量:out temp varchar(100);)

BEGIN

Loop1:loop

SELECT count(*) FROM T_Chance WHERE FCustID=CostomerID int @cnt

If @cnt>0 then

begin

set temp=0;

leave loop1;

end;

end if

end loop loop1;

(13) select @a=count(*) from VW_Action 在mySql中修改为:select count(*) from VW_Action into @a;

(14)MySQL中没有top关键字,需要用limit代替且放在后面

注意,在MySQL中的limit不能放在子查询内,limit不同与SQLServer,它可以规定范围 limit a,b------范围a-b

SQL SERVER : select top 8 * from table1

MYSQL: select * from table1 limit 5;

(15)即使存储过程没有参数也要写括号"()"

(16) 当一个存储过程中有创建临时表时

create procedure up_test

()

begin

drop table if exists tb1;

create TEMPORARY table tb1//注意添加TEMPORARY table

(

id int,

name varchar(20)

);//注意最后加分号

insert tb1 values('1','jim');

select * from tb1;

end

(17)建表中自增长问题:

create table user

(

Id varchar(10) primary key auto_increment not null,

Name varchar(20) not null,

Password varchar(20),

create_date datetime

);

auto_increment 自增长

(18) "Unable to convert MySQL date/time value to System.DateTime"这是因为在日期列中有"0000-00-00"数据值,要修正这个问题,你可以把这些数据设为null,或者在连接字符串中设置"Allow Zero Datetime=True" 。

(19) MySQL视图的FROM子句不允许存在子查询,因此对于SQL Server中FROM子句带有子查询的视图,需要手工进行迁移。可通过消除FROM子句中的子查询,或将FROM子句中的子查询重构为一个新的视图来进行迁移。

相关推荐
Kapaseker5 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴5 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭15 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab16 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe21 小时前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少1 天前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker1 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋1 天前
Android 协程时代,Handler 应该退休了吗?
android
火柴就是我2 天前
让我们实现一个更好看的内部阴影按钮
android·flutter