MySQL中游标使用以及读取文本数据

前言

以前一直没有接触数据库的学习,只是本科时候修了一本数据库基本知识的课。当时只对C++感兴趣,天真的认为其它的课都没有用,数据库也是半懂不懂,胡乱就考试过了。如今学习大数据分析,接触了数据挖掘,才感受到数据库是不可跨越的坎。直到如今才感受到《操做系统》、《编译原理》、《计算机组成原理》等等课程的重要性。在浩瀚的知识面前,我的是很是眇小的。掌握了一种思想以后,任何事情都不困难,困难的是你是否真的静下心看一看帮助文档、认真的Google。静心、静气、认真、执着。html

游标-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 |
+------------+----------------------+------+------+------+-------------+----------+----------+------+---------+

你若是想逐条处理数据,那么必需要用到游标进行循环处理。oop

加载进来的数据是varchar格式,可是对于第二个属性“get_time”咱们须要的格式是“datatime”,须要进行获取属性值并进行循环处理。学习

使用游标的步骤以下:fetch

1.定义游标 declare 游标名 cursor for select语句大数据

2.定义处理游标结束的变量 declare continue handler for not found  set 变量名= true;spa

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

相关文章
相关标签/搜索