Linux从mysql中读取数据_linux shell中读写操作mysql数据库
本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为xml或html文件, 并分析了核心语句。本文介绍的方法适用于PostgreSQL ,相对mysql而言,shell 中读写PostgreSQL会更简单些。
1. 连接mysql 数据库
shell中连接数据库的方法很简单,只需要指定用户名,密码,连接的数据库名称,然后通过重定向,输入mysql的语句,如下所示:
mysql -u USERNAME -p PASSWORD DATABASENAME </dev/nullshow databases;
EOF
但这并不是一个好办法,任何使用该脚本的用户都能看到该数据库用户的账号和密码,要解决这个问题,可以用mysql 数据库的一个特殊配置文件。mysql 数据库使用$HOME/.my.cnf 文件来读取特殊的启动命令和设置。其中一项设置是由该用户账户发起的mysql 会话的默认密码。要在这个文件中设置默认密码,可以加入下面的内容:
[client]
password= 123456
然后,别忘了修改权限:
chmod 400 .my.cnf
这样就可以通过脚本访问mysql数据库了,如下所示:
#!/bin/bash
MYSQL=`which mysql`
$MYSQL test-u root <
show databases;
show tables;select * from employees where salary > 4000;
EOF
2. 创建数据库
通过上面的方法连接数据库,再通过重定向输入mysql语句,shell中读写mysql基本就介绍完了。只要把sql语句写对了,通过重定向执行即可,下面来看一个实例:
#!/bin/bash
##############################
# @file create_db_mysql.sh
# @brief create database and tablesinmysql
# @author Mingxing LAI
# @version0.1# @date2013-01-20##############################
USER="root"DATABASE="students"TABLE="students"######################
#crate database
mysql-u $USER << EOF 2>/dev/nullCREATE DATABASE $DATABASE
EOF
[ $? -eq 0 ] && echo "created DB" ||echo DB already exists
######################
#create table
mysql-u $USER $DATABASE << EOF 2>/dev/nullCREATE TABLE $TABLE(
idint,
name varchar(100),
markint,
dept varchar(4)
);
EOF
[ $? -eq 0 ] && echo "Created table students" || echo "Table students already exist"######################
#delete data
mysql-u $USER $DATABASE << EOF 2>/dev/nullDELETE FROM $TABLE;
EOF
这个脚本比较简单,就是几条SQL语句,没什么好解释的,下面来看一下,如何读入csv 文件,然后插入到mysql数据库中。
3. 插入csv 文件
上面创建了一个学生表,表中有学生的学号,姓名,成绩,系别,假设有一个csv文件,内容如下:
$cat data1,Navin M,98,CS2,Kavya N,70,CS3,Nawaz O,80,CS4,Hari S,80,EC5,Alex M,50,EC6,Neenu J,70,EC7,Bob A,30,EC8,Anu M,90,AE9,Sruthi,89,AE10,Andrew,89,AE
为了将csv 文件插入到数据库,我们需要逐行读入,然后给字符串加上双引号,最后生成语句如下:
insert into students VALUES(1, "Navin M", 98, "CS");
要解析csv 文件,最好的工具莫过于awk了,将域的分隔符指定为逗号-F,,awk就自动将各个域拆分出来了,然后在需要双引号的地方打印输出一个双引号,就能够轻松得到下面这样的数据:
1, "Navin M", 98, "CS" awk 代码如下:
query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`
statement=`echo "INSERT INTO $TABLE VALUES($query);"`
echo $statement
当然了,你也可以用其他办法,不过,几乎没有比awk更简单的了,第2种方法如下:
oldIFS=$IFS
IFS=,
values=($line)
values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""values[3]="\"`echo ${values[3]}`\""query=`echo ${values[@]} | tr '#' ','`
IFS=$oldIFS
statement=`echo "INSERT INTO $TABLE VALUES($query);"`
echo"$statement"
首先通过指定域分隔符,将csv文件解析成一个数组,然后将空格替换成一个特殊的符号"#"(因为后面的替换中,会一次性输出数组,而数组是用空格分隔各字段,我们要将分隔数组的空格替换成逗号,所以这里将数据中的空格替换成"#") ,给字符串加上双引号,最后再把空格替换成逗号,把"#"替换为空格。这种方法真是让人抓狂,我第一次就没有看明白,尤其是为什么要将空格替换成"#"。
完整的插入数据的程序如下:
#!/bin/bash
#
# @file write_to_db_mysql.sh
# @brief wirte data to databaseinmysql
# @author Mingxing LAI
# @version0.1# @date2013-01-20#
USER="root"DATABASE="students"TABLE="students"
if [ $# -ne 1]; then
echo $0DATAFILE
echo
exit2fi
data=$1
whileread line;do# query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`
oldIFS=$IFS
IFS=,
values=($line)
values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""values[3]="\"`echo ${values[3]}`\""query=`echo ${values[@]} | tr '#' ','`
IFS=$oldIFS
statement=`echo "INSERT INTO $TABLE VALUES($query);"`
# echo $statement
mysql-u $USER $DATABASE <
INSERT INTO $TABLE VALUES($query);
EOF
done
echo"Wrote data into DB"fi
4. 读取数据
知道怎么在shell 中连接mysql ,也知道了怎么在shell中批量执行sql 语句,读取数据,就没有任何难度了。
#!/bin/bash
#
# @file read_db_mysql.sh
# @brief read datafrommysql
# @author Mingxing LAI
# @version0.1# @date2013-01-20#
USER="root"DATABASE="students"TABLE="students"#用tail 去掉表头
depts=`mysql -u $USER $DATABASE <
EOF`for d in $depts; doecho Department: $d
result="`mysql -u $USER $DATABASE << EOF
set @i:=0;
SELECT @i:=@i+1 as rank, name, mark FROM students WHERE dept="$d"ORDER BY mark DESC;
EOF`"echo"$result"echo
done
我们还可以在mysql语句中,使用选项来控制数据的输出格式
-H 输出为html
-X 输出为xml
如下所示:
#!/bin/bash
USER="root"DATABASE="students"TABLE="students"mysql-u $USER $DATABASE -H <
EOF
html 格式的可读性比较差,输出效果如下:
id | name | mark | dept |
---|---|---|---|
1 | Navin M | 98 | CS |
2 | Kavya N | 70 | CS |
3 | Nawaz O | 80 | CS |
4 | Hari S | 80 | EC |
5 | Alex M | 50 | EC |
6 | Neenu J | 70 | EC |
7 | Bob A | 30 | EC |
8 | Anu M | 90 | AE |
9 | Sruthi | 89 | AE |
10 | Andrew | 89 | AE |
可读性差也可以理解,因为人家觉得,你没必要修改么,直接以html形式展示数据就可以了。
id name mark dept1 Navin M 98CS2 Kavya N 70CS3 Nawaz O 80CS4 Hari S 80EC5 Alex M 50EC6 Neenu J 70EC7 Bob A 30EC8 Anu M 90AE9 Sruthi 89AE10 Andrew 89 AE
xml形式的数据显示就比较正常了,直接将上面的-H 换成-X,输出如下:
1
Navin M
98
CS
2
Kavya N
70
CS
转自:http://www.lvtao.net/tool/mysql-shell.html
相关文章:
算法系列之二十:计算中国农历(二)
(接上篇) 所谓的“天文算法”,就是利用经典力学定律推导行星运转轨道,对任意时刻的行星位置进行精确计算,从而获得某种天文现象发生时的时间,比如日月合朔这一天文现象就是太阳和月亮的地心黄经(…

如何限制只有某些IP才能使用Tomcat Manager
只有指定的主机或IP地址才可以访问部署在Tomcat下的应用。Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve,前者用于限制主机名,后者用于限制IP地址。 通过配置这两个参数,可以让你过滤来自请求的主机或IP地址&a…

leetcode-24 两两交换链表中的节点
题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 方法一(递归&#x…

TimeQuest学习之三------外部寄存器模型
clock skew < destination reg clock delay > - < source reg clock delay > 为了使clock skew 的影响可以叠加到data delay上,给出如下三组公式(对于fpga2ic): 1.clock skew <ext_clk delay> - < fpga_cl…

linux mysql远程链接_Linux下mysql实现远程连接
首先明白一点并不是mysql禁止远程连接,而是MYSQL的账号禁止远程连接。可能觉得我有点咬文嚼字了,不过我感觉分清这点还是很重要的。默认情况下,所有账号都是禁止远程连接的。在安装MYSQL的时候,在设置ROOT密码那里有一个CHECKBOX&…

H5 客户端设置title 滑动验证码
转载于:https://www.cnblogs.com/Airoocle/p/10420140.html

leetcode-2 两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0…

spring-注解
spring框架提供xml文件的配置,也提供基于注解的方式实现配置任何的Bean实例,目前,struts2、hibernate和spring都相继支持基于注解的实现方式。spring要求程序员指定搜索哪些路径下的java类,spring会把合适的java类全部注册成sprin…

mysql raw_Oracle中的Raw类型解释
RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。 LONG RAW,类似于LORAW,类似于CHAR,声明方式RAW(L),L为…
面试题6:用两个栈实现队列
思路:设置两个栈stack1和stack2,stack1实现入队列功能,stack2实现出队列功能。 (1)入队列:入栈stack1 (2)出队列:若stack2不空,则直接弹出stack2中的栈顶元素…

php从数据库读取中文显示问号??的解决办法
出错原因:1、数据库编码格式不对 2、PHP编码格式不对 3、浏览器编码格式不对 上面三者编码格式不统一,就会出现问题 数据库读取的时候在mysqli_connect()之后要设置连接字符编码mysqli_query($db, “set names ‘utf8”);这样才能保证在浏览器显示的结果…

leetcode-20 有效的括号匹配
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。 注意空字符串可…
将ADS1.2的工程迁移到KEIL上-基于2440
新版的MDK支持2440相关芯片,但是很多人的工程都是基于ADS1.2开发,文字不好看,兼容性不好等等问题,而且电脑上装太多开发工具切换起来也麻烦,所以切换到MDK开发2440裸机程序应该是一个很好的选择 1. 新建MDK工程,芯片选择2440 不拷贝启动代码,因为我们用自己的启动代码 2.…

mysql占用资源最小的语句_MySQL一个语句查出各种整形占用字节数及最大最小值的实例...
直接上码:select bigint unsigned as type ,8 as bytes ,~0 as max_num,0 as min_num unionselect int unsigned,4,~0>>32,0 unionselect mediumint unsigned,3,~0>>40,0 unionselect smallint unsigned,2,~0>>48,0 unionselect tinyint unsigned…

使用命名管道的OVERLAPPED方式实现非阻塞模式编程 .
命令管道是进程间通讯的一种常用方式,对于命令管道的介绍可以参考别的资料和书籍,这里推荐一个《VC下命名管道编程的原理及实现》这篇博文,写得比较清楚。但是都是介绍了阻塞模式的编程,我这里主要是介绍利用命令管道OVERLAPPED方…

读梦断代码有感(1)2019.2.05
今天阅读了建民老师推荐的我们软件工程方面的书籍被称为经典的《梦断代码》,虽然只是读了一小部分但还是感受颇深,在我以往的经验看来,我们软件工程专业的书籍应该都是枯燥乏味的代码啊啥的,所以开始我并没有对这本书有多大的期望…

leetcode-25 K个一组反转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例 : 给定这个链表:1->2-…

自己动手写简单的web应用服务器(4)—利用socket实现文件的下载
直接上源码: 服务器: 1 package download;2 3 import java.io.BufferedInputStream;4 import java.io.BufferedOutputStream;5 import java.io.File;6 import java.io.FileInputStream;7 import java.io.IOException;8 import java.io.OutputStream;9 im…

mysql 数据泵_Oracle 数据泵详解
一、 EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2)在数据库用户之间移动对象. 3)在数据库之间移动对象 4)实现表空间搬移. 二、数据泵导出导入与传统一、EXPDP和I…

php 使用curl模拟登录discuz以及模拟发帖
<?php$discuz_url http://127.0.0.1/discuz/;//论坛地址$login_url $discuz_url .logging.php?actionlogin;//登录页地址 $post_fields array();//以下两项不需要修改$post_fields[loginfield] username;$post_fields[loginsubmit] true;//用户名和密码,必…

Java数组的初始化
1.动态初始化 数据类型 [] 变量名 new 数据类型 [数组大小]; //数组的动态初始化int [] arr new int [3]; 2.静态初始化 数据类型 [] 变量名 {元素1,元素2.....} //数组的静态初始化int [] arr2 {1,2,3}; 转载于:https://www.cnblogs.com/luguankun/p/1043128…

leetcode-135 分发糖果
题目描述: 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻的孩子…

mysql主从数据库含义_(转)Mysql数据库主从心得整理
管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验所写,整理了一下,分享给各位同行…

Const 重载解析
1. Const重载应用场景 首先,对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参。则这个时候无论加不加const对实参不会产生任何影响。但是在引用或指针传递函…

Ubuntu手机系统会成为第四大手机系统吗
啊蛋评论:先不说哪令人“卧槽”的配置!就冲着这双系统。。也要体验一下!(lz不是给ubuntu写软文的。完全是个人评论。) Ubuntu开发商Canonical发布了代号为Edge的智能手机,与其说是发布,倒不如…

codechef ANUCBC(背包)
题目链接: https://www.codechef.com/problems/ANUCBC 按模数进行背包 取模不要直接取,分开写,不然会T #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack&…

leetcode-386 字典序排数
给定一个整数 n, 返回从 1 到 n 的字典顺序。 例如, 给定 n 13,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。 请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。 根据题目描述,所谓字典顺序,即数…

零售连锁专卖信息化解决方案简介之二
连锁零售它提供了对商业连锁的整体管理,从商品采购开始到面向最终消费者各阶段都可以找到连锁零售的解决方案。连锁零售针对批发、连锁、零售业供应链中不同的业态提出了不同的解决方案。在信息管理系统的层次中隶属于经营决策型,可以帮助企业全面实现DS…

mysql客户端指令_mysql command line client(mysql命令行客户端)
mysql command line client(mysql命令行客户端)(2010-03-24 09:18:38)标签:文化分类:数据库1.输入密码:******2.ues mysql;使用Mysql3.show databases;显示数据库4.use register;使用数据库名为register5.show tables;显示register数据库中的…

StingBuffer
2019独角兽企业重金招聘Python工程师标准>>> 昨天面试问道一题:StringBuffer的底层实现原理是什么?当时想想应该是字符串数组吧,心里也不是有万分把握,面试结果只能等通知了(最没戏的结果)&…