python mysql交互

前言

    python一些涉及到内核或者CPU操作的学习先告一段落,今天来记录一下学习mysql.
    参考链接:MySQL菜鸟教程;python菜鸟教程;

一.MySQL简介

    MySQL是最流行的关系型数据库管理系统,在web应用方面mysql是最好的RDBMS应用软件之一.

1.什么是数据库?

  • 数据库(DataBase)是按照数据结构来组织,存储和管理数据的仓库;
  • 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据;
  • 我们也可以将数据存储在文件中,但是在文件中读写的速度相对较慢;
  • 所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大量数据.所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中数据;

RDBMS即关系型数据库管理系统(Relational Database Management System)的特点:

  • 数据以表格的形式出现;
  • 每行为各种记录名称;
  • 每列为记录名称所对应的数据域;
  • 许多的行和列组成一张表单;
  • 若干的表单组成Database.

2.RDBMS术语

    在我们开始学习mysql数据库前,先来了解一下RDBMS的一些术语:

  • 数据库:数据库是一些关联表的集合.
  • 数据表:表是数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格.
  • :一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据.
  • :一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性.
  • 主键:主键是唯一的,一个数据表中只能包含一个主键,你可以使用主键来查询数据.
  • 外键:外键用于关联两个表.
  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引.
  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
  • 表头(header): 每一列的名称;
  • 列(col): 具有相同数据类型的数据的集合;
  • 行(row): 每一行用来描述某条记录的具体信息;
  • 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
  • 键(key): 键的值在当前列中具有唯一性。

3.MySQL数据库

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

  • MySQL 是开源的,所以你不需要支付额外的费用。
  • MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL 使用标准的 SQL 数据语言形式。
  • MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
  • MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
  • MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
  • MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。

4.ubuntu安装MySQL

    我是按照以下步骤来安装的,这里只是作为一个参考.
首先在终端输入:

sudo apt-get update

然后出现了以下错误:

E:无法获得锁 /var/lib/apt/lists/lock-open(11.资源暂时不可用)
E:无法对目录 /var/lib/apt/lists 加锁

    出现这个的原因是因为上一次更新源的时候非常规中断导致的,解决方案如下:

sudo rm/var/lib/apt/;ists/lock

    然后再次执行:(主要是为了更新apt-get)

sudo apt-get update

    执行这条命令后发现更新失败,究其原因,发现是镜像源的问题,于是将apt-get镜像源切换为国内镜像源,具体步骤可参考:
【Ubuntu】修改Ubuntu的apt-get源为国内镜像源的方法
    接下来就开始安装mysql:

sudo agt-get install mysql-server

    这时候会设置密码,这个密码就可以自己设置了,然后等待安装完成.完成后,通过以下命令查看mysql是否启动:

ps aux|grep mysql

    mysql启动完成后,输入:

mysql -u root -p

    输入密码,进入数据库.其中,-u表示选择登录的用户名,-p表示登录的密码.

二.MySQL基本操作

1.创建数据库

    使用create命令来创建数据库:

create database DatabaseName;

2.删除数据库

    使用drop命令来删除数据库(删除数据库时务必要谨慎):

drop database DatabaseName;

3.选择数据库

    使用use命令来选择数据库(删除数据库时务必要谨慎):

use DatabaseName;

    执行以上命令后,就成功选择了你要选择的数据库.

4.MySQL数据类型

    MySQL中定义数据字段的类型对你数据库的优化是非常重要的;
    MySQL支持多种类型,大致可以分为三类:数值,日期/时间和字符串(字符)类型.
(1)数值类型
    下面的表显示了需要的每个整数类型的存储和范围。

类型大小范围(有符号)范围(无符号)用途
TINYINT1 字节(-128,127)(0,255)小整数值
SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 字节(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 字节(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值
DOUBLE8 字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值
DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值

(2)日期和时间类型

类型大小范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

(3)字符串类型

类型大小用途
CHAR0-255字节定长字符串
VARCHAR0-65535 字节变长字符串
TINYBLOB0-255字节不超过 255 个字符的二进制字符串
TINYTEXT0-255字节短文本字符串
BLOB0-65 535字节二进制形式的长文本数据
TEXT0-65 535字节长文本数据
MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215字节中等长度文本数据
LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据
LONGTEXT0-4 294 967 295字节极大文本数据

注:CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

5.MySQL创建数据表

    创建MySQL数据表时需要以下信息:

  • 表名;
  • 表字段名;
  • 定义每个表字段.
        创建MySQL数据表的SQL通用语法:
create table table_name(column_name column_type);

    比如我们创建一个学生数据表,包括学生姓名,学号,班级:

CREATE TABLE IF NOT EXISTS `student_table`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `student_name` VARCHAR(100) NOT NULL,
   `student_id` VARCHAR(100) NOT NULL,
   `student_class` VARCHAR(100) NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

查看表结构:

desc student_table;

结果:

mysql> desc student_table;
+---------------+------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra          |
+---------------+------------------+------+-----+---------+----------------+
| id            | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| student_name  | varchar(100)     | NO   |     | NULL    |                |
| student_id    | varchar(100)     | NO   |     | NULL    |                |
| student_class | varchar(100)     | NO   |     | NULL    |                |
+---------------+------------------+------+-----+---------+----------------+

    创建数据表实例解析:

  • 如果你不想字段为NULL,可以设置字段的属性为NOT NULL,在操作数据库的时,如果输入该字段的数据为NULL,就会报错;
  • AUTO_INCREMENT 定义列为自增的属性,一般用于主键,数值会自动加1;
  • PRIMARY KEY 关键字用于定义列为主键,可以使用多列来定义主键,列间以逗号分割;
  • ENGINE 设置存储引擎,CHARSET设置编码.

6.删除数据表

    MySQL中删除数据表是非常容易操作的,但是在进行删除数据表的时候要非常小心,因为执行删除命令后所有的数据都会消失.
    语法:

DROP TABLE table_name;

7.插入数据

    MySQL使用INSERT INTO来插入数据;
    语法:

insert into table_name(field1,field2,...) 
						values
					   (value1,value2,...)

    例如,在我们上面创建的学生数据表中插入数据:

insert into student_table (student_name,student_id,student_class)
values
('ZhangSan','130624','2');

insert into student_table (student_name,student_id,student_class)
values
('LiSi','130625','2');

insert into student_table (student_name,student_id,student_class)
values
('WangWu','130626','2');

insert into student_table (student_name,student_id,student_class)
values
('ZhaoSi','130622','2');

insert into student_table (student_name,student_id,student_class)
values
('ZhaoYu','130621','2');

8.查询数据

    MySQL使用select来插入数据;

    语法:

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]

    举例说明:
(1)查询数据表中所有的数据:

select * from student_table;

结果:

+----+--------------+------------+---------------+
| id | student_name | student_id | student_class |
+----+--------------+------------+---------------+
|  1 | ZhangSan     | 130624     | 2             |
|  2 | LiSi         | 130625     | 2             |
|  3 | WangWu       | 130626     | 2             |
|  4 | ZhaoSi       | 130621     | 2             |
|  5 | ZhaoYu       | 130621     | 2             |
|  6 | ZhaoSi       | 130622     | 2             |
+----+--------------+------------+---------------+
6 rows in set (0.00 sec)

(2)查询数据表中student_name为"ZhangSan"的所有信息:

select * from student_table where student_name = 'ZhangSan';

结果:

+----+--------------+------------+---------------+
| id | student_name | student_id | student_class |
+----+--------------+------------+---------------+
|  1 | ZhangSan     | 130624     | 2             |
+----+--------------+------------+---------------+
1 row in set (0.01 sec)

(3)查询ZhangSan的学号以及班级:

select student_id,student_class from student_table where student_name='ZhangSan';

结果:

+------------+---------------+
| student_id | student_class |
+------------+---------------+
| 130624     | 2             |
+------------+---------------+
1 row in set (0.00 sec)

注意以下几点:

  • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • SELECT 命令可以读取一条或者多条记录。
  • 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 你可以使用 WHERE 语句来包含任何条件。
  • 你可以使用 LIMIT 属性来设定返回的记录数。
  • 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。

9.where语句

    MySQL中where语句是用来限定条件的,这个在上面的查询中已经提到,这里就不再重复.

10.更新数据

    如果我们需要修改或更新数据,就需要用到更新的语法了.
    语法:

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]

    例如,我们的原始数据为:

+----+--------------+------------+---------------+
| id | student_name | student_id | student_class |
+----+--------------+------------+---------------+
|  1 | ZhangSan     | 130624     | 2             |
|  2 | LiSi         | 130625     | 2             |
|  3 | WangWu       | 130626     | 2             |
|  4 | ZhaoSi       | 130621     | 2             |
|  5 | ZhaoYu       | 130621     | 2             |
|  6 | ZhaoSi       | 130622     | 2             |
+----+--------------+------------+---------------+

    我们将LiSi的student_id改成130628:

update student_table set student_id='130628' where student_name='LiSi';

更新后的数据:

+----+--------------+------------+---------------+
| id | student_name | student_id | student_class |
+----+--------------+------------+---------------+
|  1 | ZhangSan     | 130624     | 2             |
|  2 | LiSi         | 130628     | 2             |
|  3 | WangWu       | 130626     | 2             |
|  4 | ZhaoSi       | 130621     | 2             |
|  5 | ZhaoYu       | 130621     | 2             |
|  6 | ZhaoSi       | 130622     | 2             |
+----+--------------+------------+---------------+

11.删除数据

    前面我们对于数据的增,改,查都提到了,接下来来说删.
    MySQL中删除数据为delete.
    语法:

DELETE FROM table_name [WHERE Clause]

如果没有指定where子句,则table_name中的数据都会被删除.

    在我们建立的student数据表中,我们发现有两个ZhaoSi,接下来我们就把学号为130621的删除:

delete from student_table where student_name='ZhaoSi' and student_id='130621';

新的数据:

+----+--------------+------------+---------------+
| id | student_name | student_id | student_class |
+----+--------------+------------+---------------+
|  1 | ZhangSan     | 130624     | 2             |
|  2 | LiSi         | 130628     | 2             |
|  3 | WangWu       | 130626     | 2             |
|  5 | ZhaoYu       | 130621     | 2             |
|  6 | ZhaoSi       | 130622     | 2             |
+----+--------------+------------+---------------+

12.like子句

    我们知道,在MySQL中使用select命令来查询数据,同时可以使用where子句来限定查询的条件,例如"select * from student_table where student_name=‘ZhangSan’".where子句中使用等号’=‘来,而且where子句是用来进行精确查询的,但有时候我们会进行模糊查询,比如说我们知道某一数据的名字里包含了’今天’,但是我们不知道它准确的名字是什么,这时候就用到了like子句.
    语法:

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'

例如,在我们的数据表中,我们想查询所有名字中带"Zh"的所有人的信息:

select * from student_table where student_name like '%Zh%';

查询结果:

+----+--------------+------------+---------------+
| id | student_name | student_id | student_class |
+----+--------------+------------+---------------+
|  1 | ZhangSan     | 130624     | 2             |
|  5 | ZhaoYu       | 130621     | 2             |
|  6 | ZhaoSi       | 130622     | 2             |
+----+--------------+------------+---------------+
3 rows in set (0.01 sec)

13.排序

    MySQL排序语法:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]

    举例.在我们的数据表中查询学生数据并按学号进行排序

select * from student_table order by student_id;

(这是升序排序)结果:

+----+--------------+------------+---------------+
| id | student_name | student_id | student_class |
+----+--------------+------------+---------------+
|  5 | ZhaoYu       | 130621     | 2             |
|  6 | ZhaoSi       | 130622     | 2             |
|  1 | ZhangSan     | 130624     | 2             |
|  3 | WangWu       | 130626     | 2             |
|  2 | LiSi         | 130628     | 2             |
+----+--------------+------------+---------------+
select * from student_table order by student_id DESC;

(这是降序排序)结果:

+----+--------------+------------+---------------+
| id | student_name | student_id | student_class |
+----+--------------+------------+---------------+
|  2 | LiSi         | 130628     | 2             |
|  3 | WangWu       | 130626     | 2             |
|  1 | ZhangSan     | 130624     | 2             |
|  6 | ZhaoSi       | 130622     | 2             |
|  5 | ZhaoYu       | 130621     | 2             |
+----+--------------+------------+---------------+
5 rows in set (0.00 sec)

注:ASC为升序排序,DESC为降序排序,默认为ASC.

14.MySQL UNION

    UNION操作符用于连接两个以上的SELECT语句的结果组合到一个结果集合中,多个select语句会删除重复的数据.
    语法:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

参数介绍:

  • expression1, expression2, … expression_n: 要检索的列。
  • tables: 要检索的数据表。
  • WHERE conditions: 可选, 检索条件。
  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
  • ALL: 可选,返回所有结果集,包含重复数据。

15.分组 GROUP BY

    对数据的基本操作除了排序还有分组,MySQL中的分组语句为:GROUP BY.
    语法:

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

对于function(),我们可以使用COUNT,SUM,AVG等函数.

    比如,我们对我们创建的数据表进行一个简单的分组测试:

+--------------+---------------------+
| student_name | count(student_name) |
+--------------+---------------------+
| LiSi         |                   1 |
| WangWu       |                   1 |
| ZhangSan     |                   1 |
| ZhaoSi       |                   1 |
| ZhaoYu       |                   1 |
+--------------+---------------------+
5 rows in set (0.00 sec)

三.python操作mysql

    我们使用pymysql来用python操作mysql.
    下载PyMysql:

pip install pymysql

1.连接数据库

import pymysql

try:
    db = pymysql.connect(
        host='localhost',
        user='username',
        password='123456',
        database='student'
    )

    # 使用cursor()方法创建一个游标对象cursor.
    cursor = db.cursor()
    print('数据库连接成功')

except Exception as e:
    print('数据库连接失败---',e)

2.实现简单的增删改查

import pymysql

try:
    mysqldb = pymysql.connect(
        host='localhost',
        user='username',
        password='123456',
        database='student'
    )

    # 使用cursor()方法创建一个游标对象cursor.
    cursor = mysqldb.cursor()
    print('数据库连接成功')

except Exception as e:
    print('数据库连接失败---',e)


def insert_data():
    try:
        sql = "insert into student_table (student_name,student_id,student_class) values ('fan','130633','2')"
        cursor.execute(sql)
        mysqldb.commit()
        print('数据插入成功')
    except Exception as e:
        print('数据插入失败---',e)

def select_data():
    try:
        sql = "select * from student_table where student_name = %s"
        val = ('ZhangSan',)
        cursor.execute(sql,val)
        data = cursor.fetchall()
        print(data)
    except Exception as e:
        print('数据查询失败---',e)

def update_data():
    try:
        sql = "update student_table set student_id=%s where student_name=%s"
        val = ('130000','ZhangSan')
        cursor.execute(sql,val)
        mysqldb.commit()
        print('数据更新成功')
    except Exception as e:
        print('数据更新失败---',e)


def delete_data():
    try:
        sql = "delete from student_table where student_name = %s"
        val = ('ZhangSan',)
        cursor.execute(sql, val)
        mysqldb.commit()
        print('数据删除成功')
    except Exception as e:
        print('数据删除失败---',e)

if __name__ == '__main__':
    print('start:')
    insert_data()
    select_data()
    update_data()
    delete_data()

执行结果:

数据库连接成功
start:
数据插入成功
((1, 'ZhangSan', '130000', '2'),)
数据更新成功
数据删除成功
写在最后

    本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值