前言
之前一直没有接触数据库的学习,只是本科时候修了一本数据库基本知识的课。当时只对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

