MySQL 常用SQL語句(二)

mysql 數據導入導出 快速

-- 導出到指定文件
select * into outfile 'd:/temp/t_user.txt' from t_user;

-- 從指定文件導入數據
load data infile 'd:/temp/t_user.txt' into table t_user;
load data infile 'D:/temp/t_user.txt' into table t_status CHARACTER SET utf8;//中文亂碼處理


load data infile 'd:/temp/t_user.txt' replace into table t_user;

-- 導入到指定列
load data infile 'd:/temp/t_user.txt'
into table t_user 
FIELDS TERMINATED BY '	'
LINES TERMINATED BY '\n'
(id,mid,province,city);

-- 更多用法請參考  http://www.cnblogs.com/mybi/archive/2012/10/05/2711990.html 


LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY '\t']
        [OPTIONALLY] ENCLOSED BY '']
        [ESCAPED BY '\\' ]]
    [LINES TERMINATED BY '\n']
    [IGNORE number LINES]
    [(col_name,...)]

內容替換 replace

update t_user set url = replace(url,"localhost","127.0.0.1") where id=1

緩存查看與設置

show variables like '%query_cache%';	-- 查看cache的設置
show status like '%Qcache%';	-- 性能監控

FLUSH QUERY CACHE; -- 清理查詢緩存碎片以提高內存使用性能。該語句不從緩存中移出任何查詢。
RESET QUERY CACHE; -- 從查詢緩存中移出所有查詢。FLUSH TABLES語句也執行同樣的工作。

給用戶賦值所有權限 grant

grant all on mytable.* to user@'10.111.1.%' identified by 'user';
flush PRIVILEGES;

存在該記錄則更新,不存在則插入 DUPLICATE

insert t_user (name,age) values ('fdasf23',2) ON DUPLICATE KEY UPDATE age=age+3

若存在唯一索引衝突時,則修改 age 字段;若不存在則新增;

帶分頁的存儲過程 存儲過程實例


DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`test_proc`$$

CREATE PROCEDURE `test`.`test_proc` (IN i_name VARCHAR(100),IN i_pageIndex INT, IN i_pageSize INT)
BEGIN

/*
call test_proc('a',1, 3)  -- 調用示例
*/
declare stmt varchar(2000);

DROP TABLE IF EXISTS temp_tb1;
create temporary table temp_tb1(
	id int(11) NOT NULL AUTO_INCREMENT,
	myname varchar(50),
	PRIMARY KEY (`id`)
);


insert into temp_tb1(myname)values('aa'),('abb'),('acc'),('add'),('aee');

set @sql = concat('select * from temp_tb1 where myname like ''%',i_name,'%'' limit ',(i_pageIndex-1) * i_pageSize,',',i_pageSize); -- 注意like後兩個單引號表示一個。
prepare stmt from @sql;  
execute stmt;  


END$$

DELIMITER ;


mysql 遊標 - 存儲過程

BEGIN
	declare i int;
	-- order by 'carrier'
	-- cursor 變量
	DECLARE done boolean DEFAULT 0;
	declare loadportname varchar(150);
	DECLARE loadportnames CURSOR FOR
		select t.carrier from t_abhk t where t.week_index>=week_start and t.week_index<=week_end and t.year_index=year_index 
		 and ((port_name='all' and (destPortName='EUROPE' or destPortName='MEDITERRANEAN AND BLACK SEA')) or destPortName=port_name)
			and jobType in (SELECT jobtype_name from jobtype where jobtype_id in (select jobtype_id from jobtype_group_list where jobtype_group_id=strjobtype_id)) 
			group by t.carrier;
		declare CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;


	DROP TABLE IF EXISTS tem_table1;
	CREATE TEMPORARY TABLE tem_table1(
		week_index int,
		title_value varchar(255),
		total decimal(18,2)
	);


	DROP TABLE IF EXISTS tem_table2;
	CREATE TEMPORARY TABLE tem_table2(
		week_index int,
		title_value varchar(255),
		total decimal(18,2)
	);
			-- CURSOR
			open loadportnames;
			REPEAT
					FETCH loadportnames into loadportname;
					if done<>1 THEN
						set i = week_start;
						while i <= week_end 
							do
								insert into tem_table1(week_index,title_value,total)values(i,loadportname,0.00);
								set i = i+1;
						end while;
					end if;
			UNTIL done END REPEAT;
			close loadportnames;
	

	insert into tem_table2(week_index,title_value,total)
		select t.week_index,t.carrier,sum(noOf20_cy + noOf40_cy*2 + noOf40Hq_cy*2 + noOf45_cy*2.5 + (totalConsolCbm + totalLclCbm)/56*2) from t_abhk t 
		 where t.week_index>=week_start and t.week_index<=week_end and t.year_index=year_index 
			and ((port_name='all' and (destPortName='EUROPE' or destPortName='MEDITERRANEAN AND BLACK SEA')) or destPortName=port_name)
			and jobType in (SELECT jobtype_name from jobtype where jobtype_id in (select jobtype_id from jobtype_group_list where jobtype_group_id=strjobtype_id)) 
			group by t.week_index,t.carrier;

	
	-- update tem_table1's total
	update tem_table1 tb1 INNER JOIN tem_table2 tb2 set tb1.total = tb2.total where tb1.week_index = tb2.week_index and tb1.title_value = tb2.title_value;

	select * from tem_table1 order by title_value;

	DROP TABLE IF EXISTS tem_table1;
	DROP TABLE IF EXISTS tem_table2;

END

時間函數

MySQL日期時間函數大全 
DAYOFWEEK(date) 
 返回日期date是星期幾(1=星期天,2=星期一,……7=星期六,ODBC標準)
mysql> select DAYOFWEEK('1998-02-03'); 
  -> 3 
WEEKDAY(date) 
 返回日期date是星期幾(0=星期一,1=星期二,……6= 星期天)。 
mysql> select WEEKDAY('1997-10-04 22:23:00'); 
  -> 5 
mysql> select WEEKDAY('1997-11-05'); 
  -> 2 
DAYOFMONTH(date) 
 返回date是一月中的第幾日(在1到31範圍內) 
mysql> select DAYOFMONTH('1998-02-03'); 
  -> 3 
DAYOFYEAR(date) 
 返回date是一年中的第幾日(在1到366範圍內) 
mysql> select DAYOFYEAR('1998-02-03'); 
  -> 34 
MONTH(date) 
 返回date中的月份數值 
mysql> select MONTH('1998-02-03'); 
  -> 2 
DAYNAME(date) 
 返回date是星期幾(按英文名返回)
mysql> select DAYNAME("1998-02-05"); 
  -> 'Thursday' 
MONTHNAME(date) 
 返回date是幾月(按英文名返回)
mysql> select MONTHNAME("1998-02-05"); 
  -> 'February' 
QUARTER(date) 
 返回date是一年的第幾個季度 
mysql> select QUARTER('98-04-01'); 
  -> 2 
WEEK(date,first)
 返回date是一年的第幾周(first默認值0,first取值1表示週一是周的開始,0從週日開始)
mysql> select WEEK('1998-02-20'); 
  -> 7 
mysql> select WEEK('1998-02-20',0); 
  -> 7 
mysql> select WEEK('1998-02-20',1); 
  -> 8 
YEAR(date) 
 返回date的年份(範圍在1000到9999) 
mysql> select YEAR('98-02-03'); 
  -> 1998 
HOUR(time) 
 返回time的小時數(範圍是0到23)
mysql> select HOUR('10:05:03'); 
  -> 10 
MINUTE(time) 
 返回time的分鐘數(範圍是0到59) 
mysql> select MINUTE('98-02-03 10:05:03'); 
  -> 5 
SECOND(time) 
 返回time的秒數(範圍是0到59)
mysql> select SECOND('10:05:03'); 
  -> 3 
PERIOD_ADD(P,N) 
 增加N個月到時期P並返回(P的格式YYMM或YYYYMM) 
mysql> select PERIOD_ADD(9801,2); 
  -> 199803 
PERIOD_DIFF(P1,P2) 
 返回在時期P1和P2之間月數(P1和P2的格式YYMM或YYYYMM)
mysql> select PERIOD_DIFF(9802,199703); 
  -> 11 
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type) 
ADDDATE(date,INTERVAL expr type) 
SUBDATE(date,INTERVAL expr type)
 對日期時間進行加減法運算
 (ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同義詞,也可以用運算符 和-而不是函數
 date是一個DATETIME或DATE值,expr對date進行加減法的一個表達式字符串type指明表達式expr應該如何被解釋
 [type值 含義 期望的expr格式]:
 SECOND 秒 SECONDS 
 MINUTE 分鐘 MINUTES 
 HOUR 時間 HOURS 
 DAY 天 DAYS 
 MONTH 月 MONTHS 
 YEAR 年 YEARS 
 MINUTE_SECOND 分鐘和秒 "MINUTES:SECONDS" 
 HOUR_MINUTE 小時和分鐘 "HOURS:MINUTES" 
 DAY_HOUR 天和小時 "DAYS HOURS" 
 YEAR_MONTH 年和月 "YEARS-MONTHS" 
 HOUR_SECOND 小時, 分鐘, "HOURS:MINUTES:SECONDS" 
 DAY_MINUTE 天, 小時, 分鐘 "DAYS HOURS:MINUTES" 
 DAY_SECOND 天, 小時, 分鐘, 秒 "DAYS HOURS:MINUTES:SECONDS"
 expr中允許任何標點做分隔符,如果所有是DATE值時結果是一個DATE值,否則結果是一個DATETIME值)
 如果type關鍵詞不完整,則MySQL從右端取值,DAY_SECOND因爲缺少小時分鐘等於MINUTE_SECOND)
 如果增加MONTH、YEAR_MONTH或YEAR,天數大於結果月份的最大天數則使用最大天數) 
mysql> SELECT "1997-12-31 23:59:59" INTERVAL 1 SECOND; 
  -> 1998-01-01 00:00:00 
mysql> SELECT INTERVAL 1 DAY "1997-12-31"; 
  -> 1998-01-01 
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND; 
  -> 1997-12-31 23:59:59 
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 SECOND); 
  -> 1998-01-01 00:00:00 
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 DAY); 
  -> 1998-01-01 23:59:59 
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL "1:1" MINUTE_SECOND); 
  -> 1998-01-01 00:01:00 
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",INTERVAL "1 1:1:1" DAY_SECOND); 
  -> 1997-12-30 22:58:59 
mysql> SELECT DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR);
  -> 1997-12-30 14:00:00 
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY); 
  -> 1997-12-02 
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02"); 
  -> 1999 
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03"); 
  -> 199907 
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03"); 
  -> 20102 
TO_DAYS(date) 
 返回日期date是西元0年至今多少天(不計算1582年以前)
mysql> select TO_DAYS(950501); 
  -> 728779 
mysql> select TO_DAYS('1997-10-07'); 
  -> 729669 
FROM_DAYS(N) 
 給出西元0年至今多少天返回DATE值(不計算1582年以前)
mysql> select FROM_DAYS(729669); 
  -> '1997-10-07' 
DATE_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' 
TIME_FORMAT(time,format)
 和DATE_FORMAT()類似,但TIME_FORMAT只處理小時、分鐘和秒(其餘符號產生一個NULL值或0)
CURDATE() 
CURRENT_DATE()
 以'YYYY-MM-DD'或YYYYMMDD格式返回當前日期值(根據返回值所處上下文是字符串或數字) 
mysql> select CURDATE(); 
  -> '1997-12-15' 
mysql> select CURDATE() 0; 
  -> 19971215 
CURTIME() 
CURRENT_TIME()
 以'HH:MM:SS'或HHMMSS格式返回當前時間值(根據返回值所處上下文是字符串或數字) 
mysql> select CURTIME(); 
  -> '23:50:26' 
mysql> select CURTIME() 0; 
  -> 235026 
NOW() 
SYSDATE() 
CURRENT_TIMESTAMP()
 以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回當前日期時間(根據返回值所處上下文是字符串或數字) 
mysql> select NOW(); 
  -> '1997-12-15 23:50:26' 
mysql> select NOW() 0; 
  -> 19971215235026 
UNIX_TIMESTAMP() 
UNIX_TIMESTAMP(date) 
 返回一個Unix時間戳(從'1970-01-01 00:00:00'GMT開始的秒數,date默認值爲當前時間)
mysql> select UNIX_TIMESTAMP(); 
  -> 882226357 
mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00'); 
  -> 875996580 
FROM_UNIXTIME(unix_timestamp) 
 以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回時間戳的值(根據返回值所處上下文是字符串或數字) 
mysql> select FROM_UNIXTIME(875996580); 
  -> '1997-10-04 22:23:00' 
mysql> select FROM_UNIXTIME(875996580) 0; 
  -> 19971004222300 
FROM_UNIXTIME(unix_timestamp,format) 
 以format字符串格式返回時間戳的值
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y %D %M %h:%i:%s %x'); 
  -> '1997 23rd December 03:43:30 x' 
SEC_TO_TIME(seconds) 
 以'HH:MM:SS'或HHMMSS格式返回秒數轉成的TIME值(根據返回值所處上下文是字符串或數字) 
mysql> select SEC_TO_TIME(2378); 
  -> '00:39:38' 
mysql> select SEC_TO_TIME(2378) 0; 
  -> 3938 
TIME_TO_SEC(time) 
 返回time值有多少秒 
mysql> select TIME_TO_SEC('22:23:00'); 
  -> 80580 
mysql> select TIME_TO_SEC('00:39:38'); 
  -> 2378

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章