每天30分钟 一起来学习爬虫——day17(数据存储 之 MySQL E_R模型 & Mysql--python交互)

MySql 表之间的关系

  • E_R 模型的关系
  • 具体操作
    • 1.关联查询:
    • 2.视图:
    • 3.自关联
  • 事务
  • 查询效率
  • python和mysql交互
  • 数据备份和恢复


E_R 模型的关系

关系:不建议表与表之间建立闭合的关系
学生表,成绩表,科目表
成绩表有一个外键与学生表和科目表关联

每天30分钟 一起来学习爬虫——day17(数据存储 之 MySQL E_R模型 & Mysql--python交互)_第1张图片

foreign  references 
foreign  references 

表与表关联,产生约束,如果要删除,对应的关联的表会报错,我们用逻辑删除

具体操作

先建表,再约束

科目表:

建表
create table subjects(
id int auto_increment primary key not null,
title varchar(10) not null);
插入数据
insert into subjects values(0,“语文”),(0,“数学”),(0,“英语”),(0,“科学”);

学生表:

建表
create table stu(
id int auto_increment primary key,
name varchar(20) not null,
birthday datetime,
gender bit default 1,
isdelete bit default 0,
address varchar(20),
score int(10) );
插入数据
insert into stu values (1,“小明”,“2008-01-01”,0,0,“北京”,90),
(2,“小红”,“2007-01-01”,1,0,“上海”,80),
(3,“小兰”,“2006-01-01”,1,0,“广州”,100),
(4,“小王”,“2005-01-01”,0,0,“深圳”,20),
(5,“老王”,“2009-01-01”,0,0,null,30),
(6,“老刘”,“2004-01-01”,0,0,null,40),
(7,“小丽”,“2003-01-01”,1,0,“东莞”,50),
(8,“小芳”,“2002-01-01”,1,0,“福建”,60),
(9,“小粒”,“2001-01-01”,0,0,“福州”,70);

成绩表:

建表
create table scores(
id int auto_increment primary key not null,
score decimal(5,2), 设置成绩这字段是小数,长为五,保留1为小数
stuid int, 自己设置两个字段
subid int,
foreign key(stuid) references stu(id), 字段的值是外键
foreign key(subid) references subjects(id) 字段是外键
);
插入数据
insert into scores values(0,80 ,1,1),(0,60,2,2),(0,70,2,3),(0,90,3,1),(0,60,4,4),(0,75,5,2);

1.关联查询:

select <需要查的字段>
from <表名>
inner join <关联的表名> on <表中的外键> = <关联的表的字段>
inner join <关联的表名> on <表中的外键> = <关联的表的字段>;

 select stu.name,subjects.title,scores.score
    from scores
    inner join stu on scores.stuid = stu.id
    inner join subjects on scores.subid = subjects.id;

连接

select stu.name,subjects.title,scores.score
   from scores
   left join  stu on scores.stuid = stu.id
   left join subjects on scores.subid = subjects.id; 
select * from scores
   left join stu on scores.stuid=stu.id;

右连接

select stu.name,subjects.title,scores.score
   from scores
   right join  stu on scores.stuid = stu.id
   right join subjects on scores.subid = subjects.id;
  select * from scores right join stu on scores.stuid =stu.id;

左连接显示的数据会以左边字段的个数为主,右连接以右边的数据个数为主,
多的数据就不显示,少的数据用空来补

每天30分钟 一起来学习爬虫——day17(数据存储 之 MySQL E_R模型 & Mysql--python交互)_第2张图片

求一下平均分

select stu.name ,avg(scores.score) from scores
 inner join stu on scores.stuid = stu.id
 group by stu.name;

求一下每课的平均分

select subjects.title,avg(scores.score) from scores
inner join subjects on scores.subid = subjects.id
group by subjects.title;

每天30分钟 一起来学习爬虫——day17(数据存储 之 MySQL E_R模型 & Mysql--python交互)_第3张图片

每天30分钟 一起来学习爬虫——day17(数据存储 之 MySQL E_R模型 & Mysql--python交互)_第4张图片

2.视图:

对于复杂查询的封装

创建
create view studentsscore as
-> select subjects.title,avg(scores.score) from scores
-> inner join subjects on scores.subid = subjects.id
-> group by subjects.title;

查询

select * from <视图的名字>;
select * from studentsscore;

删除视图

drop view <视图的名字>;
drop view studentsscore;

每天30分钟 一起来学习爬虫——day17(数据存储 之 MySQL E_R模型 & Mysql--python交互)_第5张图片注意,视图只是对复杂查询的封装,显示在表的位置,但不是表。

3.自关联

比如我们建立一个省市,城镇,乡村联动的表,数据不多,就两万多,我们没有必要开三个表,我们可以在一张表中,自己关联,即,城市关联省市的id,就是在本表中的id,至于数据,大家可以自行百度一下,这是一个典型的应用,数据较多这里我就不放了。

创建

create table areas(
id int primary key,
title varchar(50),
pid int ,
foreign key(pid) references areas(id));

导入数据文件:

1.进入有文件的路径,
2.打开数据库
3.source <文件名 > ,source areas.sql

查询

select city.* from areas as city
inner join areas an proivnce on city.pid = province.id
where proivndce.title =“云南省”

查找石家庄市的所有县

select district.* from areas as district
inner join areas as city on city.id = district.pid
where city.title =“石家庄”


事务

特性ACID:

  1. A:原子性
  2. C:一致性
  3. I :隔离性
  4. D:持久性

表的引擎是 engine=InnoDB 这个是支持事务,如果不支持,就通过alter table <表名> engine= innodb; 来设置引擎,使其支持事务

  1. 开启事务:begine;

  2. 提交事务:commit;这就交了

  3. 事务回滚:rollback;这就回滚了,相当于事务没有提交,然后被删了

每天30分钟 一起来学习爬虫——day17(数据存储 之 MySQL E_R模型 & Mysql--python交互)_第6张图片

下面用python 和 MySql 交互的时候,就需要使用事务


查询效率

索引查询效率高,数据类型越小越好,能用整型就不用字符串,不适用NULL 用 0来代替

创建索引

create index <索引的名字> on <表的名字>(<设置为索引的字段>(索引长度))

查看所有的索引 :

show index from <表名>;

删除索引:

drop index <索引名字> on <表名>

验证查询时间

查询开始时
set profiles=1;
… 查询操作
… 查询操作
… 查询操作
show profiles 看时间


python和mysql交互

# 安装mysql,导入
import pymysql
try:
    # 连接数据库 对象 connectinon()
    conn = pymysql.Connection(
        host="localhost",
        port=3306,
        db="animal",
        user="root",
        passwd="xxxx",# 这里写自己的密码
        charset="utf8"# 告诉数据库使用的编码格式
    )
    # 创建数据库的游标对象cursor()
    cur = conn.cursor()

    # 增加数据 给科目表
    insert_sub = "insert into subjects values(0,'python')"# 这个是增加的语句,id自增,科目是python。插入到subjects 这个表中
    result = cur.execute(insert_sub)
    print(result)  
    # 提交事务
    conn.commit()
    # 关闭游标
    cur.close()
    # 关闭连接
    conn.close()
except Exception as e:
    print(e)
import pymysql
try:
    # 连接数据库 对象 connectinon()
    conn = pymysql.Connection(
        host="localhost",
        port=3306,
        db="animal",
        user="root",
        passwd="xxxx",# 这里写自己的密码
        charset="utf8"# 告诉数据库使用的编码格式
    )
    # 创建数据库的游标对象cursor()
    cur = conn.cursor()

    # 修改数据
    update_sub = "update subjects set title='区块链' where title='python'"
    result = cur.execute(update_sub)
    print(result)
    # 提交事务
    conn.commit()
    # 关闭游标
    cur.close()
    # 关闭连接
    conn.close()
except Exception as e:
    print(e)

删除和查询 和上面两个类似,只给出部分代码,只用在上面的代码将剧吐操作卸载try中,并且记得要关闭事务和数据库

 # 删除数据
    delet_sub = "delete from subjects where id = 6"
    result = cur.execute(delet_sub)
    print(result)

# 查询数据
    '''
    select_sub = "select * from subjects where id = 2"
    cur.execute(select_sub)
    result = cur.fetchone()
    print(result)
    '''
    select_sub = "select * from subjects "
    cur.execute(select_sub)
    result = cur.fetchall()
    print(result)


数据备份和恢复

备份:

mysqldump -u root -p <数据库名> <表名> > 文件路径
mysqldump -u root -p animal stu >D:\dbg\BackupName.sql

恢复

mysql -u root -p 数据库名 < 路径
mysql -u root -p animal < D:\dbg\BackupName.sql
恢复之前,你首先要有这个数据库,然后恢复后的表的名字在.sql文件里写着。

每天30分钟 一起来学习爬虫——day17(数据存储 之 MySQL E_R模型 & Mysql--python交互)_第7张图片


到这里,爬虫基础就学完了,如果对爬虫感兴趣或者想更深入学习爬虫,请继续关注我的 爬虫进阶 专栏,


我又来要赞了,还是希望各位路过的朋友,如果觉得可以学到些什么的话,点个赞再走吧,欢迎各位路过的大佬评论,指正错误,也欢迎有问题的小伙伴评论留言,私信。每个小伙伴的关注都是我更博的动力。

你可能感兴趣的:(python3,爬虫入门)