MySQL学习
MySQL学习笔记(狂神说Java)
狂神说B站视频:https://www.bilibili.com/video/BV1NJ411J79W?p=1
MySQL官网:https://www.mysql.com/
MySQL教程:https://www.runoob.com/mysql/mysql-tutorial.html
1.初识MySQL
JavaEE: 企业级java开发 Web
前端(页面:展示,数据!)
后台(连接点:连接数据库 JDBC,连接前端(控制,控制视图跳转,给前端传输数据))
数据库(存数据(变量),txt,Excel(类似关系型数据库),word)
只会写代码,学好数据库,基本混饭吃;
操作系统,数据结构与算法!当一个不错的程序员!
离散数学,数字电路,网站体系结构,编译原理。+实战经验=》优秀的程序员
1.1 为什么学习数据库
1.岗位需求
java必须会mysql
2.现在的世界,大数据时代~,数据可以变现,得数据者得天下。
3.被迫需求;存数据
4.数据库是所有软件体系中最核心的存在。DBA
1.2 什么是数据库
数据库(DB,DateBase)
概念:数据仓库,软件,安装在操作系统(windows,linux,mac)之上! SQL,可以存储大量数据,500万!
作用:存储数据,管理数据
1.3 数据库分类
关系型数据库:SQL
(Excel(行列))
- Mysql,Oracle,Aql server, DB2,SQLlite
- 通过表和表之间,行和行之间的关系进行数据的存储, 学员信息表、考勤表……
非关系型数据库 NoSQL
(key:value)
- Redis,MongDB
- 非关系型数据库,对象存储,通过对象自身属性决定。
DBMS (DB:数据库 MS:管理系统)
- 数据库管理软件(相当于excel,wps),科学有效的管理数据,维护和获取数据。
- MySQL
1.4 MySQL简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 **RDBMS (Relational Database Management System,关系数据库管理系统) **应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站包括大型网站(搭建集群)的开发都选择 MySQL 作为网站数据库。
1.5 安装MySQL
免安装版:解压就可以用MySQL免安装版的数据存储,默认在当前解压文件夹下。 命令提示符窗口(cmd)启动后,文件目录下对会出现data这个文件就是用于储存数据的。免安装版需要像jdk一样配置环境变量。
安装版:安装就可以用MySQL安装版:MySQL安装版的数据存储,默认在电脑安装目录文件下。不用配置环境变量。
(官网下载地址)[https://www.mysql.com/downloads/]
(清华大学开源镜像站)[https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/]
安装建议:1.尽量不要使用exe,注册表,卸载麻烦;2.尽可能使用安装包安装
安装步骤:
1、下载后得到zip压缩包.
2、解压到自己想要安装到的目录,本人解压到的是D:\mysql
3、添加环境变量:我的电脑->属性->高级->环境变量
选择PATH,在其后面添加: 你的mysql 安装文件下面的bin文件夹
4、编辑 my.ini 文件 ,注意替换路径位置
1 |
|
5、启动管理员模式下的CMD,并将路径切换至mysql下的bin目录,然后输入
mysqld –install (安装mysql服务)
1 |
|
1 |
|
6、再输入 mysqld --initialize-insecure --user=mysql
初始化数据文件(生成data目录)
1 |
|
7、然后再次启动mysql
1 |
|
1 |
|
8、然后用命令 mysql –u root –p
进入mysql管理界面(密码可为空)
1 |
|
1 |
|
9、进入界面后更改root密码
1 |
|
1 |
|
11、刷新权限
1 |
|
1 |
|
12、修改 my.ini文件删除最后一句skip-grant-tables
1 |
|
13、重启mysql即可正常使用
1 |
|
1 |
|
14、连接上测试出现以下结果就安装好了
1 |
|
1 |
|
1.6 SQLyog
可手动操作,管理MySQL数据库的软件工具
特点 : 简洁 , 易用 , 图形化
数据库信息在/data目录
1.新建一个数据库 school
1 |
|
2.新建一张表 student
1 |
|
3.查看表
1 |
|
4.添加信息
1 |
|
5.删除信息
1 |
|
1.7连接数据库
命令行连接!
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
2.操作数据库
操作数据库 - 》 操作数据库中的表 - 》 操作表中的数据
- MySQL不区分大小写
2.1 操作数据库
1.创建数据库
1 |
|
2.删除数据库
1 |
|
3.使用数据库
1 |
|
4.查看数据库
1 |
|
学习思路:
- 对照sqlyog可视化查看历史记录
- 固定语法或关键字必需记住
2.2 数据库的列类型
数值
- tinyint 十分小的数据 1个字节
- smallint 较小的数据 2个字节
- mediumint 中等的数据 3个字节
- int 标准的整数 4个字节
- igint 较大的数据 8个字节
- float 浮点数 4个字节
- doule 浮点数 8个字节
- decimal 字符串形式的浮点数 金融常用
字符串
- char 字符串固定大小 0-255
- varchar 可变字符串 0-65535
- tingtext 微型文本 1-2^8-1
- text 文本串
时间日期
- date YYYY-MM-DD 日期格式
- time HH:MM:SS 时间格式
- **datetime YYYY-MM-DD HH:MM:SS ** 最常用时间格式
- timestamp 时间戳 1970.1.1到现在的毫秒数
- year 年
null
- 没有值,未知
- 注意,不要使用NULL进行计算
2.3 数据库的字段属性
Unsigned
- 无符号的整数
- 声明了该列不能为负数
zerofill
- 0填充的
- 不足的位数,使用0来填充
自增
通常理解为自增,自动在上一条记录基础上+1(默认)
通常用来设置唯一主键—— index,必须是整数类型
可以自定义设计主键的递增的起始和步长
非空 NULL NOT NULL
- 假设设置为not null ,如果不给它赋值,就会报错!
- NUII,如果不填写值,默认就是null !
默认
- 设置默认的值!
- sex,默认为男,如果不设置则为默认值。
拓展:
1 |
|
2.4 创建数据库表
1 |
|
格式
1 |
|
常用命令
1 |
|
2.5 数据表的类型
1 |
|
MyISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约为2倍 |
常规使用操作:
- MyISAM 节约空间,速度较快
- INNODB 安全性高,事务的处理,多表多用户操作
在物理空间存在的位置
所有的数据库文件都存在data目录下,一个目录对应一个数据库
本质还是文件的存储!
MySQL引擎在物理文件上的区别
INNODB 在数据库表中只有*.frm文件,以及上级目录下的ibdata1文件·MYISAM对应文件。
MySQL引擎在物理文件上的区别
*.frm表结构的定义文件。
*.MYD数据文件 (data)。
*.MYI索引文件(index)
设置数据库表的字符集编码
1 |
|
不设置的话,会是mysql默认的字符集编码~(不支持中文! )
MySQL的默认编码是Latih1,不支持中文
在my.ini 中配置默认的编码
1 |
|
2.6 修改和删除表
修改
1 |
|
删除
1 |
|
所有创建删除操作尽量加上判断,以免报错
注意点:
- `` 字段名使用这个包裹。
- – 注释
- sql关键字大小写不敏感,建议用小写(狂神)!
- 所有符号全部用英文。
3.MySQL数据管理
3.1 外键
方式一 在创建表时增加约束(麻烦,比较复杂)
1 |
|
删除有外键关系表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)。
方式二 创建表成功后 添加外键约束
1 |
|
最佳实践
数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
我们想使用多张表的数据,想使用外键(程序去实现)
3.2 DML语言全部记住
数据库意义:数据存储,数据管理
DML语言: 数据操作语言
- insert
- update
- delete
3.3 添加
insert
1 |
|
1 |
|
语法:insert into 表名([字段名1,字段名2,字段名3])values(值1),(值2),(值3),(……)
注意事项:
- 字段字段之间使用英文,隔开
- 字段是可以省路的,但是后面的值必须要一一对应
1
INSERT INTO `student` VALUES('033','003','baixf','白小飞','男','20000301','泰安','707401057@qq.com')
- 可以同时插入多条数据,VALUES后面的值,需要使用
VALUES(),()……
隔开
3.4 修改
update 修改谁 (条件) set 原来的值 = 新值
1 |
|
条件:where 子句 运算符
id等于某个值,大于某个值,或者在区间内修改。
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或!= | 不等于 | 5<>6 | true |
> | |||
< | |||
<= | |||
>= | |||
BETWEEN AND | 在某个闭合区间 | between 2 and 5 | |
AND | 我和你&& | 5>1 AND 1>2 | false |
OR | 我或你|| | 5>1 OR 1>2 | true |
语法:UPDATE_表名 set co1num_name = value,[co1num_name = value,.. . .] where [条件]
注意;
colnum_name是数据库的列,尽量带上``
条件,筛选的条件,如果没有指定,则会修改所有的列
value,是一个具体的值,也可以是一个变量
多个设置的属性之间,使用英文逗号隔开
1 |
|
3.5 删除
delete 命令
1 |
|
TRUNCATE 命令
1 |
|
delete 和 TRUNCATE 的区别
相同点:都能删除数据,都不会删除数据表结构
不同点 :
* TRUNCATE 重新设置 自增列 计数器会清零 * TRUNCATE 不会影响事务
1 |
|
了解即可:delete删除的问题,重启数据库,现象
- INNODB 自增列从1开始(存在内存中,断电即失)
- MyISAM 继续从上一个字增量开始(存在文件中,不丢失)
4. DQL查询数据
4.1 DQL
(data query language:数据查询语言)
- 所有的查询操作都用它 select
- 简单的查询,复杂的查询他都能做
- 数据库中最核心的语言,最重要的语言
- 使用频率最高的语句
SELECT语法
执行下面sql语句建立插入数据
1 |
|
4.2 指定查询字段
1 |
|
1 |
|
语法:SELECT 字段 ... FROM 表
有的时候,列名字不是那么的见名知意。我们起别名As
字段名 as 别名 表名 as 别名
去重 distinct
1 |
|
数据库的列
1 |
|
数据库中的表达式:文本值,列,Null,函数,计算表达式,系统变量….
格式:
select 表达式 from 表
4.3 where条件句子
作用:检索数据中符合条件
的值
逻辑运算符:尽量使用英文
搜索的条件由一个或多个表达式组成!结果为布尔值
运算符 | 语法 | 描述 |
---|---|---|
and && | a and a&&b | 逻辑与,全为真则真 |
or || | a or b a||b | 逻辑或,有一真则为真 |
Not ! | not a ! a | 逻辑非,取反 |
1 |
|
1 |
|
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为NULL则结果为真 |
IS NOT NULL | a is not null | 如果操作符为not NULL则结果为真 |
BETWEEN AND | a between b and c | 若a在和c之间,结果为真 |
LIKE | a like b | SQL匹配,如果a匹配,则结果为真 |
IN | a in (a1,a2……) | 假设a在a1,或者a2……其中的某一个值中,结果为真 |
1 |
|
1 |
|
1 |
|
4.4 联表查询
join 对比
1 |
|
操作 | 描述 |
---|---|
inner join | 如果表中有一个匹配项就返回行 |
left join | 从左表中返回所有的值,即使右表中没有匹配 |
right join | 从右表中返回所有的值,即使左表中没有匹配 |
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
自连接:自己的表和自己的表相连接(了解)
执行以下sql,导入数据
1 |
|
核心:将一张表拆为两张一样的表即可。
父类
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
子类
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 数据库 |
2 | 8 | 办公信息 |
3 | 6 | we开发 |
5 | 7 | ps技术 |
操作:查询父类对应的子类关系
父类 | 子类 |
---|---|
信息技术 | 办公信息 |
软件开发 | 数据库 |
软件开发 | web开发 |
美术设计 | ps技术 |
1 |
|
4.5分页和排序
排序
1 |
|
1 |
|
1 |
|
语法:limit(查询起始值,需要查询的条数)
1 |
|
4.6 子查询
where(值是固定的,这个值是计算出来的)
本质:在where语句中嵌套一个子循环语句
1 |
|
1 |
|
5. MySQL函数
5.1 常用函数
1 |
|
5.2 聚合函数(常用)
函数名称 | 描述 |
---|---|
COUNT() | 计数 |
SUM() | 计和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
…… | …… |
1 |
|
5.3 数据库级别的MD5加密(扩展)
什么是MD5?
主要增强算法复杂度和不可逆性。
MD5不可逆,具体的值的md5是一样的。
MD5破解网站的原理,背后有一个字典,MD5加密后的值加密的值。
1 |
|
1 |
|
1 |
|
1 |
|
6.事务
6.1 什么是事务
1.SQL执行 A给B转账 A 1000 ——》200 B200
2.SQL执行 B收到A的钱 A 800 ——-》B 400
将一组SQL放在一个批次中执行~
事务原则:ACID原则 原子性 一致性 隔离性 持久性
原子性
要么都成功,要么都失败
这个过程包含两个步骤
A: 800 - 200 = 600
B: 200 + 200 = 400
原子性表示,这两个步骤一起成功,或者一起失败,不能只发生其中一个动作
一致性(Consistency)
针对一个事务操作前与操作后的状态一致
操作前A:800,B:200
操作后A:600,B:400
一致性表示事务完成后,符合逻辑运算
持久性(Durability)– 事务提交
表示事务结束后的数据不随着外界原因导致数据丢失,事务一旦提交不可逆。
操作前A:800,B:200
操作后A:600,B:400
如果在操作前(事务还没有提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为
A:800,B:200
如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为
A:600,B:400
隔离性(Isolation)
针对多个用户同时操作,数据库为每个用户开启的事务,不会被其他用户操作的数据所干扰。
事务的隔离级别
脏读:
指一个事务读取了另外一个事务未提交的数据。
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
页面统计查询值
点击生成报表的时候,B有人转账进来300(事务已经提交)
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
(一般是行影响,多了一行)
执行事务
1 |
|
模拟转账实例
1 |
|
7. 索引
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。
7.1 索引的分类
主键索引 PRIMARY KEY
1
唯一的标识,不可重复,只能有一个
唯一索引 UNIQUE KEY
1
避免重复的列出现,唯一索引可以重复,多个列都可以表示 唯一索引
常规索引 KEY/INDEX
1
默认的
全文索引 FullText
1 |
|
1 |
|
1 |
|
1 |
|
7.2 模拟测试
执行下面语句
1 |
|
1 |
|
重点:索引在小数据量的时候,用户不大,但是在大数据的时候,区别十分明显~
7.3 索引原则
- 索引不是越多越好
- 不要对经常变动的数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用查询的字段中
拓展:索引的数据结构
Hash 类型的索引
Btree:InnoDB 的默认数据结构~
8. 权限管理和备份
8.1用户管理
SQL yog可视化管理
SQL 命令操作
用户表:mysql.user
本质:对这张表进行增删改查
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
8.2 数据库备份
为什么备份?
- 保证重要的数据不丢失
- 数据转移A-》B
MySQL数据库备份的方式
- 直接拷贝物理文件
- 使用SQLyog等可视化管理工具上手动导出
- 使用命令行
mysqldump
在命令行使用
1 |
|
1 |
|
1 |
|
9. 规范数据库设计
9.1 为什么需要设计
当数据库比较复杂的时候,我们就需要设计
糟糕的数据库设计:
- 数据冗余,浪费空间
- 数据库插入和删除都会麻烦、异常[屏蔽使用外键]
- 程序性能差
良好的数据库设计:
- 节省内存空间
- 保证数据库完整性
- 方便我们开发系统
软件开发中,关于数据库设计
- 分析需求:分析业务和需要处理的数据的要求
- 概要设计:设计关系图E-R图
设计数据库的步骤:(个人博客)
收集信息,分析需求 (尽可能全,避免修改)
* 用户表(用户登录注销,用户的个人信息,写博客,创建分类) * 分类表(文章分类,谁创建的) * 文章表(文章的信息) * 友链表(友链信息) * 自定义表(系统信息,某个关键字,或者一些字段)key:value
标识实体(把需求落地到每个字段)
标识实体之间的关系
* 写博客:user ->blog
* 创建分类:user ->category
* 关注:user->user
* 友链:links
* 评论:user-user-blog
类似系统:BBS、CM……
9.2 三大范式
为什么需要数据规范化?
信息会重复
更新会导致异常
插入异常
* 无法正常显示信息
删除异常
- 丢失有效数据
三大范式
第一范式(1NF)
原子性:保证每一列不可分
举例说明:
在上面的表中,“家庭信息”和“学校信息”列均不满足原子性的要求,故不满足第一范式,调整如下:
可见,调整后的每一列都是不可再分的,因此满足第一范式(1NF);
第二范式(2NF)
前提:满足第一范式
每张表只描述一件事情
举例说明:
在上图所示的情况中,同一个订单中可能包含不同的产品,因此主键必须是“订单号”和“产品号”联合组成,
但可以发现,产品数量、产品折扣、产品价格与“订单号”和“产品号”都相关,但是订单金额和订单时间仅与“订单号”相关,与“产品号”无关,
这样就不满足第二范式的要求,调整如下,需分成两个表:
第三范式(3NF)
前提:满足第一范式、第二范式
第三范式需要确保数据表中的每一列数据都和主键有关,而不能间接相关。
举例说明:
上表中,所有属性都完全依赖于学号,所以满足第二范式,但是“班主任性别”和“班主任年龄”直接依赖的是“班主任姓名”,
而不是主键“学号”,所以需做如下调整:
这样以来,就满足了第三范式的要求。
ps:如果把上表中的班主任姓名改成班主任教工号可能更确切,更符合实际情况,不过只要能理解就行。
拓展:规范数据库的设计
规范性和性能的问题
阿里规定:关联查询的表不得超过三张
- 考虑商业化的需求和目标,(成本,用户体验->被迫不需要关联查询!)数据库的性能更加重要。
- 在规范性能的问题的时候,需要适当的考虑一下规范性!
- 故意给某些表增加一些荣誉的字段。(从夺标查询变为单表查询)
- 故意增加一些计算列(从大数据量减为小数据量的查询;添加索引)
10. JDBC
10.1 数据库驱动
驱动:声卡、显卡、数据库
我们的程序会通过数据库驱动和数据库打交道!