程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL中游標使用以及讀取文本數據,mysql游標讀取文本

MySQL中游標使用以及讀取文本數據,mysql游標讀取文本

編輯:MySQL綜合教程

MySQL中游標使用以及讀取文本數據,mysql游標讀取文本


前言

之前一直沒有接觸數據庫的學習,只是本科時候修了一本數據庫基本知識的課。當時只對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

聯系方式:[email protected]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved