Python | Python学习之mysql交互详解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Python | Python学习之mysql交互详解

前言

最近在学习scrapy redis,在复习redis的同时打算把mysql和mongodb也复习一下,本篇为mysql篇,实例比较简单,学习sql还是要动手实操记的比较牢。

安装与启动

安装:sudo apt-get install mysql-server

查看服务:ps ajx | grep mysql

停止服务:sudo service mysql stop

开启服务:sudo service mysql start

重启服务:sudo service mysql restart

链接数据库:mysql -uroot -p后输入密码

查看版本:select version();

常见数据库语句

查看数据库:show database;

创建数据库:create database 库名 [charset = UTF8];

查看建库语句:show create database 库名;

使用数据库:use 库名;

删除数据库:drop 库名;

常见数据表语句

查看表:show table;

查看表结构:desc 表名;

创建表:

CREATE TABLE table_name(
    column1 datatype contrai,
    column2 datatype,
    column3 datatype,
    .....
    columnN datatype,
    PRIMARY KEY(one or more columns)
);

创建表常用属性字段:

-- auto_inorement 表示自动增长
-- not null 表示不为空
-- primary key 表示为主键
-- defaul 表示默认值

删除表:drop table;

修改表结构:

添加字段:alter table 表名 add 列名 类型;
修改字段(重命名):alter table 表名 change 原名 新名 类型及约束;
修改字段(不重命名):alter table 表名 modify 列名 类型及约束;
删除字段:alter table 表名 drop 列名;

常用增删改查

基本查询

查看所有列:select * from 表名;

查看指定列:select 列1,列2,... from 表名;

新增

全列插入:insert into 表名 values(...); --需要给主键留下占位符,用0或null皆可。

部分列插入:insert into 表名(列1,...) values(值1,...);

插入多行全列数据:insert into 表名 values(...),(...)...;

插入多行部分列数据:insert into 表名(列1,...) values(值1,...),(值1,...)...;

更新

更新操作:update 表名 set 列1=值1,列2=值2... where 条件;

删除

删除操作(不推荐):delete from 表名 where 条件;

逻辑删除(推荐):update 字段名 set isvalid=0 where id=1; --设置删除字段,执行删除字段的操作即对该字段更新。

mysql查询详解

查询消除重复行:select distinct 列1,... from 表名;

条件查询

where条件查询:select * from 表名 where 条件;

where可以与比较运算符、逻辑运算符、模糊查询、范围查询、空判断搭配使用

比较运算符
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: != 或 <>

举个栗子:

select * from students where id > 1;
select * from students where id <= 2;
select * from students where name != '咸鱼';
select * from students where is_delete=0;
逻辑运算符
and
or
not

举个栗子:

select * from students where id > 3 and gender=0;
select * from students where id < 4 or is_delete=0;
select * from students where id not 4;
模糊查询
like
% 表示任意多个任意字符
_ 表示一个任意字符
rlike

举个栗子:

select * from students where name like '咸%';  --查询以咸字开头的内容
select * from students where name like '咸_';  --查询以咸字开头且后面只有一个字的内容
select * from students where name like '咸%' or name like '%鱼'; -- 查询以咸字开头或以鱼字结尾的内容
范围查询
in 表示在一个非连续的范围内
no in 表示不在一个非连续的范围内
between ... and ... 表示在一个连续的范围内
rlike 表示正则查询,可以使用正则表达式查询数据

举个栗子:

select * from students where id in(1,3,8);  -- 查询 id 在 1,3,8 当中的内容
select * from students where id not in(1,3,8);  -- 查询 id 不在 1,3,8 当中的内容
select * from students where id between 3 and 8; -- 查询 id 在3到8之间的内容
select * from students where name rlike "^咸"; -- 查询 name 是以咸字开头的内容
空判断
判断是否为空 is null

举个栗子:

select * from students where height is null;

以上几种预算符优先级为:

优先级由高到低的顺序为:小括号、not、比较运算符、逻辑运算符。

and比or先运算,如果同时出现并希望先算or,需要结合()使用。

排序

asc 升序
desc 降序

举个栗子:

select * from students  order by age desc,height desc; --显示所有的学生信息,先按照年龄从大到小排序,当年龄相同时 按照身高从高到矮排序

聚合函数

count(*)查询总数
max(列)表示求此列的最大值
min(列)表示求此列的最小值
sum(列)表示求此列的和
avg(列)表示求此列的平均值

举个栗子:

select count(*) from students;
select max(id) from students where gender=2;
select min(id) from students where is_delete=0;
select sum(age) from students where gender=1;
select sum(age)/count(*) from students where gender=1; --求平均年龄
select avg(id) from students where is_delete=0 and gender=2;

分组

group by 将查询结果按照1个或多个字段进行分组,字段值相同的为一组
group_concat 表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合

举个栗子:

select gender from students group by gender;  -- 将学生按照性别分组
输出结果:
+--------+
| gender |
+--------+
| 男      |
| 女      |
| 中性    |
| 保密    |
+--------+
select gender,group_concat(name) from students group by gender;
输出结果:
+--------+-----------------------------------------------------------+
| gender | group_concat(name)                                        |
+--------+-----------------------------------------------------------+
| 男     | 小彭,小刘,小周,小程,小郭                                 |
| 女     | 小明,小月,小蓉,小贤,小菲,小香,小杰                        |
| 中性   | 小金                                                       |
| 保密   | 小凤                                                       |
+--------+-----------------------------------------------------------+

分页

select * from 表名 limit start,count

举个栗子:

select * from students where gender=1 limit 0,3;  --查询前三行的数据

连接查询

语法:

select * from 表1 inner/left/right join 表2 on 表1.列 = 表2.列

其中:

inner join(内连接查询):查询的结果为两个表匹配到的数据
right join(右连接查询):查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充
left join(左连接查询):查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充

举个栗子:

select * from students inner join classes on students.cls_id = classes.id;
select * from students as s left join classes as c on s.cls_id = c.id;
select * from students as s right join classes as c on s.cls_id = c.id;

子查询

在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句。

子查询可以和 in 搭配使用

主查询 where 条件 in (子查询)

数据库的备份与恢复

数据库备份

mysqldump –uroot –p 数据库名 > 备份文件名.sql;

数据库恢复

mysql -uroot –p 新数据库名 < 备份文件名.sql

Python与mysql交互

Python与mysql交互流程

安装与导入

安装相关库:pip install pymysql

导入:from pymysql import *

创建connection对象

connection = connect(host, port, database, user, password, charset)

其中参数如下:

host:连接的mysql主机,如果本机是'localhost'
port:连接的mysql主机的端口,默认是3306
database:数据库的名称
user:连接的用户名
password:连接的密码
charset:通信采用的编码方式,推荐使用utf8

connection对象方法如下:

close()关闭连接
commit()提交
cursor()返回Cursor对象,用于执行sql语句并获得结果

获取cursor

cursor=connection.cursor()

其中常用方法:

close():关闭cursor
execute(operation [, parameters ]):执行语句,返回受影响的行数,主要用于执行insert、update、delete语句,也可以执行create、alter、drop等语句。
fetchone():执行查询语句时,获取查询结果集的第一个行数据,返回一个元组
fetchall():执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回

举个栗子:

from pymysql import *
def main():
  conn = connect(host='localhost',port=3306,database='xianyuplus',user='root',password='mysql',charset='utf8')
  cs1 = conn.cursor()
  count = cs1.execute('insert into xianyufans(name) values("666")')
  conn.commit()
  cs1.close()
  conn.close()
if __name__ == '__main__':
    main()

mysql视图

什么是视图?

视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据。

视图语句

创建视图:create view 视图名称 as select语句; --建议视图以v_开头
查看视图:show tables;
使用视图:select * from 视图名称;
删除视图:drop view 视图名称;

视图作用

  • 提高了重用性,就像一个函数
  • 对数据库重构,却不影响程序的运行
  • 提高了安全性能,可以对不同的用户
  • 让数据更加清晰

mysql事务

什么是事务?

事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

事务有什么特点?

  • 原子性,一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
  • 一致性,数据库总是从一个一致性的状态转换到另一个一致性的状态。
  • 隔离性,一个事务所做的修改在最终提交以前,对其他事务是不可见的。
  • 持久性,一旦事务提交,则其所做的修改会永久保存到数据库。

事务相关命令

开启事务:start transaction; 或者 begin;
提交事务:commit;
回滚事务:rollback;

mysql索引

什么是索引?

数据库索引好比是一本书前面的目录,能加快数据库的查询速度

索引相关命令

创建索引:create index 索引名称 on 表名(字段名称(长度)) --当指定索引的字段类型为字符串时,应填写长度
查看索引:show index from 表名;
删除索引:drop index 索引名称 on 表名;

注意事项

  • 建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。
  • 建立索引会占用磁盘空间。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
6天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
10天前
|
存储 程序员 Python
Python学习的自我理解和想法(2)
今日学习Python第二天,重点掌握字符串操作。内容涵盖字符串介绍、切片、长度统计、子串计数、大小写转换及查找位置等。通过B站黑马程序员课程跟随老师实践,非原创代码,旨在巩固基础知识与技能。
|
11天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
79 15
|
9天前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
6天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
4天前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
6天前
|
存储 索引 Python
Python学习的自我理解和想法(4)
今天是学习Python的第四天,主要学习了列表。列表是一种可变序列类型,可以存储任意类型的元素,支持索引和切片操作,并且有丰富的内置方法。主要内容包括列表的入门、关键要点、遍历、合并、判断元素是否存在、切片、添加和删除元素等。通过这些知识点,可以更好地理解和应用列表这一强大的数据结构。
|
6天前
|
索引 Python
Python学习的自我理解和想法(5)
这是我在B站千锋教育学习Python的第五天笔记,主要内容包括列表的操作,如排序(`sort()`、``sorted()``)、翻转(`reverse()`)、获取长度(`len()`)、最大最小值(`max()`、``min()``)、索引(`index()`)、嵌套列表和列表生成(`range`、列表生成式)。通过这些操作,可以更高效地处理数据。希望对大家有所帮助!
|
4天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。