爬蟲學習筆記(十三)數據存儲——mysql 2020.5.17

前言

本節學習mysql

1、安裝

教程很多了
比如
https://blog.csdn.net/aa541505/article/details/103147115?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158926711519724811830210%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.57652%2522%257D&request_id=158926711519724811830210&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-19-103147115.nonecase&utm_term=mysql
https://blog.csdn.net/bobo553443/article/details/81383194?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158926711519724811830210%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.57652%2522%257D&request_id=158926711519724811830210&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-4-81383194.nonecase&utm_term=mysql

2、簡單介紹

三範式

  • 列不可拆分
  • 唯一標誌
  • 引用主鍵

數據完整性

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

數據庫啓動

在這裏插入圖片描述

3、操作

數據庫操作

create database animal charset=utf8;# 創建數據庫
show databases; #查看所有庫
drop database animal; #刪除數據庫
select database(); #查看當前庫
use animal; #切換數據庫

表操作

show tables; #查看所有表
show create table dog; #查看創建幫助
create table dog(
	id int auto_increment primary key,
	name varchar(10) not null
	); #創建表
alter table dog add gender bit; #修改表
desc dog; #查看錶結構
rename table dog to cat; #改表名

數據操作

# 增
insert into dog values(1,"拉布拉多",0); #插入數據
insert into dog(name,gender) values("小獵犬",1); #缺省插入
insert into dog values(3,"臘腸",0),(4,"約克夏"1); #批量插入
# 改
update dog set name="泰迪" where id=4;
# 查
select * from dog;
# 刪
delete from dog where name="臘腸"; #物理刪除,刪完id不變
alter table dog add isdelete bit default 0; #搞個標誌位
update dog set isdelete=1 where id=2; #邏輯刪除

4、查詢

先搞個庫

create table stu(
     id int auto_increment primary key,
     name varchar(10) not null,
     birthday datetime,
     gender bit default 0,
     isdelete bit default 0,
     address varchar(100),
     score int
     );
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);

條件運算

select * from stu where id>=6;
select name from stu where id!=6;

邏輯運算

select name from stu where id>6 and gender=1;
select name from stu where id<4 or gender=0; 

模糊查詢

select * from stu where name like "小%"; #%表示任意多個字符

範圍查詢

select * from stu where id in(1,3,5,7);
select * from stu where id between 1 and 5;
select * from stu where address is null;

聚合查詢

select count(*) from stu  where gender=0; #個數
select Max(score) from stu; #最大值
select sum(score) from stu where gender=1; #求和
select avg(score) from stu where gender=0; #求平均

分組查詢

select gender as "性別", count(*) from stu group by gender; #男生女生的總數

排序

select * from stu where isdelete=0 order by score desc; #降序,升序用asc

分頁

select * from stu limit 0,3; #從0開始查3個
select * from stu limit 3,2; #從3開始查2個

去重

select distinct adress from stu;

5、表間關係

先建幾個表

# 科目表
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 not null,
     name varchar(10) not null,
     birthday datetime,
     gender bit default 0,
     isdelete bit default 0,
     address varchar(100),
     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 primary key auto_increment,
	stuid int, #對應花名冊id
	subid int, #對應科目表id
	score decimal(5,2), #小數,5位數,保留1位
	foreign key(stuid) references stu(id), #外鍵關聯
	foreign key(subid) references subjects(id)
	); 
insert into scores values(0,1,1,80),(0,2,2,60),(0,2,3,70),(0,3,1,90),(0,4,4,60),(0,5,2,75);

鏈接查詢

# 每個學生每個學科的成績
select stu.name,subjucts.title,scores.score from scores inner join stu on scores.stuid=stu.id inner join subjects on scores.subid=subjects.id; 
# 左鏈接
select subjucts.title,scores.score from scores right join subjects on scores.subid=subjects.id; 

例子

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

6、視圖

用於對複雜查詢的封裝

# 創建視圖
create view studentscore as select stu.name,scores.score from scores inner join stu on scores.stuid=sut.id;
# 使用視圖
select * from studentscore;
# 刪除
drop view studentscore;

7、查詢效率

  • 數據類型越小越好
  • 能用整型最好
  • 用0來代替null

索引

# 創建索引
create index name on tablename(key(length));
# 查看索引
show index from tablename;
# 刪除索引
drop index name on tablename;

8、備份

# 備份
mysqldump -u root -p db_name table_name > 備份文件的絕對路徑
# 恢復
mysql -u root -p db_name < 備份文件的絕對路徑

9、與python交互

# 安裝
# pip install pymysql
import pymysql
try:
    # 1.鏈接 數據庫  鏈接對象 connection()
    conn = pymysql.Connect(
        host="localhost",
        port=3306,
        db='animal',
        user='root',
        passwd="mysql",
        charset='utf8'
    )
    # 2. 創建 遊標對象 cursor()
    cur = conn.cursor()
    # 增加一條數據 科目表--GO語言
    insert_sub = 'insert into subjects values(0,"GO語言")'
    result = cur.execute(insert_sub)
    print(result)
    # 修改
    update_sub = 'update subjects set title="區塊鏈" where id=7'
    result = cur.execute(update_sub)
    print(result)
    # 刪除
    delete_sub = 'delete from  stu  where id=8'
    result = cur.execute(delete_sub)
    print(result)
    # 查找
    find_sub = 'select * from subjects where id=1'
    cur.execute(find_sub)
    result = cur.fetchone() #一行數據一個元組
    print(result)
    find_sub = 'select * from subjects'
    cur.execute(find_sub)
    result = cur.fetchall() #一個大元組包含多個小元組
    print(result)
    # 提交事務
    conn.commit()
    # 關閉遊標
    cur.close()
    # 關閉鏈接
    conn.close()
except Exception as e:
    print(e)

結語

對mysql做了個簡單學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章