关系:不建议表与表之间建立闭合的关系
学生表,成绩表,科目表
成绩表有一个外键与学生表和科目表关联
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);
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;
左连接显示的数据会以左边字段的个数为主,右连接以右边的数据个数为主,
多的数据就不显示,少的数据用空来补
求一下平均分
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;
对于复杂查询的封装
创建
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;
比如我们建立一个省市,城镇,乡村联动的表,数据不多,就两万多,我们没有必要开三个表,我们可以在一张表中,自己关联,即,城市关联省市的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:
表的引擎是 engine=InnoDB 这个是支持事务,如果不支持,就通过alter table <表名> engine= innodb;
来设置引擎,使其支持事务
开启事务:begine;
提交事务:commit;
这就交了
事务回滚:rollback;
这就回滚了,相当于事务没有提交,然后被删了
下面用python 和 MySql 交互的时候,就需要使用事务
索引查询效率高,数据类型越小越好,能用整型就不用字符串,不适用NULL 用 0来代替
创建索引
create index <索引的名字> on <表的名字>(<设置为索引的字段>(索引长度))
查看所有的索引 :
show index from <表名>;
删除索引:
drop index <索引名字> on <表名>
验证查询时间
查询开始时
set profiles=1;
… 查询操作
… 查询操作
… 查询操作
show profiles 看时间
# 安装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文件里写着。
到这里,爬虫基础就学完了,如果对爬虫感兴趣或者想更深入学习爬虫,请继续关注我的 爬虫进阶 专栏,
我又来要赞了,还是希望各位路过的朋友,如果觉得可以学到些什么的话,点个赞再走吧,欢迎各位路过的大佬评论,指正错误,也欢迎有问题的小伙伴评论留言,私信。每个小伙伴的关注都是我更博的动力。