mysql学习
数据库学习分为三个阶段:
-
基础阶段:mysql数据库的基本操作(增删改查),以及一些高级操作(视图,触发器,函数,存储过程等)
-
优化阶段,如何提高数据库效率,如索引,分表等
-
部署阶段:如何搭建真实的环境系统,如服务器集群,负载均衡等
数据库基础
-
什么是数据库?
数据库:database,存储数据的仓库
数据库:高效的存储和处理数据的介质(介质主要是两种:磁盘和内存)
-
数据库的分类?
数据库基于存储介质的不同:进行了分类,分为两类:关系型数据库(SQL)和非关系型数据库(NoSQL)
-
关系型数据库
大型: Oracle,DB2
中型: SQL-SERVER, Mysql等
小型: access等
非关系型数据库: memcached,mongodb,redis(同步到磁盘)
-
两种数据库的区别?
关系型数据库:安全(保存磁盘基本不可能丢失),容易理解,比较浪费空间(二维表)
非关系型数据库:效率高,不安全(断电丢失)
关系型数据库
-
什么是关系型数据库?
关系型数据库:是一种建立在关系模型(数学模型)上的数据库
关系模型:一种所谓建立在关系上的模型,关系模型包含三个方面:
数据结构:数据存储的问题,二维表(有行和列)
操作指令集合:所有SQL语句
完整性约束:表内数据约束(字段与字段),表与表之间约束(外键)
-
关系型数据库的设计?
关系型数据库:从需要存储的数据需求中分析,如果是一类数据(实体)应该设计成一张二维表:表是由表头(字段名:用来规定数据的名字)和数据部分组成(实际存储的数据单元)
二维表:行和列
表头 字段名1 字段名2 数据单元 数据1 数据2 关系型数据库:维护实体内部,实体与实体之间的联系
关系型数据库的特点之一:如果表中对应的某个字段没有值(数据),但是系统依然要分配空间:关系型数据库比较浪费空间
关键字说明
数据库:database
数据库系统:DBS(Database System):是一种虚拟系统,将多种内容关联起来的称呼
DBS = DBMS + DB
DBMS:Database Management System 数据库管理系统,专门管理数据库
DBA: DataBase Administrator,数据库管理员
行/记录:row/record,本质是一个东西:都是指表中的一行(一条记录):行是从结构角度出发,记录是从数据角度出发
列/字段:column/field,本质是一个东西
SQL
SQL:Structured Query Language,结构化查询语言
SQL分为三个部分
- DDL:Data Definition Language,数据定义语言,用来维护存储数据的结构(数据库,表),代表指令:create,drop,alter等
- DML:Data Manipulation Language,数据操作语言,用来对数据进行操作(数据表中的内容),代表指令:insert,delete,updata等;其中DML内部又单独进行了一个分类:DQL(Data Query Language:数据查询语言,如select)
- DCL:Data Control Language,数据控制语言,主要是负责全县管理(用户),代表指令:grant,revoke等
SQL是关系型数据库的操作指令,SQL是一种约束,但不是强制,不同数据库可能内部有一定区别;
Mysq1数据库是一种c/s结构的软件:客户端/务端,若想访问服务器必须通过客户端(服务
器一直运行,客户端在需要使用的时候运行)
交互方式
-
客户单连接认证:连接服务器,认证身份:
-
发送SQL指令
-
服务器接收SQL指令:处理SQL指令:返回操作结果
-
客户端接收结果:显示结果
-
断开连接(释放资源:服务器并发限制)
exit quit \q
Mysql服务器对象
没有办法完全了解服务器内部的内容:只能粗略的去分析数据库服务器的内部的结构
将mysq1服务器内部对象分成了四层:系统DBMS)一数据库(DB)数据表(Table)→字段(field)
SQL基本操作
基本操作:CRUD
将SQL的基本操作根据操作对象进行分类, 分为三类:库操作, 表操作(字段) , 数据操作
库操作
对数据库的增删改查.
新增数据库
基本语法
Create database 数据库名字 【库选项】;
库选项:用来约束数据库,分为两个选项
字符集设定:charset/character set具体字符集(数据存储的编码格式)
校对集设定:collate具体校对集(数据比较的规则)
其中:数据库名字不能用关键字(已经被使用的字符)或者保留字(将来可能会用到的)
如果非要使用关键字或者保留字,那么必须使用反引号(``)
当创建数据库的SQL语句执行之后, 发生了什么?
- 在数据库系统中,增加了对应的数据库信息
- 会在保存数据的文件夹下:Data目录, 创建一个对应数据库名字的文件夹
- 每个数据库下都有一个opt文件:保存了库选项(校对集依赖字符集)
查看数据库
- 查看指定部分的数据库:模糊查询
Show databases like ‘pattern’;pattern是匹配模式
%:表示匹配多个字符
_ :表示匹配单个字符
要注意%和_作为搜索字符需要进行转义
- show create database mydatabase 数据库在执行SQL语句之前会优化语句,保存的是优化之后的语句
更新数据库
数据库名字不可以修改.
数据库的修改仅限库选项:字符集和校对集(校对集依赖字符集)
Alter database 数据库名字 [库选项] ;
Charset/character set [=] 字符集
Collate 校对集
删除数据库
所有的操作中:删除是最简单的
Drop database 数据库名字
表操作
新增数据表
Create table[if not exists] 表名(
字段名字 数据类型,
字段名字 数据类型 --最后一行不需要逗号
)[表选项];
If not exists:如果表名不存在, 那么就创建, 否则不执行创建代码:检查功能
表选项:控制表的表现
字符集:charset/character set 具体字符集; --保证表中数据存储的字符集
校对集:collate 具体校对集;
存储引擎:engine 具体的存储引擎(innodb和myisam)
当创建数据表的SQL指令执行之后, 到底发生了什么?
1.指定数据库下已经存在对应的表
2.在数据库对应的文件夹下,会产生对应表的结构文件(跟存储引擎有关系)
会有.frm文件,就是表的结构文件
查看数据表
show tables;
show tables like ‘pattern’ 如果要使用模糊查询,最好指定前面的内容,不然索引会失效,导致查询效率变低
show create table 表名; \g等价于; \G将查到的 结构旋转90度变成纵向
desc/describe/show columns from 表名; 查看表中的字段信息
修改数据表
表本身存在,还包含字段:表的修改分为两个部分:修改表本身和修改字段
修改表本身
表本身可以修改:表名和表选项
修改表名:rename 旧表名 to 新表名
修改表选项:字符集,校对集和存储引擎
alter table 表名 表选项 【=】值
修改字段
字段操作很多:新增,修改,重命名,删除
新增字段
alter table 表名 add[column] 字段名 数据类型 [列属性] [位置]
位置:字段名可以存放表中的任意位置
first:第一个位置
after:在哪个字段之后,after 字段名 默认的是在最后一个字段之后
修改字段:修改通常是修改属性或者数据类型
alter table 表名 modify 字段名 数据类型[属性] [位置]
重命名字段
alter table 表名 change 旧字段 新字段名 数据类型 [属性] [位置]
删除字段
alter table 表名 drop 字段名
删除数据表
drop table 表名1,表名2;–可以一次性删除多张表
当删除数据表的指令执行之后发生了什么?
1.在表空间中,没有了指定的表(数据也没有了)
2.在数据库对应的文件夹下,表对应的文件(与存储引擎有关)也会被删除
数据操作
新增数据
有两种方案
方案1:给全表字段插入数据,不需要指定字段列表:要求数据的值出现的顺序必须与表中
设计的字段出现的顺序一致:凡是非数值数据,都需要使用引号(建议是单引号)包裹
Insert into表名values(值列表) [,(值列表) ] ;–可以一次性插入多条记录
方案2:给部分字段插入数据,需要选定字段列表:字段列表出现的顺序与字段的顺序无关;
但是值列表的顺序必须与选定的字段的顺序一致.
Insert into表名(字段列表) values(值列表) [,(值列表) ] ;
查看数据
select */字段 from 表名
select */字段 from 表名 where 条件
更新数据
Update 表名 set 字段 = 值 [where 条件] --建议都有where:要不就是更新全部
删除数据
delete from 表名 [where 条件];
中文数据问题
中文数据问题本质是字符集问题.
计算机只识别二进制:人类更多是识别符号:需要有个二进制与字符的对应关系(字符集)
客户端向服务器插入中文数据:没有成功
原因:\xD5\xC5\xD4\xBD 代表的是汉字在当前编码(字符集)下对应的二进制编码转换成的十六进制:两个汉字 =》四个字节(GBK)
报错:服务器没有识别对应的四个字节:服务器认为数据是UTF 8, 一个汉字有三个字节:
读取三个字节转换成汉字(失败),剩余的再读三个字节(不够):最终失败.
所有的数据库服务器认为(表现)的一些特性都是通过服务器端的变量来保存:系统先读取自
己的变量,看看应该怎么表现.
//查看服务器到底识别哪些字符集
Show character set;
Show variables like ‘character set%’;
基本上:服务器是万能,什么字符集都支持
//既然服务器识别这么多:总有一种是服务器默认和客户端打交道的字符集
show variables like ‘character_set%’;
问题根源:客户端是GBK,服务器是UTF-8,产生矛盾
解决方案:修改服务器,默认的接受字符集为GBK
set character_set_client = gbk;
插入数据成功,但是显示的还是乱码
原因:数据来源是服务器,解析数据是客户端(客户端只识别GBK)
set chatacter_set_result = gbk
设置服务器对客户端的字符集的认识:可以使用快捷方式:set names 字符集
set names gbk; ====>character_set_client,character_set_result,character_set_connection = utf-8
connection 连接层,是字符集转变的中间者,如果统一效率更高
校对集问题
校对集:数据比较的方式
校对集有三种格式
_bin:binary, 二进制比较, 取出二进制位, 一位一位的比较, 区分大小写
cs:casesensitive, 大小写敏感, 区分大小写
_ci:case in sensitice, 大小写不敏感, 不区分大小写
查看数据库所支持的校对集:show collation;
校对集:必须在没有数据之前申明,否则会修改无效
web乱码问题
动态网站由三部分构成:浏览器,apache/tomcat,数据库服务器
解决乱码:统一编码
事实上不可能,因为浏览器是用户管理,后端进行处理