- 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() 用不同的格式顯示日期/時間 - 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 ; - 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
- 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;
- 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子句中的子查詢重構為一個新的視圖來進行遷移。 - MySql的out對應SQLServer的output,且mysql 的out要放在變量的前面,SQLServer的output放在變量后面:
- MySQL視圖的FROM子句不允許存在子查詢,因此對於SQL Server中FROM子句帶有子查詢的視圖,需要手工進行遷移。可通過消除FROM子句中的子查詢,或將FROM子句中的子查詢重構為一個新的視圖來進行遷移。
- 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’,…,…)
- 函數和數據類型的區別
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 - 格式: 唯一的數字
- 日期類型 (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);
-
刪除重復數據
如果你想刪除數據表中的重復數據,你可以使用以下的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;
- 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;
- 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
- 備份的不同
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