Python之MySQL
一.概述
数据库(Database,简称DB)
数据库技术是计算机应用领域中非常重要的技术,它产生于20世纪60年代末,是数据管理的最新技术,也是软件技术的一个重要分支。
简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据。更简单的形象理解,数据库和我们生活中存放杂物的仓库性质一样,区别只是存放的东西不同。
数据库表(table)
数据表是关系数据库中一个非常重要的对象,是其它对象的基础,也是一系列二维数组的集合,用来存储、操作数据的逻辑结构。根据信息的分类情况。一个数据库中可能包含若干个数据表,每张表是由行和列组成,记录一条数据,数据表就增加一行,每一列是由字段名和字段数据集合组成,列被称之为字段,每一列还有自己的多个属性,例如是否允许为空、默认值、长度、类型、存储编码、注释等.例如

数据(data)
存储在表中的信息就叫做数据.
数据库系统有3个主要的组成部分
1.数据库(Database System):用于存储数据的地方。
2.数据库管理系统(Database Management System,DBMS):用户管理数据库的软件。
3.数据库应用程序(Database Application):为了提高数据库系统的处理能力所使用的管理数据库的软件补充。
数据库的发展史(五个阶段)
1.文件系统
数据库系统的萌芽阶段,通过文件来存取数据.
文件系统是数据库系统的萌芽阶段,出现在上世纪五六十年代,可以提供简单的数据存取功能,但无法提供完整、统一的数据管理功能,例如复杂查询等。所以在管理较少、较简单的数据或者只是用来存取简单数据,没有复杂操作的情况下,会使用文件系统
2.层次型数据库
数据库系统真正开始阶段,数据的存储形式类似树形结构,所以也叫树型数据库.
3.网状数据库
数据的存储形式类似网状结构.
从二十世纪六十年代开始,第一代数据库系统(层次模型数据库系统、网状模型数据库系统)相继问世,它们为统一管理和共享数据提供了有力的支撑
在这个阶段,网状模型数据库由于它的复杂、专用性,没有被广泛使用。而在层次模型数据库中,IBM公司的IMS(Information Management System,信息管理系统)层次模型数据库系统则得到了极大的发展,一度成为最大的数据库管理系统,拥有巨大的客户群
4.关系型数据库
二十世纪七十年代初,关系型数据库系统开始走上历史舞台,并一直保持着蓬勃的生命力.关系型数据库系统使用结构化查询语言(Structured Query Language,SQL)作为数据库定义语言DDL和数据库操作语言DML
5.面向对象数据库
把面向对象的方法和数据库技术结合起来,可以使数据库系统的分析、设计最大程度地与人们对客观世界的认识相一致,并且能够有效的为面向对象程序提供更好的数据库支撑
二.数据库的特点
三.系统数据库
- information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等
- mysql:核心数据库,里面包含用户、权限、关键字等信息。不可以删除
- performance_schema:mysql 5.5版本后添加的新库,主要收集系统性能参数,记录处理查询请求时发生的各种事件、锁等现象
- sys : mysql5.7版本新增加的库,通过这个库可以快速的了解系统的元数据信息,可以方便DBA发现数据库的很多信息,解决性能瓶颈都提供了巨大帮助
四.数据库操作
1、创建数据库
#语法:CREATE DATABASE db_name charset utf8;
2、查看数据库
#查看当前用户下所有数据库 show databases; #查看创建数据库的信息 show create database db_name; #查看数据库版本 select version(); #查看当前登录用户 select user(); #查看当前数据库里有哪些用户 select user,host from mysql.user; #删除数据库 drop database db_name; #选择数据库 use db_name;
3、数据库的用户权限
创建用户 create user '用户名'@'ip地址' identified by '密码'; 删除用户 drop user '用户名'@'ip地址'; 修改用户 rename user '用户名'@'ip地址';to '新用户名'@'ip地址' 查看用户权限 show grants for '用户名'@'ip地址'; 授权 grant 权限 on 数据库.表 to '用户名'@'ip地址'; 取消权限 revoke 权限 on 数据库.表 from '用户名'@'ip地址';授权用户所有权限GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123.com' WITH GRANT OPTION;
权限列表
4、忘记密码和修改数据库密码;
1:使用mysqladmin修改用户密码;

2:进入数据库直接设置用户名密码:(注意:下图为mysql5.7版本的)

mysql5.6版本修改密码为:
update mysql.user set password = password('新密码') where user= '用户名'
flush privileges; -- 刷新权限
3:忘记密码:
忘记密码:
1、首先关闭mysql服务:
service mysqld stop
2、跳过权限检查,启动mysql并进入mysql
mysqld_safe --skip-grant-tables&
mysql
3、进入mysql数据库并更新用户的密码:
use mysql;
update mysql.user set authentication_string=password('新密码') where user='root';
4、刷线权限
flush privileges;
5、停止后台的跳过权限检查任务,然后启动数据库;
kill %后台任务的pid
services mysqld start
五.数据表操作
1、表操作
创建表: CREATE TABLE 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] )ENGINE=innodb DEFAULT CHARSET utf8; 约束条件: not null :表示此列不能为空 auto_increment :表示自增长,默认每次增长+1 注意:自增长只能添加在主键或者唯一索引字段上 primary key :表示主键(唯一且不为空) engine =innodb :表示指定当前表的存储引擎 default charset utf8 :设置表的默认编码集
#查询表数据
select 字段(多个以","间隔) from 表名;
#查看表结构
desc 表名;
#查看创建表信息
show create table 表名;
删除表;
drop tables 表名;
示例

2、修改表结构:
#添加表字段
alter table 表名 add 字段名 类型 约束;
ps: after name 表示在name字段后添加字段 age.
#修改表字段
方式一: alter table student modify 字段 varchar(100) null;
方式二: alter table student change 旧字段 新字段 int not null default 0;
ps:二者区别:
change 可以改变字段名字和属性
modify只能改变字段的属性
#删除表字段 :
alter table student drop 字段名;
#更新表名称:
rename table 旧表名 to 新表名;

六.数据操作
1、数据操作语法
插入数据 #语法一: 按字段进行插入 insert into 表(字段1,字段2 ...) values (值1,值2 ...); #语法二:按字段顺序插入 insert into 表 values (值1,值2 ...); #语法三: 插入多条记录 insert into 表 values (值1,值2 ...) ,(值1,值2 ...) ,(值1,值2 ...); #语法四:插入查询结果 insert into 表(字段1,字段2 ...) select 字段1,字段2 ... from 表; 更新操作 #语法一: 更新整表数据 update 表 set 字段1= '值1', 字段2='值2' ... ; #语法二:更新符合条件字段3的数据 update 表 set 字段1= '值1', 字段2='值2' ... where 字段3 = 值3; 删除操作 #语法一:整表数据删除 delete from 表 ; #语法二:删除符合 where后条件的数据 delete from 表 where 字段1=值1;


2、单表查询
简单查询
#查询语法:
select [distinct]*(所有)|字段名,...字段名 from 表名;
条件查询
#查询格式:
select [distinct]*(所有)|字段名,...字段名 from 表名 [where 条件过滤]
区间查询
关键字 between 10 and 20 :表示 获得10 到 20 区间的内容
# 使用 between...and 进行区间 查询
select * from person where salary between 4000 and 8000;
ps: between...and 前后包含所指定的值
等价于 select * from person where salary >= 4000 and salary <= 8000;
集合查询
关键字: in, not null
#使用 in 集合(多个字段)查询
select * from person where age in(23,32,18);
等价于: select * from person where age =23 or age = 32 or age =18;
#使用 in 集合 排除指定值查询
select * from person where age not in(23,32,18);
模糊查询
关键字 like , not like
%: 任意多个字符
_ : 只能是单个字符
排序查询
关键字: ORDER BY 字段1 DESC, 字段2 ASC
#排序查询格式:
select 字段|* from 表名 [where 条件过滤] [order by 字段[ASC] [DESC]]
升序:ASC 默认为升序
降序:DESC
PS:排序order by 要写在select语句末尾
聚合查询
聚合: 将分散的聚集到一起.
聚合函数: 对列进行操作,返回的结果是一个单一的值,除了 COUNT 以外,都会忽略空值
COUNT:统计指定列不为NULL的记录行数;
SUM:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
MAX:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
AVG:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
#格式:
select 聚合函数(字段) from 表名;
分组查询
分组的含义: 将一些具有相同特征的数据 进行归类.比如:性别,部门,岗位等等
怎么区分什么时候需要分组呢?
套路: 遇到 "每" 字,一般需要进行分组操作.
分组查询格式:
select 被分组的字段 from 表名 group by 分组字段 [having 条件字段]
ps: 分组查询可以与 聚合函数 组合使用.
where 与 having区别:
#执行优先级从高到低:where > group by > having
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
分页查询:
好处:限制查询数据条数,提高查询效率
正则查询
MySQL中使用 REGEXP 操作符来进行正则表达式匹配。
# ^ 匹配 name 名称 以 "e" 开头的数据
select * from person where name REGEXP '^e';
# $ 匹配 name 名称 以 "n" 结尾的数据
select * from person where name REGEXP 'n$';
# . 匹配 name 名称 第二位后包含"x"的人员 "."表示任意字符
select * from person where name REGEXP '.x';
# [abci] 匹配 name 名称中含有指定集合内容的人员
select * from person where name REGEXP '[abci]';
# [^alex] 匹配 不符合集合中条件的内容 , ^表示取反
select * from person where name REGEXP '[^alex]';
#注意1:^只有在[]内才是取反的意思,在别的地方都是表示开始处匹配
#注意2 : 简单理解 name REGEXP '[^alex]' 等价于 name != 'alex'
# 'a|x' 匹配 条件中的任意值
select * from person where name REGEXP 'a|x';
#查询以w开头以i结尾的数据
select * from person where name regexp '^w.*i$';
#注意:^w 表示w开头, .*表示中间可以有任意多个字符, i$表示以 i结尾
| 模式 | 描述 |
|---|---|
| ^ | 匹配输入字符串的开始位置。 |
| $ | 匹配输入字符串的结束位置。 |
| . | 匹配任何字符(包括回车和新行) |
| [...] | 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 |
| [^...] | 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 |
| p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 |




3、多表查询
多联合查询
select 字段1,字段2... from 表1,表2... [where 条件]
注意: 如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为 笛卡尔乘积
多表连接查询
#多表连接查询语法(重点)
SELECT 字段列表
FROM 表1 INNER|LEFT|RIGHT JOIN 表2
ON 表1.字段 = 表2.字段;
内连接查询
select * from person inner join dept on person.did =dept.did;
左外连接查询
#查询人员和部门所有信息
select * from person left join dept on person.did =dept.did;
右外链接查询
#查询人员和部门所有信息
select * from person right join dept on person.did =dept.did;
全连接查询
全连接查询:是在内连接的基础上增加 左右两边没有显示的数据
注意: mysql并不支持全连接 full JOIN 关键字
注意: 但是mysql 提供了 UNION 关键字.使用 UNION 可以间接实现 full JOIN 功能
#查询人员和部门的所有数据
SELECT * FROM person LEFT JOIN dept ON person.did = dept.did
UNION
SELECT * FROM person RIGHT JOIN dept ON person.did = dept.did;
