前言
之前一直沒有接觸資料庫的學習,只是本科時候修了一本資料庫基本知識的課。當時只對C++感興趣,天真的認為其它的課都沒有用,資料庫也是半懂不懂,胡亂就考試過了。現在學習大資料分析,接觸了資料探勘,才感覺到資料庫是不可跨越的坎。直到現在才感覺到《作業系統》、《編譯原理》、《計算機組成原理》等等課程的重要性。在浩瀚的知識面前,個人是非常渺小的。掌握了一種思想之後,任何事情都不困難,困難的是你是否真的靜下心看一看幫助文件、認真的Google。靜心、靜氣、認真、執著。
遊標-cursor
學習了幾天MySQL,談一談自己對遊標的認識。
遊標就類似於C++中的指標,用於指向查詢結果。比如你查詢後的的資料格式如下:
+------------+----------------------+------+------+------+-------------+----------+----------+------+---------+ | station_id | get_time | PM25 | PM10 | NO2 | temperature | pressure | humidity | wind | weather | +------------+----------------------+------+------+------+-------------+----------+----------+------+---------+ | 001001 | 2/8/2013 9:00:00 PM | 149 | 59 | 16 | -5 | 1031 | 46 | 4 | 1 | | 001001 | 2/8/2013 10:00:00 PM | 159 | 65 | 22 | -5 | 1030 | 46 | 1 | 1 | | 001001 | 2/9/2013 12:00:00 AM | 179 | 73 | 28 | -6 | 1029 | 46 | 4 | 1 | | 001001 | 2/9/2013 2:00:00 AM | 194 | 73 | 29 | -7 | 1028 | 49 | 3 | 1 | | 001001 | 2/9/2013 3:00:00 AM | 191 | 73 | 27 | -7 | 1028 | 50 | 2 | 1 | | 001001 | 2/9/2013 4:00:00 AM | 194 | 73 | 25 | -7 | 1026 | 53 | 2 | 1 | | 001001 | 2/9/2013 5:00:00 AM | 193 | 73 | 23 | -7 | 1026 | 54 | 2 | 1 | | 001001 | 2/9/2013 6:00:00 AM | 192 | 73 | 21 | -8 | 1026 | 52 | 2 | 1 | | 001001 | 2/9/2013 7:00:00 AM | 192 | 73 | 23 | -8 | 1025 | 54 | 3 | 1 | | 001001 | 2/9/2013 8:00:00 AM | 190 | 73 | 20 | -8 | 1025 | 55 | 3 | 1 | +------------+----------------------+------+------+------+-------------+----------+----------+------+---------+
你如果想逐條處理資料,那麼必須要用到遊標進行迴圈處理。
載入進來的資料是varchar格式,但是對於第二個屬性“get_time”我們需要的格式是“datatime”,需要進行獲取屬性值並進行迴圈處理。
使用遊標的步驟如下:
1.定義遊標 declare 遊標名 cursor for select語句
2.定義處理遊標結束的變數 declare continue handler for not found set 變數名= true;
3.開啟遊標 open 遊標名
4.判斷是否結束,如果不結束,則處理當前遊標指向值;如果結束,則結束迴圈
5.關閉遊標 close 遊標名
注:遊標一般是在儲存過程(procedure)中呼叫,procedure類似於C++中的函式,裡面封裝了SQL語句,想要使用時,直接CALL ‘procedure_name’即可。遊標(cursor)中若有使用的變數必須在宣告cursor前把變數定義完。詳細的程式碼設計如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `strToDate`() begin -- 定義一個臨時變數用於儲存轉換後的時間格式 declare temp datetime; -- 定義字串臨時變數,儲存查詢後的每條內容 declare str varchar(150); -- 是否結束的標識 declare flag int default false; -- 定義遊標 declare getTimeCursor cursor for select get_time from train; -- 定義結束的標識 declare continue handler for not found set flag = true; -- 開啟遊標 open getTimeCursor; -- 開始迴圈處理 read_loop:loop -- 把當前遊標內容放到變數中 fetch getTimeCursor into str; -- 如果結束標識為TRUE,則結束迴圈 if flag then leave read_loop; end if; -- 否則迴圈處理每個屬性,呼叫字串轉換日期函式 set temp = (select str_to_date(str,'%c/%e/%Y %l:%i:%s %p')); -- 把轉換結果儲存到新的表中insert into time_test values(temp); -- 結束迴圈 end loop; -- 關閉遊標 close getTimeCursor; -- 查詢結果 select * from time_test limit 10; end
其中,str_to_date()函式的功能是把string型別的資料轉成date型別。查詢後的結果為:
+---------------------+ | get_time | +---------------------+ | 2013-02-09 16:00:00 | | 2013-02-08 21:00:00 | | 2013-02-08 22:00:00 | | 2013-02-09 00:00:00 | | 2013-02-09 02:00:00 | | 2013-02-09 03:00:00 | | 2013-02-09 04:00:00 | | 2013-02-09 05:00:00 | | 2013-02-09 06:00:00 | | 2013-02-09 07:00:00 | +---------------------+
see,所有字串都轉換成了標準的時間格式。
MySQL load data控制
其實上面的問題完全可以利用另外一種方法完成,那就是在裝載資料的時候進行格式控制。具體SQL程式碼如下:
use train; drop table traindata; create table if not exists traindata( id int auto_increment primary key, station_id varchar(10), get_time datetime, PM25 int, PM10 int, NO2 int, temperature int, pressure int, humidity int, wind double, weather int); load data local infile 'f:\\dataset\\beijing\\crawleddata.txt' into table traindata fields terminated by ',' (station_id, @var_time, PM25, PM10, NO2, temperature, pressure, humidity, wind, weather) set get_time = str_to_date(@var_time, '%c/%e/%Y %l:%i:%s %p'); select * from traindata limit 10;
載入進資料庫後,具體資料格式如下:
+----+------------+---------------------+------+------+------+-------------+----------+----------+------+---------+ | id | station_id | get_time | PM25 | PM10 | NO2 | temperature | pressure | humidity | wind | weather | +----+------------+---------------------+------+------+------+-------------+----------+----------+------+---------+ | 1 | 1001 | 2013-02-08 21:00:00 | 149 | 59 | 16 | -5 | 1031 | 46 | 4 | 1 | | 2 | 1001 | 2013-02-08 22:00:00 | 159 | 65 | 22 | -5 | 1030 | 46 | 1 | 1 | | 3 | 1001 | 2013-02-09 00:00:00 | 179 | 73 | 28 | -6 | 1029 | 46 | 4 | 1 | | 4 | 1001 | 2013-02-09 02:00:00 | 194 | 73 | 29 | -7 | 1028 | 49 | 3 | 1 | | 5 | 1001 | 2013-02-09 03:00:00 | 191 | 73 | 27 | -7 | 1028 | 50 | 2 | 1 | | 6 | 1001 | 2013-02-09 04:00:00 | 194 | 73 | 25 | -7 | 1026 | 53 | 2 | 1 | | 7 | 1001 | 2013-02-09 05:00:00 | 193 | 73 | 23 | -7 | 1026 | 54 | 2 | 1 | | 8 | 1001 | 2013-02-09 06:00:00 | 192 | 73 | 21 | -8 | 1026 | 52 | 2 | 1 | | 9 | 1001 | 2013-02-09 07:00:00 | 192 | 73 | 23 | -8 | 1025 | 54 | 3 | 1 | | 10 | 1001 | 2013-02-09 08:00:00 | 190 | 73 | 20 | -8 | 1025 | 55 | 3 | 1 | +----+------------+---------------------+------+------+------+-------------+----------+----------+------+---------+
see,標準的資料格式。
原創內容,轉載請註明出處。http://www.cnblogs.com/chuantingSDU/p/4243990.html
聯絡方式:chuanting.zhang@gmail.com