Mysql介绍
Mysql
是一个关系型数据库管理系统,由MYSQL AB
公司开发,Mysql
是最流行的关系型数据库管理系统之一,在WEB应用方面,Mysql
是最好的RDBMS
(关系型数据库系统)应用软件.
Mysql
是一种关系型数据库管理系统,关系型数据库将数据保存到不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.
Mysql
所使用的SQL
语言是访问数据库的最常用的标准化语言.Mysql
软件采用了双授权政策,分为社区版和商业版,由于体积小,速度快,总体成本低,尤其是开房源码的特点,一般中小型网站的开发都选择Mysql
作为网站数据库.
Mysql数据库特点
1.持久化存储
2.读写速度极高
3.保存数据的有效性
4.对程序支撑非常好,以扩展
数据类型
1.整数:
int
:表示基本整形,在内存中占4个字节
bit
:二进制类型,这种数据类型常作为逻辑变量使用,用来表示真或假,两值选择.
int unsigned
:无符号整型,表示只能为正数
2.小数:
decimal
:表示浮点型,如decimal(5,2)表示共5位数字,小数点占2位.
3.字符串:
varchar
:表示最大不能超过多少字符,如varchar(20),表示最长字符别超过20个字符.
char
:表示固定长度的字符,如果填写的字符不足,则以空格追加.
4.枚举类型:
enum
:类似于选择题类型,如:gender enum(“男”,“女”,“中性”,“保密”) default"保密"
5.日期时间:
date,time,datetime
:
数据约束
auto_increment
:表示自动增长:一般用于设置主键,表示主键ID顺序的增长序号.
mot null
:表示不能为空:表示此字段必须填写数据,不能为空
primary key
:表示主键:物理上存储的顺序,mysql建议所有表中的主键字段都叫ID,类型为int unsigned
foreign key
:表示外键:对关系字段进行约束,当为关系字段填写时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败,并抛出异常.
unique
:唯一:表示此字段的值不允许重复
defauit
:默认值:表示此字段如果填写会按照填写的数据添加,如果不写会以默认值显示
注意:在创建表的时候,数据类型必须写,数据约束可以不写,根据实际情况.
数据库基本命令
连接数据库:mysql -uroot -p密码,或回车-->密码
退出数据库:快捷键:Ctrl + d
显示数据库版本:select version();
显示时间:select now();
显示当前使用的数据库:select database();
查询所有数据库:show databases;
使用数据库:use 数据库名称
删除数据库:drop database 数据库名称
创建数据库:
语法:create database 数据库名字 charset=utf8;
例子:create database user_name charset=utf8;
数据库的增删改查
增加:
添加字段:
语法:alter table 表名 add 字段名 类型;
例子:alter table python add jixiangwu varchar(20);
字段中插入数据:
1.单个插入:
语法:insert into 表名 values(数据...);
1.例子:insert into students values(0, '张三', 19, 1.78, '男', 1);
2.例子:insert into students(name, age) values('李四', 20);
3.例子:insert into students(height, name) values(1.68, '王五);
2.多个插入:
语法:insert into 表名(字段名....) values(数据...),(数据...),(数据...);
例子:insert into students(height, name) values(1.70, '赵六'), (1.8, '冯七'),(1.70, '小明');
删除:
1.物理删除:
语法:delete from 表名 where 条件;
例子:delete from students where id=2;
说明:一旦物理删除就真的删除了没办法恢复了,切记.
2.逻辑删除:
1.要逻辑删除先要给表创建id_delete的字段.
alter table students add is_delete bit default 0;
2.然后在进行逻辑删除.
update students set is_delete=1 where id=2;
说明:
逻辑删除只是给某个字段加上的一个标识,这个标识是0和1,但是0是不显示的,而1显示,表示此字段已经逻辑删除.逻辑删除本质就是"修改操作"
3.删除表:drop table 表名;
4.删除字段:alter table 表名 drop 字段名;
修改:
1.修改字段数据:
01.全部修改:
语法:update 表名 set 字段=值;
例子:update students set high=170.00;
02.条件修改:
语法:update 表名 set 列1=值1,列2=值2... where 条件;
例子:update students set high=188.88 where id=2;
2.修改字段:
01.字段取别名:
语法:select 字段名 as "新名字" from 表名;
例子:select name as "姓名" from students;
02.修改字段-重命名版:
语法:alter table 表名 change 源字段名 新字段名 类型及约束;
例子:alter table python change jixiangwu jixiangwu1 varchar(20);
03.修改字段-不重命名版:
语法:alter table 表名 modeify 字段名 类型及约束;
例子:alter table python modeify jixiangwu varchar(30); alter table python modeify jixiangwu varchar(30);
查询:
查询所有字段:
语法:select * from 表名;
例子:select * from python;
去重查询:
语法:select distinct 字段名 from 表名;
例子:select distinct name from python;
插叙指定字段:
语法:select 列1,列2,... from 表名;
例子:select id,name from python;
条件查询:
语法:select * from 表名 where 条件;
例子:select * from students where id=2;
条件的选择:
1.小于号的使用:>select * from 表名 where id > 3;
2.大于号的使用:<select * from 表名 where id <= 4;
3.不等于号的使用:!=select * from 表名 where name != '黄蓉';
4.或的使用:andselect * from 表名 where id > 3 and gender=0;
5.与的使用:orselect * from 表名 where id < 4 or is_delete=0;
6.like_的使用:select * from 表名 where name like'黄__';
7.like%的使用:select * from 表名 where name like '黄%';
8.in的使用:select * from 表名 where name in('黄蓉','郭靖','周杰伦');
9.between…and…的使用:
语法:select * from 表名 where (id between 3 and 8) and 字段=值;
说明:
可以在最后在加一个条件来筛选.
10.查询为空的字段:select * from 表名 where 字段 is null;
11.查询不为空的字段:select * from 表名 where 字段 is not null;
12.排序查询:order by
语法:select * from 表名 order by 字段名 升序或降序;
升序:select * from students order by age asc;
降序:select * from students order by age desc;
13.分页查询:
语法:
select * from 表名 ilmit start=0,count;
说明:start:表示在第几行开始读取,count:表示显示几行数据.
例子:
select * from students where limit 2,5;
select * from students where gender='男' limit 2,5;
说明:显示在第二行开始读取,共显示5行数据,并且显示男生.
14.聚合函数:
01.数量count(*):select count() from 表名;
02.最大值max(字段名):select max(id) from 表名 where
03.最小值min(字段名):select min(age) from 表名;
04.求和sum(字段名):select sum(id) from students;
05.平均值avg(字段名):select avg(id) from students
总结:
max:求出集合中数据最大的值
min:求出集合中数据最小的值
count:求出集合中数据的数量
sum:求出集合中数据的求和
avg:求出集合中数据的平均值
常用的查询规则
1.比较运算符:
=
:等于
>
:大于
<
:小于
>=
:大于等于
<=
:小于等于
!=
:不等于
2.逻辑运算符:
and
:与
or
:或
not
:非
3.模糊查询符:
like%
:表示任意多个字符
like_
:表示任意一个字符
4.范围查询符:
in
:表示在一个非连续的范围内
between...and...
:表示在一个连续的范围内
优先级说明:
1.优先由高到底的顺序为:小括号,not,比较运算符,逻辑运算符
2.and和or先运算,如果同时出现并希望先算or,需要结合()使用
连接概念
1.Mysql支持的3中连接查询方式:
01.内连接查询:查询的结果为两个表匹配到的数据.
02.右(外)连接查询:查询的结果为两个表匹配到的数据和右表特有的数据,对于左表中不存在的数据使用null填充.
03.左(外)连接查询:查询结果为两个表匹配到的数据和左表特有的数据,对于右表中不存在的数据使用null填充.
2.自关联:
介绍:自关联是一种特殊的连接方式
作用:当需要对多张表的相关数据汇总一个结果集中,并且多张表的数据来自于同一张表.
注意:需要对表起多个不同的别名草能进行自关联查询.
3.子查询:
介绍:在一个select语句中,嵌入了另外一个select语句,那么被嵌入的select语句称之为子查询语句,外部那个select语句则称之为主查询.
子查询和主查询的关系:
1.子查询是嵌入到主查询中
2.子查询是辅助主查询的,要么充当条件,要么充当数据源.
3.子查询是可以独立存在的语句,是一条完整的select语句.
子查询分类:
1.标量子查询:子查询返回的结果是一个数据(一行一列)
2.列子查询:返回的结果是一列(以列多行)
3.行子查询:返回的结果是一行(一行多列)
外键:foreign key
说明:foreign key约束指定某一个列或组列作为外部键,其中包含外部键的表称为子表,包含外键所引用的键的表称为父表.
作用:对外键字段的值在更新和插入时进行和引用的表中字段数据进行对比
数据库的设计
1.三范式NF:
1NF:强调的是列的原子性,即列不能够在分成其他几列.
2NF:首先是1NF,另外包含两部分内容,意识表必须有一个主键,二是非主键字段必须完整依赖于主键,而不能只依赖于主键的一部分.
3NF:首先是2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖,即不能存在,非主键列A依赖于非主键列B,非主键列B依赖于主键的情况.
2.E-R模型:
介绍:E-R图是实体-联系图,是指提供了表示实体型,属性和联系的方法,用来描述现实世界的概念模型.
E-R模型的使用场景:
1.关系型数据库关系模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型与关系,制定出表结构,这是项目开始的第一步.
2.在设计阶段一般使用E-R模型进行建模,有很多设计数据库的软件,常用的如:power designer,db desinger等,这些软件可以直观的看到实体及实体的关系.
3.设计数据库,可能是由专门的数据库设计人员来完成,也可能由开发者完成,一般由项目经理带领来完成.
4.设计完成E-R模型会将其转换为关系模型.
关系型的三种类型:
1对1:实体A对实体B为1对1,则在表A或表B中创建一个字段,存储另一个表的主键.
1对多:实体A对实体B为1对多,在表B中创建一个字段,存储表A的主键值.
多对多:实体A对实体B为多对多,新建一张表C,这个表只有两个字段,一个用于存储A的主键值,一个存储B的主键值.
视图
作用:视图是对一些复杂的SQL语句进行了封装,对表的引用,一张虚表,不存储具体的数据.方便操作,特别是查询操作,减少复杂的SQL,增强可读性.
创建视图:
语法:create view 视图名称 as select SQL语句;
注意:
1.视图名字一般以v_开头.
2.视图中的语句字段信息不可以重复,需要进行重命名.
查看视图:show tables;
使用视图:
语法:select * from 视图名称;
例子:select * from v_goods_info;
删除视图:drop view 视图名称;
总结:
1.视图封装了对多张基本表的复杂操作,简化用户操作.
2.视图只是一张虚表,并不存储任何基本表的数据,当用户使用视图的时候,视图会从基本表中取出.
3.通过视图可以对用户展示指定字段从而屏蔽其他字段数据,更加安全.
事务
介绍:事务是指为一个基本工作单元执行的一系列SQL语句的操作时,要么完全的执行,要么完全的不执行.
事务差用命令:
开启事务:
begin
说明:pymysql是自动开启事务的
提交事务:commit
回滚事务:rollback
事务的4大特性:
1.原子性:一个事务必须被看做一个不可分割的工作单元,整个事务不能只执行其中的一部分,要么全部提交成功,要么全部失败,这就是事务的原子性.
2.一致性:数据库总是从一个一致性状态转换为另一个一致性状态.
3.隔离性:一个事务在没有完全提交完,对其他的事务是不可见的.
4.持久性:一旦事务提交,其所作的一些都会保存到数据库中.
索引
介绍:能够帮我们快速查询数据的线索就称之为索引.索引是个特殊的文件,他们包含着对数据库表里所有记录的位置信息.
索引的坏处:
1.建立太多的索引将会影响更新和插入的速度.
2.建立索引会占用磁盘空间.
创建索引:
语法:
create index 索引名称 on 表名(字段名称(长度))
说明:
1.如果指定字段是字符串需要指定长度,建议长度与定义字段时的长度一样.
2.字段类型如果不是字符串,可以不写长度部分.
查看表中已有索引:show index from 表名;
删除索引:drop index 索引名称 on 表名;
开启运行时间监测:set profiling=1;关闭运行时间监测set profiling=0;
查看执行时间:show profiles;
数据库优化
1.优化索引,SQL语句,分析慢查询
2.设计表是严格根据数据库的设计范式来设计数据库
3.使用缓存,把经常访问到的数据放到缓存中,.
4.优化硬盘,采用SSD,使用硬盘队列技术.
5.采用Mysql内部自带的表分区技术,把数据分成不同的文件,能够提高磁盘的读取xiaolv.
6.把一些不经常读的数据放在一张表里.
7.主从分离读写,采用主从复制把数据库的读操作和写入操作分离出来.
8.选择合适的表引擎,参数上的优化.
9.进行架构级别的缓存,静态化和分布式.
10.不采用全文搜索.
11.采用更快的存储方式,例如:把经常访问的数据放到Nosql中.