软件:
mysql-installer-community-5.7.28.0.msi
SQLyog-12.5.0-0_setup.exe

一、Windows Mysql安装

双击安装包文件 进行安装
image.png
同意Mysql协议 , 选择 Server Only安装Mysql服务器即可
image.png
image.png
检查,如果提示需要安装一个软件 visual studio ,我们选择安装一下
image.png

选中同意, Install 安装
image.png
image.png

Execut执行安装
image.png
image.png

产品配置
image.png

选单机版配置
image.png

不用改动, 选择下一步即可
image.png

为root用户 添加密码 确认密码
image.png

将Mysql添加到服务, 不需要更改,下一步即可
image.png

Execute, 进行更改配置
image.png

安装完成 Finish
image.png

Next
image.png

安装完成
点击电脑左下角的开始选项,我们可以看到Mysql
image.png

点击连接一下下,输入密码 回车,连接成功
image.png

输入命令: show databases
显示 数据库信息
image.png

二、环境变量配置

安装好MySQL,为MySQL配置环境变量。MySQL默认安装在C:\Program Files下。
image.png

配置环境变量

  1. 新建MYSQL_HOME变量,并配置: C:\Program Files\MySQL\MySQL Server 5.7
    image.png
    MYSQL_HOME:C:\Program Files\MySQL\MySQL Server 5.6
    image.png

  2. 编辑path系统变量,将 %MYSQL_HOME%\bin 添加到path变量后。
    image.png
    image.png

配置path环境变量,也可不新建MYSQL_HOME变量,而是直接将MySQL安装目录下的bin配置到path变量下
即:C:\Program Files\MySQL\MySQL Server 5.7\bin


三、卸载

  1. 首先我们找到 Mysql安装目录下的 my.ini 文件.
    如果找不到,可以使用搜索工具 对 my.ini文件进行搜索
    image.png

  2. 我们打开my.ini 文件,找到这样一段话
    这个定义的是mysql的数据库及数据表文件,我们将这段配置复制下来来
    datadir=C:/ProgramData/MySQL/MySQL Server 5.7/Data
    image.png

3.控制面板卸载程序:
image.png

4.手动删除残余内容
找到刚才保存数据的mysql文件目录
C:/ProgramData/MySQL/MySQL Server 5.7/Data
直接删除掉Mysql文件夹就可以
image.png

四、启动

window服务启动

右键此电脑 —> 管理—>择服务—> 找到MysQL服务,然后启动即可。
image.png

命令行方式启动:

  • 首先以管理员身份 打开命令行窗口
  • 启动: net start mysql57
  • 关闭: net stop mysql57

五、命令行登录

  1. # mysql -u 用户名 -p 密码
  2. mysql -uroot -p123456
  3. # mysql -h 主机IP -u 用户名 -p 密码
  4. # -h 指定IP 方式,进行 登录
  5. mysql -h127.0.0.1 -uroot -p123456
  6. # 退出命令
  7. exit 或者 quit

六、 MySql的目录结构

MySQL安装目录
MySql的默认安装目录在 C:\Program Files\MySQL\MySQL Server 5.7
image.png

MySQL配置文件 与 数据库及 数据表所在目录
image.png

  • my.ini 文件 是 mysql 的配置文件,一般不建议去修改
  • data<目录> Mysql管理的数据库文件所在的目录

image.png
数据库: 文件夹
表: 文件
数据: 文件中的记录

MySql自带数据库:
image.png

七、SQL

数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。
数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。
数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。
数据控制语言:简称DCL(Date Control Language),用来定义数据库的访问权限和安全级别,及创建用户。(了解)

mysql注释:

# show databases; 单行注释 
-- show databases; 单行注释 
/* 
多行注释 
show databases; 
*/

01.DDL

DDL 操作数据库

/* 方式1 直接指定数据库名进行创建 默认数据库字符集为:latin1 */
CREATE DATABASE db1;

/* 方式2 指定数据库名称,指定数据库的字符集 一般都指定为 utf8,
与Java中的编码保持一致 
*/
CREATE DATABASE db1_1 CHARACTER SET utf8;

-- 切换数据库 从db1 切换到 db1_1
USE db1_1;

-- 查看当前正在使用的数据库
SELECT DATABASE();

-- 查看Mysql中有哪些数据库 
SHOW DATABASES;

-- 查看一个数据库的定义信息 
SHOW CREATE DATABASE db1_1;

-- 修改数据库字符集
-- 将数据库db1 的字符集 修改为 utf8 
ALTER DATABASE db1 CHARACTER SET utf8;

-- 查看当前数据库的基本信息,发现编码已更改 
SHOW CREATE DATABASE db1;

-- 删除某个数据库 
DROP DATABASE db1_1;

DDL操作数据表

MySQL数据类型:

注意:MySQL中的 char类型与 varchar类型,都对应了 Java中的字符串类型,区别在于:

  • char类型是固定长度的: 根据定义的字符串长度分配足够的空间。
  • varchar类型是可变长度的: 只使用字符串长度所需的空间

比如:保存字符串 “abc”,
x char(10) 占用10个字节
y varchar(10) 占用3个字节

  • char类型适合存储 固定长度的字符串,比如 密码 ,性别一类
  • varchar类型适合存储 在一定范围内,有长度变化的字符串

— 切换到数据库 db1
USE db1;

— 创建测试表
CREATE TABLE test1(
tid INT,
tdate DATE
);

— 快速创建一个表结构相同的表(复制表结构)
— 创建一个表结构与 test1 相同的 test2表
CREATE TABLE test2 LIKE test1;

— 查看表结构
DESC test2;

— 查看当前数据库中的所有表名
SHOW TABLES;

— 查看创建表的SQL语句
SHOW CREATE TABLE test2;

— 直接删除 test1 表
DROP TABLE test1;
— 先判断 再删除test2表
DROP TABLE IF EXISTS test2;

— 将category表 改为 category1
RENAME TABLE category TO category1;

— 修改表的字符集,将category表的字符集 修改为gbk
alter table category character set gbk;

— 向表中添加列
# 为分类表添加一个新的字段为 分类描述 cdesc varchar(20)
ALTER TABLE category ADD cdesc VARCHAR(20);

— 修改表中列的 数据类型或长度 , 关键字 MODIFY
— 对分类表的描述字段进行修改,类型varchar(50)
ALTER TABLE category MODIFY cdesc VARCHAR(50);

— 修改列名称 , 关键字 CHANGE
alter table 表名 change 旧列名 新列名 类型(长度);
— 对分类表中的 desc字段进行更换, 更换为 description varchar(30)
ALTER TABLE category CHANGE cdesc description VARCHAR(30);

— 删除列 ,关键字 DROP
alter table 表名 drop 列名;
— 删除分类表中description这列
ALTER TABLE category DROP description;

02.DML

创建学生表
CREATE TABLE student(
sid INT,
sname VARCHAR(20),
age INT,
sex CHAR(1),
address VARCHAR(40)
);

向 学生表中添加数据,3种方式
— 方式1: 插入全部字段, 将所有字段名都写出来
INSERT INTO student (sid,sname,age,sex,address) VALUES(1,’孙悟空’,20,’男’,’花果山’);
— 方式2: 插入全部字段,不写字段名
INSERT INTO student VALUES(2,’孙悟饭’,10,’男’,’地球’);
—方式3:插入指定字段的值
INSERT INTO category (cname) VALUES(‘白骨精’);

注意:
1) 值与字段必须要对应,个数相同&数据类型相同
2)值的数据大小,必须在字段指定的长度范围内
3)varchar char date类型的值必须使用单引号,或者双引号 包裹。
4)如果要插入空值,可以忽略不写,或者插入null
5) 如果插入指定字段的值,必须要上写列名

— 带条件的修改,将sid 为3的学生,性别改为男
UPDATE student SET sex = ‘男’ WHERE sid = 3;

— 一次修改多个列, 将sid为 2 的学员,年龄改为 20,地址改为 北京
UPDATE student SET age = 20,address = ‘北京’ WHERE sid = 2;

— 删除 sid 为 1 的数据
DELETE FROM student WHERE sid = 1;

— 删除所有数据
DELETE FROM student;

— 如果要删除表中的所有数据,有两种做法
1. delete from 表名; 不推荐. 有多少条记录 就执行多少次删除操作. 效率低
2. truncate table 表名: 推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高
truncate table student;

03.DQL

-- 模糊查询 通配符
% 表示匹配任意多个字符串, _ 表示匹配 一个字符

# 查询含有'精'字的所有员工信息 
SELECT * FROM emp WHERE ename LIKE '%精%'; 
# 查询以'孙'开头的所有员工信息 
SELECT * FROM emp WHERE ename LIKE '孙%'; 
# 查询第二个字为'兔'的所有员工信息 
SELECT * FROM emp WHERE ename LIKE '_兔%';

limit 关键字的作用
limit是限制的意思,用于 限制返回的查询结果的行数 (可以通过limit指定查询多少行数据)
limit 语法是 MySql的方言,用来完成分页

SELECT 字段1,字段2… FROM 表名 LIMIT offset , length;
offset 起始行数, 从0开始记数, 如果省略 则默认为 0.
length 返回的行数

查询emp表中的前 5条数据
— 参数1 起始值,默认是0 , 参数2 要查询的条数
SELECT FROM emp LIMIT 5;
SELECT
FROM emp LIMIT 0 , 5;
# 查询emp表中 从第4条开始,查询6条
— 起始值默认是从0开始的.
SELECT * FROM emp LIMIT 3 , 6;

分页操作 每页显示3条数据:

— 分页操作 每页显示3条数据
SELECT FROM emp LIMIT 0,3; — 第1页
SELECT
FROM emp LIMIT 3,3; — 第2页 2-1=1 13=3
SELECT
FROM emp LIMIT 6,3; — 第三页
— 分页公式 起始索引 = (当前页 - 1) * 每页条数
— limit是MySql中的方言

八、MySQL单表&约束&事务

1. SQL约束

主键约束

1) 需求: 创建一个带主键的表

# 方式1 创建一个带主键的表 **
CREATE TABLE emp2(
— 设置主键 唯一 非空
eid INT PRIMARY KEY,
ename VARCHAR(20),
sex CHAR(1)
);

— 删除表
DROP TABLE emp2;
— 方式2 创建一个带主键的表
CREATE TABLE emp2(
eid INT ,
ename VARCHAR(20),
sex CHAR(1),
— 指定主键为 eid字段
PRIMARY KEY(eid)
);

方式3 创建一个带主键的表
CREATE TABLE emp2(
eid INT ,
ename VARCHAR(20),
sex CHAR(1)
)
— 创建的时候不指定主键,然后通过 DDL语句进行设置
ALTER TABLE emp2 ADD PRIMARY KEY(eid);

— 查看表的详细信息
DESC emp2;
image.png

2) 测试主键的唯一性 非空性

# 正常插入一条数据 
INSERT INTO emp2 VALUES(1,'宋江','男'); 
# 插入一条数据,主键为空 
-- Column 'eid' cannot be null 主键不能为空 
INSERT INTO emp2 VALUES(NULL,'李逵','男'); 
# 插入一条数据,主键为 1 
-- Duplicate entry '1' for key 'PRIMARY' 主键不能重复 
INSERT INTO emp2 VALUES(1,'孙二娘','女');

3) 删除主键约束

-- 使用DDL语句 删除表中的主键 
ALTER TABLE emp2 DROP PRIMARY KEY; 
DESC emp2;

主键的自增
AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)

-- 创建主键自增的表 
CREATE TABLE emp2( 
-- 关键字 AUTO_INCREMENT,主键类型必须是整数类型 
eid INT PRIMARY KEY AUTO_INCREMENT, 
ename VARCHAR(20), 
sex CHAR(1) 
);

-- 添加数据 观察主键的自增
INSERT INTO emp2(ename,sex) VALUES('张三','男'); 
INSERT INTO emp2(ename,sex) VALUES('李四','男'); 
INSERT INTO emp2 VALUES(NULL,'翠花','女'); 
INSERT INTO emp2 VALUES(NULL,'艳秋','女');

image.png

修改主键自增的起始值
默认地 AUTO_INCREMENT 的开始值是 1,如果希望修改起始值,请使用下面的方式

-- 创建主键自增的表,自定义自增其实值 
CREATE TABLE emp2( 
eid INT PRIMARY KEY AUTO_INCREMENT, 
ename VARCHAR(20), 
sex CHAR(1) 
)AUTO_INCREMENT=100; 
-- 插入数据,观察主键的起始值 
INSERT INTO emp2(ename,sex) VALUES('张百万','男'); 
INSERT INTO emp2(ename,sex) VALUES('艳秋','女');

image.png

DELETE和TRUNCATE对自增长的影响
DELETE: 只是删除表中所有数据,对自增没有影响
TRUNCATE:truncate 是将整个表删除掉,然后创建一个新的表,自增的主键,重新从 1开始

非空约束

--  为 ename 字段添加非空约束
CREATE TABLE emp2( 
eid INT PRIMARY KEY AUTO_INCREMENT, 
-- 添加非空约束, ename字段不能为空 
ename VARCHAR(20) NOT NULL, 
sex CHAR(1) 
);

唯一约束

唯一约束的特点: 表中的某一列的值不能重复( 对null不做唯一的判断 )

#创建emp3表 为ename 字段添加唯一约束 
CREATE TABLE emp3( 
eid INT PRIMARY KEY AUTO_INCREMENT, 
ename VARCHAR(20) UNIQUE, 
sex CHAR(1) 
);

主键约束与唯一约束的区别:
1. 主键约束 唯一且不能够为空
2. 唯一约束,唯一 但是可以为空
3. 一个表中只能有一个主键 , 但是可以有多个唯一约束

默认值

-- 创建带有默认值的表 
CREATE TABLE emp4( 
eid INT PRIMARY KEY AUTO_INCREMENT, 
-- 为ename 字段添加默认值 
ename VARCHAR(20) DEFAULT '奥利给', 
sex CHAR(1) 
);

-- 添加数据 使用默认值 
INSERT INTO emp4(ename,sex) VALUES(DEFAULT,'男'); 
INSERT INTO emp4(sex) VALUES('女'); 
-- 不使用默认值 
INSERT INTO emp4(ename,sex) VALUES('艳秋','女');

2.数据库事务

MYSQL 中可以有两种方式进行事务的操作:

  • 手动提交事务
  • 自动提交事务

开启事务:start transaction; 或者 BEGIN;这个语句显式地标记一个事务的起始点。
提交事务:commit;表示提交事务,即提交事务的所有操作,具体地说,就是将事务中所有对数据库的更新都写
到磁盘上的物理数据库中,事务正常结束。
回滚事务:rollback;表示撤销事务,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中
对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态

手动提交事务流程:
执行成功的情况: 开启事务 -> 执行多条 SQL 语句 -> 成功提交事务
执行失败的情况: 开启事务 -> 执行多条 SQL 语句 -> 事务的回滚

模拟sql

-- 创建账户表 
CREATE TABLE account( 
-- 主键 
id INT PRIMARY KEY AUTO_INCREMENT, 
-- 姓名 
NAME VARCHAR(10), 
-- 余额 
money DOUBLE 
);
-- 添加两个用户 
INSERT INTO account (NAME, money) VALUES ('tom', 1000), ('jack', 1000);

-- 模拟tom 给 jack 转 500 元钱,一个转账的业务操作最少要执行下面的 2 条语句:
-- tom账户 -500元 
UPDATE account SET money = money - 500 WHERE NAME = 'tom'; 
-- jack账户 + 500元 
UPDATE account SET money = money + 500 WHERE NAME = 'jack';


假设当tom 账号上 -500 元,服务器崩溃了。jack 的账号并没有+500 元,数据就出现问题了。
我们要保证整个事务执行的完整性,要么都成功, 要么都失败. 这个时候我们就要学习如何操作事
务.
-- 1) 命令行 开启事务
start transaction;

-- 2) 插入两条数据
INSERT INTO account VALUES(NULL,'张百万',3000); 
INSERT INTO account VALUES(NULL,'有财',3500);

3) 不去提交事务 直接关闭窗口,发生回滚操作,数据没有改变
如果事务中 SQL 语句没有问题,commit 提交事务,会对数据库数据的数据进行改变。 如果事务
中 SQL 语句有问题,rollback 回滚事务,会回退到开启事务时的状态。

自动提交事务
MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句
执行完毕 自动提交事务,MySQL 默认开始自动提交事务
MySQL默认是自动提交事务
image.png
取消自动提交
MySQL默认是自动提交事务,设置为手动提交.
1) 登录mysql,查看autocommit状态。
SHOW VARIABLES LIKE ‘autocommit’;
image.png
on :自动提交
off : 手动提交

2) 把 autocommit 改成 off;
SET @@autocommit=off;
image.png

事务的四大特性 ACID
原子性:每个事务都是一个整体,不可再拆分,事务中所有的 SQL 语句要么都执行成功, 要么都失败。
一致性:事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前2个人的 总金额是 2000,转账后 2 个人总金额也是 2000.
隔离性:事务与事务之间不应该相互影响,执行时保持隔离的状态.
持久性:一旦事务执行成功,对数据库的修改是持久的。就算关机,数据也是要保存下来的.

MySQL 事务隔离级别(了解)
数据并发访问:一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库. 数据库的相同数据可能
被多个事务同时访问,如果不采取隔离措施,就会导致各种问题, 破坏数据的完整性
并发访问会产生的问题:事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个 数据。可能引发并发访问的问题
**

  • 脏读:一个事务读取到了另一个事务中尚未提交的数据
  • 不可重复读:一个事务中两次读取的数据内容不一致, 要求的是在一个事务中多次读取时数据是一致的. 这是进行 update 操作时引发的问题
  • 幻读:一个事务中,某一次的 select 操作得到的结果所表征的数据状态, 无法支撑后续的业务操作. 查询得到的数据状态不准确,导致幻读.

四种隔离级别
通过设置隔离级别,可以防止上面的三种并发问题.MySQL数据库有四种隔离级别 上面的级别最低,下面的级别最高。
image.png

隔离级别相关命令

1) 查看隔离级别
select @@tx_isolation;
image.png

2) 设置事务隔离级别,需要退出 MySQL 再重新登录才能看到隔离级别的变化
set global transaction isolation level 级别名称;
read uncommitted 读未提交
read committed 读已提交
repeatable read 可重复读
serializable 串行化

例如: 修改隔离级别为 读未提交
set global transaction isolation level read uncommitted;

九、数据库设计

数据库三范式(空间最省)

概念: 三范式就是设计数据库的规则.
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式,满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF) , 其余范式以此类推。一般说来,数据库只需满足第三范式(3NF)就行了

第一范式 1NF
原子性, 做到列不可拆分
第一范式是最基本的范式。数据库表里面字段都是单一属性的,不可再分, 如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式。

地址信息表中, contry这一列,还可以继续拆分,不符合第一范式
image.png
第二范式 2NF
在第一范式的基础上更进一步,目标是确保表中的每列都和主键相关。一张表只能描述一件事.
比如,学员信息表中其实在描述两个事物 , 一个是学员的信息,一个是课程信息,如果放在一张表中,会导致数据的冗余,如果删除学员信息, 成绩的信息也被删除了
image.png

第三范式 3NF
消除传递依赖,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放,
通过number 与 price字段就可以计算出总金额,不要在表中再做记录(空间最省)
image.png

数据库反三范式

反范式化指的是通过增加冗余或重复的数据来提高数据库的读性能,浪费存储空间,节省查询时间 (以空间换时间)。
设计数据库时,某一个字段属于一张表,但它同时出现在另一个或多个表,那么这个字段就是一个冗余字段
image.png
当需要查询“订单表”所有数据并且只需要“用户表”的name字段时, 没有冗余字段 就需要去join连接用户表,假设表中数据量非常的大, 那么这次连接查询就会很大程度上消耗系统性能。这时候冗余的字段就可以派上用场了, 有冗余字段我们查一张表就可以了.

总结

创建一个关系型数据库
1、尽量遵循范式理论的规约,尽可能少的冗余字段,让数据库设计看起来精致、优雅
2、合理的加入冗余字段,减少join,让数据库执行性能更高更快。
**