原文: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

联系方式:chuanting.zhang@gmail.com

MySQL中游标使用以及读取文本数据的更多相关文章

  1. Delphi中使用python脚本读取Excel数据

    Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  2. 实现读取文本数据,在将数据导入mysql

    import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java ...

  3. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  4. 浅谈mysql中不同事务隔离级别下数据的显示效果

    事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...

  5. MySql中游标使用总是多循环一次的解决方法

    CREATE DEFINER = 'root'@'%' PROCEDURE deyestest.procedure2() BEGIN DECLARE v_id INT; DECLARE v_userN ...

  6. MySQL中order by排序时,数据存在null咋办

    order by排序是最常用的功能,但是排序有时会遇到数据为空null的情况,这样排序就会乱了,这里以MySQL为例,记录我遇到的问题和解决思路. 问题: 网页要实现table的行鼠标拖拽排序,我用A ...

  7. 用命令从mysql中导出/导入表结构及数据

    在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看:mysqldump最常用的:mysqldump -uroot -pmysql databasefoo t ...

  8. QT中读取文本数据(txt)

    下面的代码实现读取txt文档中的数据,并且是一行一行的读取. void MainWindow::on_pushButton_clicked() { QFile file("abcd.txt& ...

  9. 合理使用mysql中的load data infile导入数据

    基本语法: load data  [low_priority] [local] infile 'file_name txt' [replace | ignore]into table tbl_name ...

随机推荐

  1. 集群部署及测试SolrCloud-5

    SolrCloud-5.2.1 集群部署及测试   一. 说明 Solr5内置了Jetty服务,所以不用安装部署到Tomcat了,网上部署Tomcat的资料太泛滥了. 部署前的准备工作: 1. 将各主 ...

  2. 解决编译时出错提示: 'error: array must be initialized with a brace-enclosed initializer' 的错误

    编译出现这个错误的原因非常简单编译的标准不相同.如果用stdc90,这个就可以直接编译通过了. 下面是代码例子: ...... ] = NULL;或者 :char cmd[256] = '\0'; . ...

  3. 人人API 分享到人人功能 修改版

    最近在搞一个日程管理网站, 需要实现分享到人人功能, 所以找了一下人人API, 然后根据自己需要修改了一下. 首先得有一个人人给的js文件, 如下: var Renren = Renren || {} ...

  4. android存储阵列数据SharedPreferences

    假设要数组数据(如boolean[] .int[]等)到SharedPreferences时,我们能够先将数组数据组织成json数据存储到SharedPreferences,读取时则对json数据进行 ...

  5. Linux 常用命令解析和Bash Shell使用示例脚本演示

     摘要 Linux命令是基于文本格式输入输出的一种程序,依照Unix哲学中强调的程序功能简单,输入宽松,输出严谨,各种程序组合能够具有更强大的功能,而具有这样的灵活性的主要原因是Linux规定程序 ...

  6. poj 3074 Sudoku(Dancing Links)

    Sudoku Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8152   Accepted: 2862 Descriptio ...

  7. spring 配置属性的详细信息

    摘要(这篇文章讲的红,蓝说这话节) 字面值 字面值:可用字符串表示的值,能够通过<value>元素标签或value属性进行注入 基本数据类型及其封装类.String等类型都能够採取字面值注 ...

  8. 【C语言探索之旅】 第二部分第四课:字符串

    内容简介 1.课程大纲 2.第二部分第四课: 字符串 3.第二部分第五课预告: 预处理 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...

  9. 开源Math.NET基础数学类库使用(07)一些常用的数学物理常数

    原文:[原创]开源Math.NET基础数学类库使用(07)一些常用的数学物理常数               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/ ...

  10. css两种动态显示星星等级的比较(一星、两星、三星、四星、五星)

    原文:css两种动态显示星星等级的比较(一星.两星.三星.四星.五星) 以下是显示后的图片,相信在很多网站上都能看到这种效果,目前我知道两种实现方式 1.background-position加上一张 ...