创建用户,库,表
创建用户:grant 操作权限 on 库名.表名 to '用户名@ip地址' identified by '密码';
查询用户:select user from mysql.user;
删除用户: delete from mysql.user where user='待删除的user';
新建库: create database 库名;
查询库: show databases;
切换到库: use 库名;
新建表: create table 表名(id int,name char(8));
查表:show tables;
查看表结构: desc 表名;
改表名等: alter table t1 change name name1 char(12);
删除表:drop table t1;
操作内容:
增:insert into t1 values(1,'alex'),(2,'wusir');
查:select * from t1;
改:update t1 set name='sb' where id=1;
删:delete from where id=1;
表的增删改
1.存储引擎:
innodb 数据存储在硬盘 存两个文件 支持事务、行级锁、外键
myisam 数据存储在硬盘 存三个文件 不支持事务、行级锁、外键
memory 数据存储在内存 重启server数据丢失
2. 常用的数据类型:int、float、datetime、char、varchar、enum、set
char和varchar的区别:
char:定长字符串、表示的长度小、浪费储存空间、读写速度快。
varchar:变长字符串、表示的长度大、节省储存空间、读写速度慢。
3. create table 表名(
id int unique auto_increment, # 唯一主键
id int primary key, # 设置主键
name char(12),
password char(32)
unique(name,password) # 联合唯一
primary key(name,password) # 设置联合主键
sex enum('male','female') not null default 'male' # 不为空和默认
foreign key(id) references 外表(字段名) # 设置外键
on update cascade on delete cascade # 级联更新,级联删除
)
# 创建表
create table 表名(
字段名 类型(长度约束) 其他约束,
字段名 类型(长度约束) 其他约束,
字段名 类型(长度约束) 其他约束);
# 删除表:
drop table 表名
# 修改表
alter table 表名 rename 新表名;
add 新字段 类型(长度约束) 其他约束 first;
drop 字段 ;
modify 原字段名 新类型(新长度) 新约束 after 某字段;
change 原字段名 新字段名 新类型(新长度) 新约束;
# 查看表结构
desc 表名 == describe 表名
show create table 表名; 查看详细表结构,存储引擎 编码 更复杂的约束条件
单表查询
增加数据:insert into 表名 values(...)
删除数据:delete from 表名 where id=3
更新数据:update 表名 set 字段名=新的值 where age>20
表的查询:
单表查询:
select 字段名 from 表名
select * from 表
去重 distinct
select distince 某个字段 from 表 # 对某个字段去重
对筛选的结果进行四则运算
select 字段*12 from 表
在显示查询结果的时候临时重命名
select 字段名 as 新名字 from 表;
select 字段名 新名字 from 表;
concat函数
concat('你想拼接的内容',字段名,'你想拼的其他内容','字段名')
concat_ws('连接符号',字段1,字段2,....)
case语句
SELECT
(case
when emp_name = 'jingliyang' then
emp_name
when emp_name = 'alex' then
concat(emp_name,'_bigsb')
else
concat(emp_name,'_sb')
end) as new_name
FROM employee;
where条件
select 字段 from 表 where 条件
比较运算符 > < >= <= <> !=
范围(范围更大) between a and b 查询a,b之间的所有内容
范围(范围更精准) in (a,b,c) 查询值为a或者b或者c的所有内容
like
select * from 表 where emp_name like '金%'(%是一个通配符,表示任意长度的任意內容)
select * from 表 where emp_name like '金三_'(_也是一个通配符,表示一个长度的任意内容)
逻辑运算符 and or not
身份运算符 is null/ is not null
正则匹配
所有人的身份证号,匹配所有身份证号是15位的居民 ^\d{15}$
select 字段 from 表 where age regexp '^\d{15}$';
group by(分组)
根据分组的字段自动的做去重,其他重复的项目都不会在结果中显示
但是可以使用count来计算每个组中的项,也可以使用group_concat来查看组内的名字
having
总是和group by 连用,where中不能出现聚合函数,所以和聚合函数有关的条件筛选也只能用having
对分组进行条件过滤
order by
默认从小到大排序 升序 asc
从大到小排序 降序 desc
limit
取前n个或者web开发中做分页功能
显示前n条 limit n
从第m条开始,显示n条 limit m,n
从第m+1条开始,显示n条 limit n offset m
多表查询(多练习)
内连接
select * from employee inner join department on employee.dep_id=department.id;
左连接
select * from employee left join department on employee.dep_id=department.id;
右连接
select * from employee right join department on employee.dep_id=department.id;
全外连接
select * from employee left join department on employee.dep_id=department.id
-> union
-> select * from employee right join department on employee.dep_id=department.id;
索引及pymysql
# 索引原理
# b+树
# 1.b 是balance 表示的是这个树最终是能够达到平衡的
# 2.数据不是平铺直叙的存储在硬盘山
# 3.影响查询速度的最重要的因素是树的高度
# 4.我们要做的事情,或者我们想要加速查询 降低树的高度
# 1.让索引的字段尽量的短
# 2.让索引的字段区分度高
# 5.b+树和普通的b树比起来有什么区别
# 1.b+树只在叶子节点存数据
# 有利于降低树的高度
# 稳定查询所有数据的io次数
# 2.在所有的叶子节点之间添加了双向链表
# 导致了所有的范围查询b+树的效率比b树高
# 6.mysql中 innodb myisam的索引都是由b+树完成的
# innodb 支持 聚集索引(叶子节点存具体的数据) + 辅助索引(叶子节点存地址)
# 聚集索引也叫 聚簇索引
# myisam 只支持辅助索引,也叫非聚集索引
索引
mysql中所有的key
index key 普通索引,能够加速查询,辅助索引
unique key 唯一 + 索引,辅助索引
primary key 唯一 + 非空 + 聚集索引
foreign key 本身没有索引的,但是它关联的外表中的字段是unique索引
primary key 和unique 标识的字段不需要再添加索引
能用unique的时候尽量不用index,unique除了是索引之外还能做唯一约束,如果做了唯一约束
创建索引
creeat index 索引名 on 表名(字段名)
删除索引
drop index 索引名 on 表名
关于索引的说明
1.条件一定是建立了索引的字段,如果条件使用的字段根本就没有创建索引,那么索引不生效
2.如果条件是一个范围,随着范围的值逐渐增大,那么索引能发挥的作用也越小
3.如果使用like进行模糊查询,那么使用a%的形式能命中索引,%a形式不能命中索引
4.尽量选择区分度高的字段作为索引列
5.索引列不能在条件中参与计算,也不能使用函数
6.在多个条件以and相连的时候,会优点选择区分度高的索引列来进行查询
在多个条件以or相连的时候,就是从左到右依次判断
7.制作联合索引
7.1.最左前缀原则 a,b,c,d 条件是a的能命中索引,条件是a,b能命中索引,a,b,c能命中,a,c.... 只要没有a就不能命中索引
如果在联合查询中,总是涉及到同一个字段,那么就在建立联合索引的时候将这个字段放在最左侧
7.2.联合索引 如果按照定义顺序,从左到右遇到的第一个在条件中以范围为条件的字段,索引失效
尽量将带着范围查询的字段,定义在联合索引的最后面
如果我们查询的条件总是多个列合在一起查,那么就建立联合索引
create index ind_mix on s1(id,email)
select * from s1 where id = 1000000 命中索引
但凡是创建了联合索引,那么在查询的时候,再创建顺序中从左到右的第一列必须出现在条件中
select count(*) from s1 where id = 1000000 and email = 'eva10%'; 命中索引
select count(*) from s1 where id = 1000000 and email like 'eva10%'; 可以命中索引
select * from s1 where id >3000 and email = 'eva300000@oldboy'; 不能命中索引
8.条件中涉及的字段的值必须和定义表中字段的数据类型一致,否则不能命中索引
关于索引的两个名词
覆盖索引 查一个数据不需要回表
select name from 表 where age = 20 不是覆盖索引
select age from 表 where age =20 是覆盖索引
select count(age) from 表 where age =20 是覆盖索引
合并索引
当我们为单独的一列创建索引的时候
如果条件是这一列,且使用正确就可以命中索引
当我们为两列分别创建单独的索引的时候
如果这两列都是条件,那么可能只能命中期中一个条件
如果这两列都是条件,那么可能会命中两个索引 - 合并索引
我们为多列直接创建联合所以
条件命中联合索引
执行计划
看看mysql准备怎么执行这条语句 可以看到是否命中索引,计划能命中哪些,实际命中了哪些,执行的顺序,是否发生了索引合并,覆盖索引
explain select * from s1;
pymysql
import pymysql
db = pymysql.connect(host='localhost', user='root',
database='homework')
cur = db.cursor(cursor=pymysql.cursors.DictCursor)
cur.execute('select * from class')
ret = cur.fetchone()
print(ret) # 查一个
ret1 = cur.fetchmany(4)
print(ret1) # 查四个
ret2= cur.fetchall()
print(ret2) # 查全部 少用
db.commit()
cur.close()
db.close()
概念补充
存储引擎
innodb : 外键 行级锁(并发修改) 事务(客户管理系统)
myisam : 表级锁 不支持外键\事务\行级锁
memory : 只能在内存中存储数据 重启server数据丢失
# 第一种方式: Myisam 是5.5之前默认的存储引擎
# 数据存在硬盘上,存三个文件,表结构,数据,和搜索目录
# 既不支持事务、也不支持外键、不支持行级锁
# 只支持表锁
# 对于只读操作比较多的情况 查询速度相对快
# 第二种方式: Innodb 是5.6之后的默认存储引擎
# 数据存在硬盘上,存两个文件,表结构,(数据和搜索目录)
# 支持事务
# 支持行级锁
# 支持外键
# 第三种方式: Memory
# 数据存在内存中,存一个文件,表结构(在硬盘上)
# 数据容易丢失,但读写速度都快
# 几个需要讲解的关键词
# 事务 transaction
# 在修改数据时保证了数据的安全性
# 行级锁和表级锁
# 外建约束
mysql中的基础数据类型
数字
int
float(8,2)
字符串
char 定长字符串 越是长度固定char越节省空间 读写速度快
varchar 变长字符串 越是长度不固定varchar越节省空间 读写速度慢
时间
year
date 入职日期 离职 开学 毕业
time
datetime 出生日期 交易记录 打卡时间
timestamp 一般不用
enum 和 set
enum 单选 (性别)
# enum('male','female')
set 多选(去重)
完整性约束
id int unsigned # 无符号的整数
id int default 0 # 默认为0
id int not null
id int unique
auto_increment # 相当于非空+自增且只能用于整数类型
# id int unique auto_increment
# id int primary key auto_increment
非空 + 唯一
# id int unique not null 如果没有主键,第一个设置非空唯一的就是主键
联合唯一
# id int,
# name char(12),
# unique(id,name)
primary key 主键 一张表只能有一个主键
# id int primary key
foreign key 外键
# id int,
# name char(12),
# tid int,
# foreign key(tid) references 外表(字段名) on update cascade on delete cascade
数据备份
数据备份
#语法:
# mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql
#示例:
#单库备份
mysqldump -uroot -p123 db1 > db1.sql
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql
#多库备份
mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql
#备份所有库
mysqldump -uroot -p123 --all-databases > all.sql
数据恢复
#方法一:
[root@egon backup]# mysql -uroot -p123 < /backup/all.sql
#方法二:
mysql> use db1;
mysql> SET SQL_LOG_BIN=0; #关闭二进制日志,只对当前session生效
mysql> source /root/db1.sql
事物和锁
begin; # 开启事务
select * from emp where id = 1 for update; # 查询id值,for update添加行锁;
update emp set salary=10000 where id = 1; # 完成更新
commit; # 提交事务