数据分析之MySQL
MySQL数据库思想
- 数据库是一种关系数据库
(1)对于Java语言和其他计算机语言作为后台开发来讲,数据库的关系体现在1对1 、1对多、 多对多(由中间表产生) 、多对1。
(2)在python数据分析、人工智能技术领域上关系的理解是:将数据通过numpy、pandas、matplotlib进行数据分析,体现在数据的发布思想!将数据发布给用户、人工智能设备作为数据集。
MySQL数据库的实战
(1)只能满足小型企业级的开发,对于数据集不是很适合!数据存储量较大!数据不安全!
(2)Oracle针对于大数据/人工智能利用很多。
(3)数据库分为DDL、DCL、DML语句。
- DML:数据库操作语言(Data Mannipliulation Language)—用于检索或者修改数据
- DDL:数据库定义语言(Data Defination Language)—用于定义数据的结构
- DCL:数据库控制语言(Data Control Language)—用于定义数据库用户的权限DB
MySQL企业级安装流程以及企业版本的选择
(1)mysql分为客户端服务端,MySQL自身会携带基于dos的客户端和服务端
(2)安装注意事项
- 用户名和密码设置:root root
- 端口默认3306 Oracle默认
- 编码格式默认是英文手动改为utf8。数据库中没有- * !。。。特殊字符
- 编码格式忘记修改不需要删除MySQL,只需找到my,ini文件,修改配置文件,重启!
MySQL卸载
(1)进入控制面板删除MySQL安装程序包
(2)进入安装目录删除MySQL文件
(3)进入c盘window下/用户下找MySQL字样,全部删除
(4)cmd窗口输入regedit进入注册表找
- 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL
- 计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MySQL
(5)回收站删除文件
(6)重启计算机
MySQL重点命令
(1)mysql -hlocalhost -uroot -p ------->登录操作,输入密码进入
(2)show databases; ------->展示数据库
(3)use shop; —Database changed show tables; ------>显示指定库中的表
(4)create database 库名; ------>建库
(5)use 库名; create table 表名 (字段设定列表); ----->建表
(6)drop database 库名; drop table 表名;------>删库和删表
char和varchar的区别
①varchar执行效率快,但会产生磁盘垃圾。数据库回收磁盘垃圾,会造成内存浪费。MySQL自身内存小不建议使用,Oracle追求读写速度建议使用!
②char执行效率较快,但是不产生磁盘垃圾。适合MySQL!
MySQL插入insert操作
(1) insert into 表 (字段名1,字段名2,字段名3)value(值1,值2,值3);---->字段名和值一一对应,数据安全、数据好维护、效率高!sql底层只执行一次匹配字段
(2) insert into 表 values(值1,值2,值3);----->字段和值没有一一对应,数据不是很匹配、数据不好维护、效率较高!sql底层只能先寻找key和value 执行2次以上匹配
(3)insert into 表 values(值2,值3);----->此写法必须满足id是主键,然后通过主键去自动匹配数据库的字段名对应的value
python中安装mysql数据库
(1) python3.2以前的版本官网下载exe文件安装
(2) python3.2以后的版本,cdm进入python的安装目录,执行命令pip install MySQLClient进行注册安装。-----企业大量使用!
实现MySQLClient操作数据分析案例
# 导包/模块
import os;
import pandas;
import MySQLdb;
# 连接数据库
connection = MySQLdb.connect(
host='localhost',
user='root',
passwd='root',
db='python',
charset='utf8'
);
#导入数据到MySQL。遍历目录,把里面的所有数据入库
rootDir="C:\\ZhangTao\\python课件\\0808\\测试数据\\";
# 定义一个exeSQL输出SQL执行结果
def exeSQL(sql):
print("exeSQL: " + sql)
connection.query(sql);
for fileName in os.listdir(rootDir):
print(fileName)
path = os.path.join(rootDir, fileName)
if ".txt" in fileName:
path = path.replace("\\", "\\\\");
#拿到文件名中的时间字段
datetime = fileName[0:8];
tableName = "订购明细" + datetime;
#建表、导入数据到表中
exeSQL("drop table if exists " + tableName)
exeSQL("create table " + tableName + "(订单编号 int, 订购日期 datetime, 用户ID int, 产品 char(8), `单价(元)` int, 数量 int, 订购金额 int);");
#mysql将数据导入表的固定语句
exeSQL("LOAD DATA LOCAL INFILE '" + path + "' INTO TABLE `" + tableName + "` CHARACTER SET 'UTF8' COLUMNS TERMINATED BY ',' LINES TERMINATED BY '\\n' IGNORE 1 ROWS;");
#建立日订购统计表
exeSQL("create table if not exists 日订购统计表(统计日期 date, 订购用户数 int, 订购次数 int, 人均订购金额 double, 订购总额 double);");
exeSQL("delete from 日订购统计表 where 统计日期='" + datetime + "';");
exeSQL("insert into 日订购统计表 select '" + datetime + "', count(distinct 用户ID), count(用户ID), sum(订购金额)/count(distinct 用户ID), sum(订购金额) from `" + tableName + "`;");
statDay = pandas.read_sql('select * from 日订购统计表;', con=connection);
#关闭数据库
connection.close();
print('\n日订购统计表数据如下:');
print(statDay);
#绘图
font = {
'family' : 'SimHei'
}
matplotlib.rc('font', **font);
# 1.折线图
plot1 = plt.plot(statDay['统计日期'], statDay['订购用户数']);
plt.show();
plot2 = plt.plot(statDay['统计日期'], statDay['订购次数']);
plt.show();
plot3 = plt.plot(statDay['统计日期'], statDay['人均订购金额']);
plt.show();
plt.legend(('订购用户数', '订购次数', '人均订购金额'))
# 2.柱状图
x=statDay['统计日期']
x_labels=['0901','0902','0903','0904','0905','0906','0907','0908']
y=statDay['订购总额']
plt.bar(x,y,width=0.5)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.xticks(x,x_labels)
#修改x坐标
plt.xlabel('统计日期')
#修改y坐标
plt.ylabel('订购总额')
#添加标题
plt.title('柱状图')
plt.show()
# 3.饼状图
price=statDay['订购总额']
prices=sum(statDay['订购总额'])
price_perc=price/prices
#添加名称
labels=['0901','0902','0903','0904','0905','0906','0907','0908']
#添加颜色
colors=['blue','red','blue','red','blue','red','blue','red']
#绘制饼状图 pie
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
# labels 名称 colors:颜色,explode=分裂 autopct显示百分比
paches,texts,autotexts=plt.pie(price_perc,labels=labels,colors=colors,autopct='%0.1f%%')
#设置饼状图中的字体颜色
for text in autotexts:
text.set_color('white')
#设置字体大小
for text in texts+autotexts:
text.set_fontsize(20)
plt.show()
结果如下:
①exeSQL: drop table if exists 订购明细20110908
②exeSQL: create table 订购明细20110908(订单编号 int, 订购日期 datetime, 用户ID int, 产品 char(8), 单价(元) int, 数量 int, 订购金额 int);
③exeSQL: LOAD DATA LOCAL INFILE ‘C:\ZhangTao\python课件\0808\测试数据\20110908.txt’ INTO TABLE 订购明细20110908 CHARACTER SET UTF8 COLUMNS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’ IGNORE 1 ROWS;
④exeSQL: create table if not exists 日订购统计表(统计日期 date, 订购用户数 int, 订购次数 int, 人均订购金额 double, 订购总额 double);
⑤exeSQL: delete from 日订购统计表 where 统计日期=‘20110908’;
⑥exeSQL: insert into 日订购统计表 select ‘20110908’, count(distinct 用户ID), count(用户ID), sum(订购金额)/count(distinct 用户ID), sum(订购金额) from 订购明细20110908;
日订购统计表数据如下:
统计日期 | 订购用户数 | 订购次数 | 人均订购金额 | 订购总额 | |
---|---|---|---|---|---|
0 | 2011-09-01 | 14649 | 24053 | 1824.994198 | 26734340.0 |
1 | 2011-09-02 | 22134 | 48647 | 2466.560043 | 54594840.0 |
2 | 2011-09-03 | 28248 | 79609 | 3210.812093 | 90699020.0 |
3 | 2011-09-04 | 28016 | 76534 | 3076.438464 | 86189500.0 |
4 | 2011-09-05 | 6427 | 8066 | 1391.996266 | 8946360.0 |
5 | 2011-09-06 | 6698 | 8381 | 1389.779039 | 9308740.0 |
6 | 2011-09-07 | 7071 | 8991 | 1406.253712 | 9943620.0 |
7 | 2011-09-08 | 6613 | 7859 | 1331.410857 | 8804620.0 |
1.折线图
2.柱状图
3.饼状图