0


爬虫学习(06): 数据存储_mysql篇

一、mysql简介

数据库

是一个能

存数据

的软件, 提供各种数据的

查询操作

, 以及对数据的

修改操作
mysql

的具体安装操作,这里就不做过多的介绍了。主要讲讲如何通过py程序来实现mysql操作。
具体的安装操作可以看下面这一篇

链接

: mysql的安装与配置

这里的操作基本都在navicat里实现可视化

1. 安装python连接mysql的模块 -> pymysql模块

pip install pymysql

2. pymysql导包:

import pymysql

二、mysql基本操作

1. 创建表

SQL语句

创建表格

createtable student(-- 字段=列=column=属性
    sno int(10)primarykeyauto_increment,
    sname varchar(50)notnull, 
    sbirthday datenotnull,
    saddress varchar(255),
    sphone varchar(12),
    class_name varchar(50));

项目数据类型double小数varchar字符串date时间(年月日)datetime时间(年月日时分秒)text大文本项目约束条件primary key主键, 全表唯一值. 就像学号. 身份证号. 能够唯一的确定一条数据auto_increment主键自增. 必须是整数类型not null不可以为空.null可以为空default设置默认值

2. 修改表

-- 添加一列ALTERTABLE table_name
ADDCOLUMN column_name datatype

-- egALTERTABLE student 
ADDCOLUMN f_name VARCHAR(20)NOTNULLAFTER sno;-- AFTER 用于将新加的列在指定列的后面插入-- 删除一列ALTERTABLE table_name 
DROPCOLUMN column_name

-- 修改一列的数据类型ALTERTABLE table_name
MODIFYCOLUMN column_name datatype

-- 表格重命名ALTERTABLE table_name RENAMETO new_name;

3. 在navicat中实现创建表和修改表

3.1 navicat与mysql连接

在这里插入图片描述
在这里插入图片描述
创建完毕后,还需要右键或者双击打开连接
在这里插入图片描述

3.2 navicat创建数据库

在这里插入图片描述
在这里插入图片描述
和连接一样,也是需要进行开启的
在这里插入图片描述

至此, Navicat可以操纵你的数据库了.

3.3 navicat创建表

在这里插入图片描述
傻瓜式操作
在这里插入图片描述

3.4 navicat设计表

选择创建好的表,右键设计表,就可以进行修改表操作了
在这里插入图片描述

4. 数据的操作-增删改查-数据

4.1 增加数据

INSERTINTO table_name(col1, col2, col3...)values(val1,val2,val3)
-- 添加学生信息INSERTINTO STUDENT(sname, sbirthday, saddress, sage, class_name)values('周杰伦','2020-01-02',"北京市昌平区",18,"二班");

注意, 如果

主键设置自增

, 就

不用处理主键

了. mysql会

自动

的帮我们

按照自然顺序

进行

逐一自增

.

4.2 删除数据

DELETEFROM table_name where_clause
-- 删除学生信息DELETEFROM STUDENT where sno =1;

4.3 修改数据

UPDATE table_name SET col1 = val1, col2 = val2... where_clause
-- 修改学生信息UPDATE STUDENT SET SNAME ='王力宏'where sno =1;

4.4 查询数据

4.4.1 基础查询
SELECT*|col1, col2, col3 
FROM table_name 
where_clause
-- 全表查询SELECT*FROM STUDENT;-- 查询学生姓名, 年龄SELECT sname, sage FROM STUDENT;-- 查询学号是1的学生信息select*from student where sno =1;-- 查询年龄大于20的学生信息select*from student where sage >20;-- 查询学生年龄大于20 小于40的信息(包含)select*from student where sage >=20and sage <=40;select*from student where sage between20and40;-- 查询姓张的学生信息--         _一位字符串--         %多位字符串select*from student where sname like'张%';
4.4.2 分组查询和聚合函数

如何查询每个班级学生的平均年龄?

我们先把数据扩充一下下

在这里插入图片描述

每个班级的平均年龄. 我们是不是需要先把班级与班级先分开. 每个班级自己内部进行计算.对吧. 此时, 我们需要的就是一个分组的操作. 此时需要用到group by语句

select*from table_name groupby col_name

注意, 上方的sql是无法使用的. sql要求分组后, 到底要做什么必须明确指出. 否则报错

那很容易呀, 我们分完组要计算每个班级的平均年龄. 平均数如何计算, 这就要用到聚合函数. sql中提供5种聚合函数, 分别是: avg(), sum(), min(), max(), count()

-- 查询每一个班级的平均年龄selectavg(sage), class_name from STUDENT groupby class_name;-- 查询每个班级最小的年龄selectmin(sage), class_name from STUDENT groupby class_name;-- 查询每个班的最大年龄selectmax(sage), class_name from STUDENT groupby class_name;-- 查询每个班的学生数量selectcount(*), class_name from STUDENT groupby class_name;-- 查询每个班级的年龄和selectsum(sage), class_name from STUDENT groupby class_name;

注意, 不要把没有放在group by的内容直接放在select中. 你想想. 按照班级来查询平均年龄, 你非要把某一个人的信息放在结果里. 是不合适的.

4.4.4 having语句

如果我们需要对聚合函数计算的结果进一步的筛选. 可以用having语句

-- 查询平均年龄在15岁以上的班级信息selectavg(sage), class_name from student groupby class_name havingavg(sage)>15;
having和where的区别

:

  1. where, 在原始数据上进行的数据筛选.
  2. having, 在聚合函数计算后的结果进行筛选.
4.4.5 排序

sql中使用

order by

语句对查询结果进行

排序

.

-- 按照年龄从小到大查询学生信息select*from student orderby sage asc-- 按照年龄从大到小查询学生信息select*from student orderby sage desc

4.5 多表联合查询

在实际使用中, 一个表格肯定是无法满足我们数据存储的. 比如, 在学生选课系统中. 我们就可以设计成以下表结构:

  1. 学生表: 学号, 姓名, 性别, 住址等…
  2. 课程表: 课程编号, 课程名称, 授课教师等…
  3. 学生课程-成绩表: 成绩表编号, 学号, 课程编号, 成绩

在这样的表结构中:

优势

: 每个表的结构相对明确. 不存在歧义. 数据保存完整, 没有冗余.

劣势

: 新手不太好想. 想不通为什么要这样设计. 这里涉及到数据库表结构设计范式, 该模型属于第三范式(听过就行).

在该模型表结构中. 成绩表是非常重要的. 在成绩表中, 明确的说明了哪个学生的哪一门课程得了多少分. 它将两个原来毫不相关的表关联了起来. 建立了主外键关系.

何为

主外键关系

:

​ 把A表中的主键放在另一张表里作为普通字段使用, 但数据要求必须来自于A. 这个很好理解. 比如, 学生成绩表中的学生编号数据就必须来自于学生表. 否则该数据是无意义的.

注意, 以上结构只是为了讲解多表关系. 并非完整的学生选课系统表结构.

建表语句:

-- 创建学生表, 课程表, 成绩表-- 1. 学生表: 学号, 姓名, 性别, 住址等...-- 2. 课程表: 课程编号, 课程名称, 授课教师等...-- 3. 学生课程-成绩表:  成绩表编号, 学号, 课程编号, 成绩createtable stu(
    sid intprimarykeyauto_increment,
    sname varchar(50)notnull, 
    gender int(1),
    address varchar(255));createtable course(
    cid intprimarykeyauto_increment,
    cname varchar(50)notnull, 
    teacher varchar(50));createtable sc(
    sc_id intprimarykeyauto_increment,
    s_id int, 
    c_id int,
    score int,CONSTRAINT FK_SC_STU_S_ID FOREIGNkey(s_id)REFERENCES stu(sid),CONSTRAINT FK_SC_COURSE_C_ID FOREIGNkey(c_id)REFERENCES course(cid));
4.5.1 子查询

​ 在where语句中可以进行另外的一个查询.

​ 例如, 查询选择了"编程"这门课的学生

-- 查询选择了"编程"这门课的学生-- 先查询编程课程的编号select cid from course where cname ='编程';-- 根据cid可以去sc表查询出学生的idselect s_id from sc where c_id =2;-- 根据学生ID查询学生信息select*from stu where sid in(1,2,3,4,5,6);-- 把上面的sql穿起来 select*from stu where sid in(select s_id from sc where c_id in(select cid from course where cname ='编程'));-- 查询课程名称为“编程”,且分数低于60的学生姓名和分数select stu.sname, sc.score from stu, sc where stu.sid = sc.s_id and sc.score <60and sc.c_id in(select cid from course where cname ='编程')
4.5.2 关联查询
关联查询

就是把多个表格通过

join的方式

合并在一起. 然后进行条件检索.

语法规则:

select...from A xxx join B on A.字段1= b.字段2

表示:  A表和B表连接. 通过A表的字段1和b表的字段2进行连接. 通常on后面的都是主外键关系
4.5.2.1 inner join
-- 查询每门课程被选修的学生数-- count(*)-- group by cidselect c.cid,c.cname,count(*)from sc innerjoin course c on sc.c_id = c.cid groupby c.cid, c.cname
4.5.2.2 left join
-- 查询所有学生的选课情况select s.sname, c.cname from stu s leftjoin sc on s.sid= sc.s_id leftjoin course c on sc.c_id = c.cid

-- 查询任何一门课程成绩在70分以上的姓名、课程名称和分数-- score > 70 sc-- sname student-- cname courseselect s.sname, c.cname, sc.score from stu s innerjoin sc on s.sid = sc.s_id innerjoin course c on sc.c_id = c.cid
where sc.score >70

三、python连接mysql

3.1 查找数据

import pymysql  # 导入模块from pymysql.cursors import DictCursor  # 导入字典模块#  1. 创建连接
conn = pymysql.connect(#  当忘记参数是什么的时候,直接按住commond点进去看看
        user='root',# 用户名
        password="x",# 密码
        host='127.0.0.1',# 端口
        database='test',# 数据库名)#  2. 创建cursor, 游标 -> 用于执行sql语句,,以及获取sql执行结果
cursor = conn.cursor()#  2.1 执行sql语句
cursor.execute('select * from student')
r = cursor.fetchall()# 获取结果print(r)# 运行完毕,会发现是元组套元组的形式 # ( (), () )#  而我们喜欢的数据类型应该是 [{cno:1, cname:xxx, xxx: xxx}, {}, {}]#  所以需要导入一个字典模块#  将导入的模块放到游标里
cursor1 = conn.cursor(DictCursor)#  2.1 执行sql语句
cursor1.execute('select * from student')
r = cursor1.fetchall()# 获取结果print(r)# 可以发现已经成为我们想要的那个类型了

运行结果
在这里插入图片描述

3.2 新增数据

import pymysql  # 导入模块from pymysql.cursors import DictCursor  # 导入字典模块#  1. 创建连接
conn = pymysql.connect(#  当忘记参数是什么的时候,直接按住commond点进去看看
        user='root',# 用户名
        password="x",# 密码
        host='127.0.0.1',# 端口
        database='test',# 数据库名)#  2. 新增数据
cursor = conn.cursor()
sname ='wby'
sbirthday ='2010-08-10'
saddress ='浙江宁波'
class_name ='少年团'#  准备好sql语句#  注意: 这种sql的问题 1. 很乱, 2. 有被注入的风险,可以选择下面的方式
sql =f'insert into student(sname, sbirthday, saddress, class_name) values ("{sname}", "{sbirthday}", "{saddress}", "{class_name}")'
cursor.execute(sql)#  数据增加后,需要提交
conn.commit()#  %s字符串的占位符  用来预处理,有几个参数要填入,就写几个%s   ->  推荐这种方法
sql =f'insert into student(sname, sbirthday, saddress, class_name) values (%s, %s, %s, %s)'#  在execute中放预处理的内容, 注意传入的是元组的形式
cursor.execute(sql,(sname, sbirthday, saddress, class_name))
conn.commit()

四、关于mysql总结

  1. 爬虫常用的增加数据操作
insertinto 表(字段1,字段2,字段3...)values(值1,值2,值3...)
  1. 爬虫常用的修改数据操作
update 表 set 字段=值, 字段=值 where 条件
  1. 爬虫常用的删除数据操作
deletefrom 表 where 条件
  1. 爬虫常用的查询数据操作
select*from 表 where 条件

本文转载自: https://blog.csdn.net/m0_48936146/article/details/127473183
版权归原作者 爬虫选手_不懂就问 所有, 如有侵权,请联系我们删除。

“爬虫学习(06): 数据存储_mysql篇”的评论:

还没有评论