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

MySql 表之间的关系

E_R 模型的关系

具体操作

1.关联查询:

2.视图:

3.自关联

事务

查询效率

python和mysql交互

数据备份和恢复

E_R 模型的关系

关系:不建议表与表之间建立闭合的关系

学生表,成绩表,科目表

成绩表有一个外键与学生表和科目表关联

aaca96d5da9a1356b6c0a432beeffc4c.png

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;

左连接显示的数据会以左边字段的个数为主,右连接以右边的数据个数为主,

多的数据就不显示,少的数据用空来补

b44c2758876d6ea7078728000e426c6a.png

求一下平均分

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;

226ab54a29abdcf34ee4ccbe301bca17.png

5a9a0ecbb0567ee86ee346c9e06c1271.png

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;

8bac7f9f8173d4493cdd8d7f71665eb3.png注意,视图只是对复杂查询的封装,显示在表的位置,但不是表。

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:

A:原子性

C:一致性

I :隔离性

D:持久性

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

开启事务:begine;

提交事务:commit;这就交了

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

dbb028517af9c483a0c04f7649f04d4f.png

下面用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文件里写着。

a6ee3c1f0cbd1c73c700bd0bbacdc852.png

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值