目录

  • 一、mysql的基本知识
  • 二、mysql的安装
  • 三、启动和连接
  • 四、mysql的基本SQL命令
  • 1、库的操作
  • 2、表的操作
  • 3、字段的操作
  • 4、记录的操作
  • 五、mysql的数据结构
  • 六、mysql的运算符
  • 1、比较运算符
  • 2、匹配式查找
  • 七、mysql的高级SQL
  • 1、order by(排序)
  • 2、where(操作定位)
  • 3、limit (限定行数)
  • 4、聚合函数(对字段进行计算查询)
  • 5、group by (分组聚合)
  • 6、having (过滤)
  • 5、distinct
  • 七、mysql的约束与索引
  • 1、约束
  • 1、索引
  • 八、mysql的导入导出、复制、备份
  • 1、导入
  • 2、导出
  • 3、复制
  • 4、备份
  • 九、mysql的高级查询SQL
  • 1、嵌套查询
  • 2、链接查询
  • 3、多表查询
  • 十、mysql的事务
  • 十一、mysql的储存引擎
  • 十二、mysql的调优
  • 十三、python操作mysql


一、mysql的基本知识

1、定义
	mysql是一个中小型且开源的数据库,在关系型数据库中仅次于oracle,
	由于mysql是开源数据库,所以是绝大部分公司的选择。
	
2、特点
	1) 关系型数据库
		以行和列的形式储存
		表中的行称为记录
		表中的列称为字段
		表与表之间的逻辑关联称为关系
	2) 跨平台
	3) 支持多种编程语言

3、注意
	1)  mysql的数据是以慰藉的形式存储在数据库目录/var/lib/mysql
	2)	关系型数据库的核心内容是 关系 及 二维表

4、修改默认编码类型
	1) 获取root权限 sudo -i
	2) 切换到配置文件路径 cd /etc/mysql/mysql.conf.d
	3) 备份 cp mysqld.cnd.cnf.bak
	4) 用vi编辑mysqld.cnf,修改一下内容,并保存退出
	[mysql]
	character_set_server = utf-8 
	5)重启服务 /etc/init.d/mysql restart

5、名词概念
	DB       数据库
	DBMS 数据库管理系统
	DBS    数据库系统

6、客户端把数据储存到数据库的服务器的过程
	1)连接数据库
	2)选择库
	3)创建/修改表
	4)断开链接

二、mysql的安装

1、ubuntu的安装(通过linux的apt源直接在终端安装即可)
安装服务器  sudo apt-get install mysql-server
安装客户端  sudo apt-get install mysql-client
2、window安装(下载压缩包,解压安装配置)
压缩包下载地址:[链接点击这里](https://pan.baidu.com/s/1bptkWIXu0ZD6aJNWw1ImKw)
提取码:zn5z 

三、启动和连接

1、服务端启动
sudo /etc/init.d/mysql start|stop|restart
start 启动服务
stop 停止服务
restart 重启服务

2、客户端连接
mysql -h主机地址 -u用户名 -p 密码
示例:mysql  -h127.0.0.1 -uroot -p123

四、mysql的基本SQL命令

1、库的操作
1.创建
create database 库名 [default charset=utf8];
2.删
drop database 库名;
3.查
show databases;  #查看所有数据库
show create database name; #查看数据库创建语句
select database(); #查看当前所在库
2、表的操作
1. 创建表
create table table_name(
字段1 数据类型 [约束],
字段2 数据类型 [约束],
字段3 数据类型 [约束],
字段4 数据类型 [约束],
) [default charset=utf8];
2.查
show tables; #查看所有表
show create table table_name; #查看创建表语句
desc table_name; #查看表结构
3.删
drop table table_name;
4.改
alter table 表名 rename 新表名
3、字段的操作
1.增
alter table 表名 add 字段名 数据类型 first|after 字段名;
示例:alter table user sex emun after ago;#在ago后面添加一列sex;
2.删
alter table table_name drop filed_name;
3.改
alter table table_name modify filed_name 新数据类型; #修改数据类型
alter table table_name change old_name new_name 数据类型; #修改字段名
4、记录的操作
1.增(插入记录)
insert info 表名 values(值1)(值2)(值n);
insert info 表名(字段名列表) values(值1)(值2)(值n);
2.删
delete from 表名;
3.改
upadate 表名 set 字段名1=值1 字段名2=值2....;
示例:upadate user set sex=1 old=19;#将user表中的性别改成1,年龄改成19
4.查
select 字段1,字段2... from 表名

五、mysql的数据结构

1.整型
	1)int 大整型(4个字节)  取值范围:0~2**32-1(42亿多)
	2)tinyint 微小整型(1个组合) 取值范围:-128~127(0~255)
	3)smallint 小整形(2个字节) 取值范围:0~65535
	4)bigint  极大整型(8个字节)   取值范围:0~2**64-1
2.浮点型
	1) float (4个字节,最多显示7位数)取值范围:-999.99~999.99
		用法:字段名 float(m,n) m表示总位数 n表示小数位数
		注意:自动补全小数位数,小数位位数多的 时候四舍五入
	2) double(8个字节,最多显示15位有效位)用法:字段名 double(m,n)
	3) decimal(M+2个字节,最多显示28个有效位) 用法decimal(28,5)
3.字符型
	1)char 取值范围 :1~255 ,不给宽度时默认为1. 用法:char(n) 
	2)varchar 取值范围:1~65535 ,没有固定宽度。 用法:varchar(n)
	比较:char 浪费储存空间,性能高。
		 varchar 介绍储存空间,性能低
4.枚举类型
	定义:字段值只能在列举的范围内旋转
	1)enum(...) 单选(最多有65536个不同值)
	2)set(...)  多选(最多哟64个不通知) 用法:字段名 set(值1,值2...)
5)日期时间类型
	1)year:年 YYYY
	2)data:日期 YYYYMMDD		
	3)time:时间HHMMSS		
	4)datatime:YYYYMMDDHHMMSS]
	5)timestamp:YYYYMMDDHHMMSS]   #缺失时用当前时间填充
	示例:user datatime 20200110221133

六、mysql的运算符

1、比较运算符
1) 数值比较运算符:=、!=、>=、<、<=
2) 字符比较运算符:=、!=
3) 逻辑比较运算符:and(两个或两个以上同时满足)、or(多个条件满足其中一个)
4) 范围比较运算符:between 值1 and 值2  #在值1和值2之间
				 in (值1,值2,值3....) #在列表中的值
				 not in	(值1,值2,值3....)#不在列表中的值
	示例:select * from user where old between 10 and 20;
		  查看old值在10到20之间的信息
5) 匹配空值:is null,匹配非空 :is not null
	示例:select * from user where old is not null;
		 #查找用户表中,年龄不为空的信息
2、匹配式查找
1) 模糊匹配(like)
	1、用法:where 字段 like 表达式
	2、表达式:
		_:匹配单个字符
		%:匹配0到多个字符
	示例:select name from user where name like "赵%"
		 #查看名字为赵开头的信息

2) 正则匹配查询 (regexp)
	1、用法:where 字段 regexp “表达式”
	2、表达式符号
		^:以...开头
		$:以...结尾
		.:匹配任意一个字符
		*:匹前面字符出现0个或者多个
		[]:包含...内容
			[0-9]:匹配带数字的
			[a-z]:匹配带小写字母的
			[A-Z]:匹配带大写字母的
	示例:select * name from user regexp "^赵.*"
		#查看名字为赵开头的信息

七、mysql的高级SQL

mysql往往需要多条件帅选查询,以及在查询是计算,通常可以使用一下模板,先展示结构,后面一个一个功能讲解。
一般语句顺序是where>group by>聚合函数>having>order by> limit.
#sql高阶查询
select 字段,聚合函数 from 表
where ...
group by ...
having ...
order by ...
limit ...
1、order by(排序)
1) 作用:给查询结果进行排序
2) 语法格式:order by 字段 排序方式;
3) 排序方式:
	ASC(默认):升序
	DESC:降序
4) 示例:seletc * from user order by old DESC;(查询结果按年龄降序)
2、where(操作定位)
1) 作用:通常配合运算符达到对查询定位的作用
2) 语法格式:where 定位条件
3) 示例:select * from user where old<10; #查找年龄小于十岁的信息
3、limit (限定行数)
1) 作用:限制显示查询记录的个数
2) 用法:
	limit n --> 显示n条记录
	limit m,n --> 从第m+1条开始,显示n条记录
	通常放在sql语句最右边执行
4、聚合函数(对字段进行计算查询)
1)分类:
	avg(字段名):求字段的平均值
	sum(字段名):求和
	max(字段名):求最大值
	min(字段名):求最小值
	count(字段名):统计该字段的记录个数(缺失值不算在内)
2) 语法:select avg(字段名),sum(字段名) ...
5、group by (分组聚合)
1) 作用:给查询的结果进行分组
2) 语法:group by 字段名;
3) 示例:select sex,count(sex) from user group by sex;#将查询的结果按性别分组,并计算每组的个数
4) 注意:按什么分组,前面就只能查询什么字段。其他字段会出现报错。只能用聚合函数统计。
6、having (过滤)
1) 作用: 通常与group by连用,过滤group by返回的内容。弥补where只能对实际字段操作的缺陷。
2) 语法: having 字段条件
5、distinct
1) 作用: 不显示字段的重复值
2) 注意:
	distinct 处理的是distinct和from之间的所有字段,所有字段值必须完全相同才可以去重
	distinct不能对任何字段做聚合处理
3) 示例:select count(distinct name) from sanguo where country="蜀国";  #查看蜀国有多少个英雄。

七、mysql的约束与索引

1、约束
1) 作用:为了保证数据的完整性、一致性、有限性,可以限制无效的数据插入大数据表中
2) 分类
	1.默认约束(default)
		a.作用: 在插入记录时,如果不给改字段赋值,则使用默认值
		b.格式: 字段名 数据类型 default 默认值
	2.非空约束
		a.作用: 不允许该字段的值 有空值null记录
		b.格式: 字段名 数据类型 not null
1、索引
1) 定义: 对数据库中表的一列或者多列的值进行排序的一种结构(mysql中索引用Btree方式)
2) 优缺点: 加快了检索速度,但是降低了数据的维护速度。占用物理储存空间
3)分类
	1.普通索引
		a.规则
			一个表中可以有多个index字段
			字段的值可以有重复,也可以为空
			经常把做查询条件的字段设置为index字段
			index字段的key标志为:MUL
		b.创建索引
			创建表时创建,在字段后面加上index(字段)
			已有表添加:create index 索引名 on 表名(字段名)
		c.查看索引
			desc 表名;-->可以标志为MUL的字段
			show index from 表名;
		d.删除索引
			drop index 索引名 on 表名;
			
	2.唯一索引
		a.规则
			一个表中可以有多个unique字段
			字段的值不允许有重复,但是可以为空
			index字段的key标志为:UNI
		b.创建索引
			创建表时创建,在字段后面加上unique(字段)
			已有表添加:create unique index 索引名 on 表名(字段名)
		c.查看索引
			desc 表名;-->可以标志为MUL的字段
			show index from 表名;
		d.删除索引
			drop index 索引名 on 表名;
		
	3.主键索引
		a.规则
			一个表中只能有一个主键索引
			字段的值不允许有重复,也不能为空
			index字段的key标志为:PRI
			把表中能够唯一标识一条记录的字段设置为主键,通常把表中记录编号的字段设置为主键
		b.创建索引
			创建表时创建,在字段后面加上 primary key auto_increment
			已有表添加:alter table 表名 add primary key(字段名);
		c.查看索引
			desc 表名;-->可以标志为MUL的字段
			show index from 表名;
		d.删除索引
			alter table name modify id int primary key; #删除自增长属性
			alter table 表名 drop primary key;删除主键

八、mysql的导入导出、复制、备份

1、导入
1)作用:将文件系统的内容导入到数据库中(例如csv,txt)
2)语法
	load data infile "文件名"
	into table 表名
	fields terminated by "分隔符"
	lines terminated by  "\n";
3)示例
	a.查看数据库的默认路径
		show variables like "secure_file_priv";#结果/var/lib/mysql-files
	b.将需要导入的文件复制到默认搜索目录中
		sudo cp 文件 /var/lib/mysql-files/
	c..导入文件
		load data infile " /var/lib/mysql-files/文件名"
		into table userinfo
		fields terminated by ":"
		lines terminated by  "\n";
2、导出
1)作用:将数据库的内容导出到文件中(例如csv,txt)
2)语法
	select ... from  表名
	into outfile  文件名
	fields terminated by "分隔符"
	lines terminated by  "\n";
3、复制
1) 语法:create table 表名 select 查询命令;
2) 示例:create table userinfo2 select * from userinfo;#复制userinfo表的所有记录到userinfo2
3) 复制表结构:create table 表名 select 查询命令 where false; #复制不会把key类型复制过来
4、备份
1) 备份:mysqldump -uroot -p 源库名 > 路径/文件名.sql
	源库名:
		--all-databases    备份所以的库
		库名                备份单个库
		-B 库1 库2         备份多个库
		库名 表1 表2      备份指定库的指定表
2) 恢复:mysql -uroot -p 库名 < 理解/文件名.sql

九、mysql的高级查询SQL

1、嵌套查询
1) 定义:把查询结果作为外层的查询条件
2) select username,uid from userinfo  where uid < (select avd(uid) from userinfo );
	#查询uid小于uid平均值的用户名和uid
2、链接查询
1) 内连接
	a.定义:从表中删除与其他被连接的表中没有匹配到的行
	b.语法:select 字段名列表 from 表1 inner join 表2 on 条件 inner join 表3 in 条件;
	c.注释:获取的结果是所有表中不满足条件的行全部去除,以表1显示为主
2) 左连接
	a.定义:从表中删除与其他被连接的表中没有匹配到的行
	b.语法:select 字段名列表 from 表1 left join 表2 on 条件;
	c.注释:获取的结果是表1的全部和表2满足的部分,以表1显示为主
3) 右连接
	a.定义:从表中删除与其他被连接的表中没有匹配到的行
	b.语法:select 字段名列表 from 表1right join 表2 on 条件;
	c.注释:获取的结果是表2的全部和表1满足的部分,以表1显示为主
3、多表查询
1) select 字段名列表 from 表名列表;#卡迪尔积
2)select 字段名列表 from 表名列表 where 条件; #等同于内连接

十、mysql的事务

1. 定义:MySQL每次的sql语句都会默认提交。为了保证sql运行的一致性,事务提供了多条sql一起提交的方式,只要其中一条错误就会回滚。
2. 查看语句:show variables like "autocommit";
3. 开启事务
	start transaction;
	sql命令.....
	##此时 autocommit 被禁用,sql命令不会对数据库中的数据做修改
4. 终止事务
	提交sql:commit;
	取消sql:rollback;
5.实例
	背景:银行间的转账 小A从建行转5000给小B的工商
start transaction;
update userinfo_jh set 
price=(select price-5000 from userinfo_jh where name=小A)
where name=小A;  #将小A的银行卡减去5000
update userinfo_gs set 
price=(select price+5000 from userinfo_gs where name=小B)
where name=小B;  #将xiaoB的银行卡加上5000
commit; #都没有问题的时候,再提交

十一、mysql的储存引擎

1. 定义:是用来处理表的处理器
2. 基本操作:
	1) 查看已有表的储储存引擎:show create table 表名;
	2) 创建表时制定存储引擎 ; create table 表名(...) engine=myisaml
	3) 常用的储存引擎特点
		a.innodb特点(适用于经常修改表的引擎,高并发)
			共享表攻击(报名.frm粗存表结构,表名.idb储存表记录和索引信息)
			支持行级锁
		b.myiam特点(适用于经常查询的表,用innodb会浪费资源)
			独享表空间(表名.frm,表名.myd,表名.myi)
			表级锁
	4) 锁
		1、加锁的目的
			解决客户端并发访问的冲突问题
		2、锁类型
			读锁(select)共享锁
				加读锁之后不能更改表中内容,但可以进行查询
			写锁(update,insert,delect)互斥锁、排他锁
		3、锁力度
			表级锁(针对整个表的作用)
			行级锁(针对行的作用)
			##操作完成后会自动释放锁

十二、mysql的调优

1、选择合适的储存引擎
	1)经常用来读的表使用myisam储存引擎
	2)其余的表都用innodb储存引擎
2、SQL语句调优(表面全表扫描)
	1)在select where order by 常涉及到的字段简历索引
	2)where字句中不适用!=,否则将放弃索引进行全表扫描
	3)尽力避免用NULL值判断,否则会全表扫描(可以用0或者其他值代表NULL值)
	4)尽量避免 or 来链接条件,导致全表扫描。
	5)模糊查询尽量避免使用前置%,导致全表扫描
	6)劲量避免 in 和not in,导致全表扫描。(可以转换成between and)
	7)尽量避免使用 select * ...,要用具体的字段列表代替 *,不要返回用不到的任何字段

十三、python操作mysql

1、python操作mysql的库
	python3:pymysql 
	python2:MysSQLdb
	安装:pip install 相应的库名
2、python模块使用流程
	1)建立数据库连接
		db=pymysql.connect(IP地址,用户,密码,库名,编码类型)
	2)建立游标对象
		corsor=db.cursor()
	3)使用游标对象的方法操作数据库
		cursor.execute(sql命令)
	4)提交commit
		db.commit
	5)管理游标对象
		cursor.close()
	6)关闭数据库
		db.close()
3、对象的具体函数及功能
	1) 连接语法:对象名=pymysql.connect(...)
	2) connect支持的方法
		a. cursor() 创建一个游标对象db.cursor()
		b. commit() 提交到数据库执行
		c. rollvack() 回滚
		d. close() 关闭数据库
	3) 游标对象支持的方法
		1、execyte(sql) 执行sql命令
		2、fetchone() 取得结果集的第一条记录
		3、fetchmany() 取得结果集的n条记录
		4、fetchall() 取得结果集的所有记录
		5、close() 关闭游标