mysql與sqlserver之間的關系轉換


 

  1. sqlserver中的數據類型與mysql之間的對應
    --sqlserver
    select * into xx from xx where 1=0  只復制表結構
    select * into xx from xx where 1=1   復制表結構和表數據
    
    --mysql
    create table xx like xx;  只復制表結構
    create table xx as select * from xx; 復制表結構和表數據

    mysql復制表結構/數據的時候,並不會復制主鍵,索引,自增列等任何屬性,僅僅是簡單拷數據,而sqlserver會拷貝自增列

     

    sqlserver mysql類型
    bit布爾型(true/false) boolean轉換后變成tinyint(1/0)
    smalldatetime timestamp長度設為空
     varchar(max)  text
     nvarchar(max)  ntext
     varbinary(max)  image
    DATEDIFF(datepart,startdate,enddate)函數
    timestampdiff(unit,datetime_expr1,datetime_expr2)函數
    datediff(date1,date2):兩個日期相減 date1 - date2,返回天數。
     CONVERT() 用不同的格式顯示日期/時間  DATE_FORMAT() 用不同的格式顯示日期/時間
  2. mysql存儲過程實例
    例1、一個簡單存儲過程游標實例 
    DELIMITER $$  
    DROP PROCEDURE IF EXISTS getUserInfo $$
     CREATE PROCEDURE getUserInfo(in date_day datetime) -- 實例 -- 存儲過程名為:getUserInfo -- 參數為:date_day -- 日期格式:2008-03-08   
      BEGIN declare _userName varchar(12); -- 用戶名 
    declare _chinese int ; -- 語文 
    declare _math int ;    -- 數學 
    declare done int; -- 定義游標
     DECLARE rs_cursor CURSOR FOR SELECT username,chinese,math from userInfo where datediff(createDate, date_day)=0;
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; -- 獲取昨天的日期
     if date_day is null then  
      set date_day = date_add(now(),interval -1 day);  -- 日期格式
     end if;
     open rs_cursor; 
     cursor_loop:loop   
     FETCH rs_cursor into _userName, _chinese, _math; -- 取數據     
    if done=1 then     leave cursor_loop;    end if;    -- 更新表    update infoSum set total=_chinese+_math where UserName=_userName; end loop cursor_loop; close rs_cursor;    
    END$$ DELIMITER ;
  3. Mysql存儲過程的使用:
    1.定義變量
    
    MySQL中可以使用DECLARE關鍵字來定義變量。
    (MySQL中還可以使用DECLARE關鍵字來定義條件或者-
    MySQL中可以使用DECLARE關鍵字來定義處理程序)
    定義變量的基本語法如下:
    
    DECLARE  var_name[,...]  type  [DEFAULT value] 
    2.為變量賦值
    
    MySQL中可以使用SET關鍵字來為變量賦值。SET語句的基本語法如下:                                        
    
    SET  var_name = expr [, var_name = expr] ...
    
    MySQL中還可以使用SELECT…INTO語句為變量賦值。其基本語法如下:
    
    SELECT  col_name[,…]  INTO  var_name[,…]  
        FROM  table_name  WEHRE  condition
    計算兩個數之和
    create procedure pr_add (a int,b int)
    begin
    declare c int;
    if a is null then
    set a = 0;
    end if;
    if b is null then
    set b = 0;
    end if;
    set c = a + b;
    select c as sum;
    end
  4. mysql變量的定義
    MySQL存儲過程中,定義變量有兩種方式:
    1.使用set或select直接賦值,變量名以 @ 開頭.
    例如:set @var=1;
    可以在一個會話的任何地方聲明,作用域是整個會話,稱為會話變量。
    
    2.以 DECLARE 關鍵字聲明的變量,只能在存儲過程中使用,稱為存儲過程變量,例如:
    DECLARE var1  INT DEFAULT 0;  
    主要用在存儲過程中,或者是給存儲傳參數中。
    
    兩者的區別是:
    在調用存儲過程時,以DECLARE聲明的變量都會被初始化為 NULL。而會話變量(即@開頭的變量)則不會被再初始化,在一個會話內,只須初始化一次,之后在會話內都是對上一次計算的結果,就相當於在是這個會話內的全局變量。
    
    在存儲過程中,使用動態語句,預處理時,動態內容必須賦給一個會話變量。
    例:
    set @v_sql= sqltext;
    PREPARE stmt FROM @v_sql;  
    EXECUTE stmt;     
    DEALLOCATE PREPARE stmt;
  5. mysql存儲過程定義區別sqlserver
    三 語法定義
    3.1 注釋符區別
    SqlServer的注釋符為--和
    MySql的注釋符為--和和#
    
    3.2 識別符的區別
    MS SQL識別符是[],[type]表示他區別於關鍵字,但是MySQL卻是 `,也就是按鍵1左邊的那個符號
    
    3.3存儲過程的區別(未經驗證,從網上找的)
    mysql的存儲過程中變量的定義去掉@;
    
    SQLServer存儲過程的AS在MySql中需要用begin .....end替換
    
    Mysql的Execute對應SqlServer的exec;
    
        (注意:必須想下面這樣調用)
        Set @cnt=’select * from 表名’;
        Prepare str from @cnt;
        Execute str;
    
    MySql存儲過程調用其他存儲過程用call
    
    Call 函數名(即SQLServer的存儲過程名)(’參數1’,’參數2’,……)
    
    select @a=count(*) from VW_Action 在mySql中修改為:select count(*) from VW_Action into @a;

    MySQL視圖的FROM子句不允許存在子查詢,因此對於SQL Server中FROM子句帶有子查詢的視圖,需要手工進行遷移。可通過消除FROM子句中的子查詢,或將FROM子句中的子查詢重構為一個新的視圖來進行遷移。
  6. MySql的out對應SQLServer的output,且mysql 的out要放在變量的前面,SQLServer的output放在變量后面:
  7. MySQL視圖的FROM子句不允許存在子查詢,因此對於SQL Server中FROM子句帶有子查詢的視圖,需要手工進行遷移。可通過消除FROM子句中的子查詢,或將FROM子句中的子查詢重構為一個新的視圖來進行遷移。
  8. MySql out,in,inout的區別——
    MySQL 存儲過程 “in” 參數:跟 C 語言的函數參數的值傳遞類似, MySQL 存儲過程內部可能會修改此參數,但對 in 類型參數的修改,對調用者(caller)來說是不可見的(not visible)。
    MySQL 存儲過程 “out” 參數:從存儲過程內部傳值給調用者。在存儲過程內部,該參數初始值為 null,無論調用者是否給存儲過程參數設置值。
    MySQL 存儲過程 inout 參數跟 out 類似,都可以從存儲過程內部傳值給調用者。不同的是:調用者還可以通過 inout 參數傳遞值給存儲過程。

    3.4字符串連接

    SQLServer: Temp=’select * from ’+’tablename’+…+…
    
        MySql:Temp=concat(’select * from’, ’tablecname’,…,…)
  9.  函數和數據類型的區別
    Date 函數
    MySQL Date 函數
    NOW() 返回當前的日期和時間
    CURDATE() 返回當前的日期
    CURTIME() 返回當前的時間
    DATE() 提取日期或日期/時間表達式的日期部分
    EXTRACT() 返回日期/時間按的單獨部分
    DATE_ADD() 給日期添加指定的時間間隔
    DATE_SUB() 從日期減去指定的時間間隔
    DATEDIFF() 返回兩個日期之間的天數
    DATE_FORMAT() 用不同的格式顯示日期/時間
    
    SQL Server Date 函數
    GETDATE() 返回當前日期和時間
    DATEPART() 返回日期/時間的單獨部分
    DATEADD() 在日期中添加或減去指定的時間間隔
    DATEDIFF() 返回兩個日期之間的時間
    CONVERT() 用不同的格式顯示日期/時間
    
    SQL Date 數據類型
    MySQL 使用下列數據類型在數據庫中存儲日期或日期/時間值:
    DATE - 格式 YYYY-MM-DD
    DATETIME - 格式: YYYY-MM-DD HH:MM:SS
    TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
    YEAR - 格式 YYYY 或 YY
    
    SQL Server 使用下列數據類型在數據庫中存儲日期或日期/時間值:
    DATE - 格式 YYYY-MM-DD
    DATETIME - 格式: YYYY-MM-DD HH:MM:SS
    SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
    TIMESTAMP - 格式: 唯一的數字
  10. 日期類型 (201611)上個月和下個月的表達
    1.1上一個月的表達方式
    _lastmomth=YEAR(DATE_SUB(CAST(CAST(_Curr_OrderDate*100+10 AS CHAR) AS DATETIME),INTERVAL 1 MONTH))*100 + MONTH(DATE_SUB(CAST(CAST( _Curr_OrderDate*100+10 AS CHAR) AS DATETIME),INTERVAL 1 MONTH)); 1.2下一個月的表達方式 _nextMonth=YEAR(DATE_ADD(CAST(CAST(_Curr_OrderDate*100+10 AS CHAR) AS DATETIME),INTERVAL 1 MONTH))*100 + MONTH(DATE_ADD(CAST(CAST( _Curr_OrderDate*100+10 AS CHAR) AS DATETIME),INTERVAL 1 MONTH)); 或者: SELECT EXTRACT(YEAR_MONTH FROM DATE_ADD(OperationTime,INTERVAL 1 MONTH)) FROM b_log WHERE id=1 --變量:_Curr_OrderDate格式:201607--
    對比sqlserver表達方式如下:
     select  @lastmomth=year(DATEADD(m,-1,convert(datetime, cast( @Curr_OrderDate*100+10 as char), 112)))*100 + month(DATEADD(m,-1,convert(datetime, cast( @Curr_OrderDate*100+10 as char), 112)))
     
    select  @nextMonth=year(DATEADD(m,1,convert(datetime, cast( @Curr_OrderDate*100+10 as char), 112)))*100 + month(DATEADD(m,1,convert(datetime, cast( @Curr_OrderDate*100+10 as char), 112)))

    取出返回日期單獨的部分
    SELECT DATEPART(yyyy,OrderDate) AS OrderYear,
    DATEPART(mm,OrderDate) AS OrderMonth,
    DATEPART(dd,OrderDate) AS OrderDay
    FROM Orders
    WHERE OrderId=1
     

    如果日期格式為2016-06-07表示下個月,可以使用SELECT DATE_ADD('2016-07-06',INTERVAL 1 MONTH);

  11. 刪除重復數據

    如果你想刪除數據表中的重復數據,你可以使用以下的SQL語句:
    
    mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
        ->                  FROM person_tbl;
        ->                  GROUP BY (last_name, first_name);
    mysql> DROP TABLE person_tbl;
    mysql> ALTER TABLE tmp RENAME TO person_tbl;

     

  12. mysql語句的導入導出
    1.1
    使用 SELECT ... INTO OUTFILE 語句導出數據
    在下面的例子中,生成一個文件,各值用逗號隔開。這種格式可以被許多程序使用。
    
    SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    FROM test_table;
    1.2
    使用 LOAD DATA 導入數據
    以下實例中將從當前目錄中讀取文件 dump.txt ,將該文件中的數據插入到當前數據庫的 mytbl 表中。
    
    mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;

     

  13. mysql查詢今天、昨天、7天、近30天、本月、上一月 數據
    今天
    
    select * from 表名 where to_days(時間字段名) = to_days(now());
    
    昨天
    
    SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 時間字段名) <= 1
    
    7天
    
    SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(時間字段名)
    
    近30天
    
    SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(時間字段名)
    
    本月
    
    SELECT * FROM 表名 WHERE DATE_FORMAT( 時間字段名, '%Y%m' ) 
    
       = DATE_FORMAT( CURDATE( ) , '%Y%m' )
    
    上一月
    
    SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , 
    
       date_format( 時間字段名, '%Y%m' ) ) =1
    
    
    
    #查詢本季度數據
    select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(now());
    
    
    #查詢上季度數據
    select * from `ht_invoice_information` where QUARTER(create_date)
    
      =QUARTER(DATE_SUB(now(),interval 1 QUARTER));
    
    
    #查詢本年數據
    select * from `ht_invoice_information` where YEAR(create_date)=YEAR(NOW());
    
    
    #查詢上年數據
    select * from `ht_invoice_information` where year(create_date)=year(date_sub(now(),interval 1 year));
    
    
    
    查詢當前這周的數據 
    SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d'))
    
       = YEARWEEK(now());
    
    查詢上周的數據
    SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) 
    
      = YEARWEEK(now())-1;
    
    查詢當前月份的數據
    select name,submittime from enterprise   where date_format(submittime,'%Y-%m')
    
      =date_format(now(),'%Y-%m')
    
    查詢距離當前現在6個月的數據
    select name,submittime from enterprise where submittime between date_sub(now(),interval 6 month) and now();
    
    查詢上個月的數據
    select name,submittime from enterprise   where date_format(submittime,'%Y-%m')
    
       =date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m')
    
    
    
    select * from ` user ` where DATE_FORMAT(pudate, ' %Y%m ' ) 
    
      = DATE_FORMAT(CURDATE(), ' %Y%m ' ) ;
    
    
    
    select * from user where WEEKOFYEAR(FROM_UNIXTIME(pudate,'%y-%m-%d')) 
    
       = WEEKOFYEAR(now())
    
    
    
    select * from user where MONTH (FROM_UNIXTIME(pudate, ' %y-%m-%d ' ))
    
       = MONTH (now())
    
    
    
    select * from [ user ] where YEAR (FROM_UNIXTIME(pudate, ' %y-%m-%d ' )) 
    
      = YEAR (now()) and MONTH (FROM_UNIXTIME(pudate, ' %y-%m-%d ' )) = MONTH (now())
    
    
    
    select * from [ user ] where pudate between 上月最后一天 
    
      and 下月第一天 where   date(regdate)   =   curdate();
    
    select   *   from   test   where   year(regdate)=year(now())   and   month(regdate)=month(now())   
    
       and  day(regdate)=day(now())
    
    
    
    SELECT date( c_instime ) ,curdate( ) FROM `t_score` WHERE 1 LIMIT 0 , 30

     

  14. 備份的不同
    1.0 SQLSERVER邏輯備份:
    
    BACKUP DATABASE test TO DISK='c:\test.bak' 
    BACKUP LOG test  TO DISK='c:\test_log.bak' 
    
    --第一個SQL是完整備份test庫,如果加上WITH DIFFERENTIAL就是差異備份
    --第二個SQL是備份test庫的日志
    
    2.0 生成腳本的數據庫
    
    要選擇架構和數據,並且要選擇索引,這樣就會生成表的數據、定義、索引

    還原

    用mysql命令將school_2014-7-10.sql文件中的備份導入到數據庫中
    
    mysql -u root -h 127.0.0.1 -p school<c:\school_2014-7-10.sql


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM