文章目录
前言
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)数值类型
下面的表显示了需要的每个整数类型的存储和范围。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节 | (-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) | 单精度 浮点数值 |
DOUBLE | 8 字节 | (-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)日期和时间类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
(3)字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-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'),)
数据更新成功
数据删除成功
写在最后
本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.