MySQL
1.环境变量
-
python ----> python.exe
-
在任何目录下都能找到python.exe文件,才能在任意位置输入python命令启动python解释器
2.mysql安装、启动、关闭
- mysql install 安装mysql服务 mysql服务就被注册到操作系统
- net start mysql 启动mysql服务
- net stop mysql
- mysql -uroot -proot123 -h192.168.14.12 启动客户端连接server
3.mysql命令
- select user(); 查看当前登录的用户
- set password = password('123');给当前用户设置密码
- create user 'guest'@'192.168.14.%' identified by '123';创建一个其他用户
- grant 权限类型 给一个用户授权
- grant all on 库.* to 'guest'@'192.168.14.%' identified by '123' ;
- grant select;
- grant select,insert;
- flush privileges; 刷新使授权立即生效
- show databases;查看所有数据库
- create database 数据库名; 创建一个数据库
- use 数据库名;切换到数据库
- drop database 数据库名;删除数据库
- show tables;查看库下的表
- create table 表名(字段名 数据类型(长度),);
- desc 表名; 查看表结构 describe 表名;
- 操作数据(增删改查)DML语句
- insert into 表名 values(一行数据),(一行数据); 插入数据
- select * from 表名;查询数据
- update 表名 set 字段名=值,字段名=值 where 条件; 修改数据
- delete from 表名 where 条件;删除数据
4.存储引擎—存储数据的方式
-
数据都是存储在硬盘上,即数据持久化存储
-
InnoDB存储引擎:数据和索引存储在一起(2个文件)——数据索引/表结构
- 数据持久化
- 支持事务:为了保证数据的完整性,将多个操作变成原子性操作(数据安全)
- 支持行级锁:修改的行少的时候使用(频繁修改数据)
- 支持表级锁:批量修改多行时使用(大量数据修改)
- 支持外键:约束两张表的关联字段、不能随意的添加删除(降低数据增删改的出错率)
-
MyISAM存储引擎:数据和索引不存储在一起(3个文件)——数据/索引/表结构
-
-
数据存储在内存中,即数据在断电后消失
- MEMORY存储引擎(1个文件)——表结构
-
存储引擎相关sql语句
- 查看当前默认存储引擎 show variables like '%engine%';
- 查看当前数据库支持的存储引擎show engines;
- 指定create table engine1(id int,name char(18)) engine = Myisam;
5.表
-
创建表
create table 表名(
字段名 类型[(宽度) 约束条件]
id int,
name char(18),
);
-
删除表
drop table 表名;
-
写入数据
insert into 表 (字段1,字段2) values(值1,值2)
-
查看表结构
-
desc 表名 ;
能查看有多少个字段、类型、长度,看不到表编码、引擎、具体的约束信息只能看到一部分
-
show create table 表名;
能查看字段、类型、长度、编码
、引擎、约束
-
6.数据类型
6.1数字
-
unsigned 无符号
-
tinyint-1字节
-
smallint-2字节
-
mediumint-3字节
-
int、integer-4字节 不约束长度、最多表示10位
-
bigint-8字节
-
float-4字节,单精度 float(6,2)-->保留两位小数
-
double-8字节,双精度
-
decimal-默认10位整数,可表示到小数点后32位
6.2日期
-
DATE(3字节)
YYYY-MM-DD
-
TIME(3字节)
HH:MM:SS
-
YEAR(1字节)
YYYY
-
DATETIME(8字节)
YYYY-MM-DD HH:MM:SS
-
TIMESTAMP 时间戳
-
约束:NOT NULL、DEFAULT CURRENT_TIMESTAMP、ON UPDATE CURRENT_TIMESTAMP
6.3字符串
- char
- 最多只能表示255个字符
- 定长存储、浪费空间、节省时间
- 身份证号、手机号码、username、password
- varchar
- 最多能表示65535个字符
- 变长存储、节省空间、但存取速度慢
- 评论、朋友圈、微博
6.4enum/set
- enum单选
- gender enum('male','female')
- set多选
- hobby set(’抽烟‘,'喝酒','烫头')
7.完整性约束
-
无符号 int unsigned
-
不为空 NOT NULL
-
默认值 default
-
值不重复 unique (除NULL)
- 联合唯一 unique (字段1,字段2)
-
自增 auto_increment
-
主键—非空+唯一约束
- primary key(字段1,字段2)
-
外键
- foreign key (字段) references 外表(外表字段)
- 外表字段必须至少是“唯一”的
8.修改表结构
-
修改表名
alter table 表名 rename 新表名;
-
增加字段
alter table 表名 add 字段名 数据类型 [完整性约束条件];
-
删除字段
alter table 表名 drop 字段名;
-
修改字段
alter table 表名 modify 字段名 数据类型 [完整性约束条件];
alter table 表名 change 旧字段名 新字段名 数据类型 [完整性约束条件];
9.多表结构的创建
表与表之间的关系
- 一对多 (班级、学生)foreign key
- 多对多 (作者、书籍)foreign key +一张新表
- 一对一 foreign key+unique
10.数据的删除
-
清空表
delete from 表:会清空表,但不会清空自增字段的offset(偏移量)值
truncate table 表:会清空表和自增字段的偏移量
-
删除某一条数据
delete from 表 where 条件;
11.单表数据查询
-
selcect
- select * from 表;
- select 字段... from 表;
- select 字段 as 新名 from 表;
- select 字段 新名 from 表;
- select distinct 字段 from 表;
- select concat(字段,':',字段) from 表;连接字符串
- select concat_ws('|','pork','eat'); 第一个参数为分隔符
- CASE 语句 CASE WHEN...THEN ELSE...THEN 相当于if判断句
-
where
-
比较运算符 > < >= <= <> !=
-
范围
- between ...and ...
- in
-
模糊匹配
- like %通配符 _通配符
- regexp ^ $
-
逻辑运算
not、and、or
-
不能用select字段的重命名
-
-
group by
- 聚合函数
- count()
- max()
- min()
- sum()
- avg()
- group_concat()
- 聚合函数
-
having过滤语句
- 在having条件中可以使用聚合函数,在where中不行
- 适合筛选符合条件的某一组数据
- 先分组再过滤
-
order by
- 默认是升序 asc
- 降序 desc
-
limit m,n
- 从m+1想开始,取n项
- m不写,默认为0
- limit n offset m
12.多表查询
-
表与表之间的连接方式
-
内连接
-
select * from 表1,表2 where 条件
-
select * from 表1 inner join 表2 on 条件
-
select * from 表1as 别名 inner join 表2 as 别名 on 条件
-
-
外连接
- 左外连接left join...on...
- 右外连接right join...on...
- 全外连接full join用左外连接union右外连接实现
-
-
子查询
13.索引
-
b+树
- 平衡树(btree--balance tree)能够让查找某一个值经历的查找速度尽量平衡
- 分支结点不存储数据—让树的高度尽量矮,让查找一个数据的效率尽量的稳定
- 在所有叶子结点之间加入双向的地址链接—查找非常快
-
mysql中存储数据的两种方式
- 聚集(簇)索引—全表数据都存储在叶子结点上、Innodb 必且仅有一个主键
- 非聚集(簇)索引—辅助索引、叶子结点不存放具体的整行数据、只存储这一行的主键的值
-
索引的创建与删除
- 创建主键primary key 聚集索引+非空+唯一
- 创建唯一约束unique 辅助索引+唯一
- 添加普通索引
- create index 索引名 on 表名(字段)
- drop index 索引名 on 表名
-
正确使用索引
-
查询的字段不是索引字段
-
对哪一个字段创建了索引,就用哪个字段做条件查询
-
对区分度大的列创建索引,1/10以下的重复率比较适合创建索引
-
范围越大越慢,like 'a%'快
-
条件列不能参与计算、使用函数
-
and和or
- and连接,一列含有索引都可加快查找速度
- or连接,都含有索引才可以加快查找速度
-
联合索引:最左前缀原则(必须带着最左边的列做条件,若出现范围,整条索引失效)
-
条件中的数据类型和实际字段的类型必须一致
-
select字段中应该包含order by中的字段
-
-
覆盖索引:查询过程中不需要回表
-
索引合并:分别创建的两个索引在某一次查询中临时合并成一条索引
-
执行计划:explain select语句,能够查看sql语句中有没有按照预期执行,可以查看索引的使用情况、type等级
-
慢查询优化
- 从sql的角度优化
- 把每一句话单独执行,找到效率低的表,优化这句sql
- 适当创建索引,帮助查询
- 了解业务场景、适当创建索引、帮助查询
- 尽量用连表代替子查询
- 确认命中索引的情况
- 考虑修改表结构
- 拆表
- 把固定的字段往前调整
- 使用执行计划,观察sql的type通过以上调整是否提高
- 从sql的角度优化
-
mysql的慢日志
- 在mysql的配置中开启并设置一下
- 在超过设定时间之后,这条sql总是会被记录下来
- 对被记录的sql进行定期优化
14.正确的使用mysql数据库
- 从库的角度
- 搭建集群
- 读写分离
- 分库
- 从表的角度
- 合理安排表与表之间的关系
- 把固定长度的字段放在前面
- 尽量使用char而不是varchar
- 从操作数据的角度
- 尽量在where字段就约束数值到一个比较小的范围
- 尽量使用连表查询
- 删除数据和修改数据的时候尽量使用主键
- 合理的创建和使用索引
- 创建索引
- 选择区分度比较大的列
- 尽量选择短的字段创建索引
- 不要创建不必要的索引,及时删除不用的索引
- 使用索引
- 创建索引
15.pymysql模块
-
python操作mysql数据库
- 连接数据库
- 获取游标
- 执行sql(增删改查)
- 若修改,则需要进行提交
- 关闭游标、关闭连接
import pymysql conn = pymysql.connect(host="127.0.0.1", user="root", password="root123", database="call") cur = conn.cursor() #cursor游标 # cur = conn.cursor(cursor=pymysql.cursors.DictCursor) #查询返回字典 #查询 try: cur.execute('select * from callinfo;') # ret1 = cur.fetchone()#获取一条结果 # print(ret1) # ret2 = cur.fetchmany(3)#获取多条结果 # print(ret2) # ret3 = cur.fetchall()#获取全部结果 # print(ret3) # print(cur.rowcount) for i in range(cur.rowcount): ret = cur.fetchone() print(ret) except pymysql.err.ProgrammingError as e: print(e) #增加 删除 修改 # try: # cur.execute('insert into callinfo values("7","小明","上海市","18090820823","780280","19091309@qq.com","8021818139")') # cur.execute('update callinfo set cname="小南" where cid=2') # cur.execute('delete from callinfo where cname="小明"') # conn.commit() # except Exception as e: # print(e) # conn.rollback() cur.close() conn.close() -
sql注入
- 传参数,通过execute方法
- execute(sql语句)
结合数据库、python写登录:
import pymysql user = input("username:") pwd = input("password:") conn = pymysql.connect(host="127.0.0.1", user="root", password="root123", database="homework") # sql = "select * from info where user='%s' and password='%s';"%(user,pwd) sql = "select * from info where user=%s and password=%s;" print(sql) cur = conn.cursor() cur.execute(sql,(user,pwd)) print(cur.fetchone()) #sql注入 #select * from userinfo where user="biu"-- " and password="123";
16.事务
- 开启事务begin
- 添加行级锁select * from 表 where 条件 for update
- 完成更新
- 提交事务commit
17.数据的备份和恢复
- 单库备份—在cmd命令行直接执行
- mysqldump -uroot -proot123 -h127.0.0.1 数据库 >路径
- 多库备份
- mysqldump -uroot -proot123 --databases 数据库1 数据库2...>路径
- 备份所有库
- mysqldump -uroot -proot123 --all-databases >路径
- 恢复数据—在mysql中执行命令
- 切换到一个要备份的数据库中
- source 路径

浙公网安备 33010602011771号