SQL Server 和 MySql 語法和關鍵字的區別

工程師WWW發表於2013-12-12

(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’,…,…)

 

(6)    mysql的uuid()對應sql的GUID();

 

(7)    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子句中的子查詢重構為一個新的檢視來進行遷移。

相關文章