MySQL自学笔记

目录

1、初识MySQL

1.1、为什么学习数据库

1.2、什么是数据库

1.3、数据库分类

 1.4、MySQL简介

1.5、MySQL的安装

 1.6、安装SQLyog

1.6.1、SQLyog的初次使用

 1.7、连接数据库

2 、操作数据库

2.1、操作数据库(了解)

2.2、数据库的列类型

2.3、数据库的字段属性(重点)

2.4、创建数据库表(重点)

 2.5、数据表的类型

2.6、修改和删除表

2.6.1、修改

3、MySQL数据管理

3.1、外键(了解即可)

3.2、DML语言(全部记住)——增删改

3.3、添加(insert)

3.4、修改(update)

3.5、删除(delete)

4、查询数据(最重要)

4.1、DQL

4.2、指定查询字段

4.3、where条件子句

4.4、联表查询

4.5、分页和排序

4.6、子查询嵌套查询

5、MySQL函数

5.1、常用函数

5.2、聚合函数及分组过滤

5.2.1、聚合函数

  5.2.2、分组过滤 

 5.3、数据库级别的MD5加密(扩展)                         

6、事务(面试重点)

7、索引

7.1、索引的分类

7.2、测试索引

7.3、索引原则

8、权限管理和备份

8.1、用户管理

8.2、MySQL备份

9、规范数据库设计(面试常问)

 9.1、为什么需要设计

9.2、三大范式

10、C++连接并使用MySQL数据库


1、初识MySQL

前端(页面:展示,数据!)

后台(连接点:连接数据库JDBC,连接前端(控制,控制视图跳转,和给前端传递数据))

数据库(存数据,txt,excel,word)

只会代码,学好数据库 = 混饭吃

操作系统,数据结构与算法=不错的程序猿

离散数学,数字电路,体系结构,编译原理。+实战经验=高级程序猿 

1.1、为什么学习数据库

1、岗位需求:软开岗必会数据库

2、大数据时代

3、被迫需求:存数据

4、数据库是所有软件体系中最核心的存在

1.2、什么是数据库

概念:数据仓库,软件,安装在操作系统(window,linux,mac,...)之上!SQL,可以存储大量的数据。500万

作用:存储数据,管理数据

1.3、数据库分类

关系型数据库:

  • MySWL,Oracke,Sql Server,DB2,SQLite
  • 通过表和表之间,行和列之间的关系进行数据的存储。

非关系型数据库:

  • Redis,MongDB
  • 非关系型数据库,对象存储,通过对象的自生的属性来决定

数据库管理系统(DBMS)

你的上层软件不是直接操作数据库而是去操作数据库管理系统,这个软件会根据你的指令对数据库进行一个操作。

  • 数据库的管理软件,科学有效的管理我们的数据。维护和获取数据
  • MySQL,数据库管理系统

 1.4、MySQL简介

mysql是一个关系型数据库管理系统

SQL语言

1.5、MySQL的安装

mysql安装建议:

1、尽量不要使用exe安装,卸载麻烦(注册表)

2、尽量使用压缩包安装

安装的具体教程见这篇博客

 1.6、安装SQLyog

参考博客

1.6.1、SQLyog的初次使用

任务:创建一个一个学校的数据库,学生的id,name,age

1、创建一个shcool数据库

 

 每一个sqlyog的执行操作,本质就是对应了一个sql,可以在软件的历史记录中看

 2、在school数据库中创建一个表

 3、查看表

4、尝试添加一条内容

 1.7、连接数据库

命令行连接数据库

直接在CMD中输入这个命令(我们已经配置过环境变量了)

mysql -uroot -p123456    --连接数据库

update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';    --修改密码

flush privileges;    --刷新

------------------------------------------
--所有的语句都使用分号;结尾
show databases;    --查看所有的数据库

use school    -- 切换数据库:use 数据库名,注意这里是没有分号的

show tables;    --查看数据库中所有的表

describe student;    --显示数据库中具体表的信息

create database westos;    -- 创建一个数据库

exit;    --退出连接

-- 单行注释(SQL本来的注释)

/* 
多行注释
 */ 

 MySQL中分为四种语言:增删改查

DDL:数据库定义语言

DML:数据库操作语言

DQL:数据库查询语言

DCL:数据库控制语言

2 、操作数据库

操作数据库》操作数据库中的表》操作数据库中表的数据

myysql关键字不区分大小写

2.1、操作数据库(了解)

1、创建数据库

CREATE DATABASE IF NOT EXISTS westos; --如果westos这个数据库不存在就创建一个westos数据库

2、删除数据库

DROP DATABASE IF  EXISTS westos;

3、使用数据库

use school;

4、查看数据库

show databases;    --查看所有的数据库

2.2、数据库的列类型

1、数值:

  • tinuint         十分小的数据         1个字节
  • smallint       较小的数据            2个字节
  • mediumint  中等大小的数据     3个字节
  • int               标准的整数            4个字节
  • bigint          较大的数据            8个字节
  • float            浮点数                   4个字节
  • double        浮点数                    8个字节
  • decimal      字符串形式的浮点数 金融计算的时候,一般是使用decimal

2、字符串

  • char            字符串固定的大小的     0-255
  • varchar       可变字符串                   0-65535        对应string类型
  • tinytext        微型文本                       2^8  -  1       可以存一个博客
  • text              文本串                          2^16 - 1        保存大文本

3、时间日期

  • date             YYYY-MM--DD                              日期
  • time              HH:MM:SS                                   时间格式
  • datetime       YYYY-MM--DD  HH:MM:SS         最常用的时间格式
  • timestamp     时间戳                                          较为常用
  • year               年份表示

 4、null

  • 没有值,位置
  • 注意,不要使用NULL进行运算

2.3、数据库的字段属性(重点)

 2.3.1、unsigned

  • 该列不能为负数

2.3.2、zerofill

  • 不足的位数,使用0来填充(往前面补)

2.3.3、自增

  • 自动在上一条记录的基础上加1
  • 通常用来设置唯一的主键(index),必须是整数类型
  • 可以自定义设计自增的起始值

2.3.4、非空NULL NOT null

假设设置为not null,如果不给他赋值就会报错

2.3.5、默认:

设置默认的值,如果不指定该列的值就会把默认值填充进去

拓展:

阿里的规范:每个表必须存在以下五个字段!未来做项目用的,表示一个 记录存在的意义

id——主键

version——乐观锁

is_delete——伪删除

gmt_create——创建时间

gmt_update——修改时间

2.4、创建数据库表(重点)

··中的是列的名字,后面的跟的东西全是2.3介绍的字段

-- 目标:创建一个school数据库
-- 创建学生表(列,字段)使用sql创建
-- 学号int 登录密码 姓名 性别 出生日期 家庭住址,email

-- 至一点,使用英文括号,表的名字和字段尽量使用··括起来
-- AUTO_INCREAMENT    自增
-- 字符串使用,单引号括起来
-- 所有的语句后面加,(英文),最后一个不用加
-- PRIMARY KEY 主键,一般一个表只有一个主键
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '学号',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(1) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '生日',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

格式

CREATE TABLE IF NOT EXISTS `表名`(
·字段名· 列类型 [属性][属性][属性],
·字段名· 列类型 [属性][属性][属性],
......
·字段名· 列类型 [属性][属性][属性]

)[表类型][字符集设置][注释]

常用表的应用

查看创建表的语句——创建表的逆过程

show create table student;    --展示创建表student

desc student;    --显示表的结构

 2.5、数据表的类型

INNODB

MyISAM

INNODBMyISAM
事务支持不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间的大小较小较大,约为2倍

常规使用操作:

  • MYISAM 节约空间,速度较快
  • INNODB 安全性搞,事务的处理,夺标多用户操作

在物理空间存在的位置

所有数据库文件都存在data目录下,一个文件夹就对应一个数据库

本质上还是文件的存储!

mysql引擎在物理文件上的区别

  • INNODB在数据库表中只有一个*.frm文件,以及上级目录下的ibdate1文件
  • MYISAM对应的文件

                *.frm        表结构的定义文件

                *.MYD        数据文件(data)

                *. MYI        索引文件

设置数据库表的字符集编码

charsed=utf8

不设置的话,会是mysql默认的字符集编码~(不支持中文)。mysql的默认编码是latin1,不支持中文

2.6、修改和删除表

2.6.1、修改

修改表

--格式
alter table 表名 具体操作
alter table student rename as student1     --修改表名
alter table student1 add age int(11)    --增加表的字段
-----------------------------
--修改表的字段(重命名,修改约束)
alter table student modify age varcahr(11)    --修改约束
alter table student change age age1 int(1)    --字段重命名
---------------------------------------------------
alter table student drop age1    --将age1这个字段删除

面试:modify与change的区别

modify只能修改表字段的约束

change能给字段重命名

注意点

  • ··字段名,使用这个包裹
  • 注释 -- 、/**/
  • sql
  • sql关键字大小写不敏感,尽量小写

3、MySQL数据管理

3.1、外键(了解即可)

弹幕说实际开发中是不会使用外键:表之间存在外键关系删除起来会非常麻烦,一切表的关系引用用代码来实现

删库跑路的时候会很麻烦

1、创建表的时候添加外键约束

太麻烦了,不想写

2、在创建表之后去添加外键约束

CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '学号',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(1) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '生日',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭地址',
`gradeid` INT(10) NOT NULL COMMENT '年级id' 
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

CREATE TABLE IF NOT EXISTS `grade`(
`gradid` INT(10) NOT NULL COMMENT '年纪id',
`name` VARCHAR(50) NOT NULL COMMENT '姓名'
)ENGINE=INNODB DEFAULT CHARSET=utf8

-----------------------------------------------------
--给student表添加外键
alter table `student` add constraint `FK_gradeid` foreign key(`gradid`) reference `grade(`gradeid`)

--alter table 表 add constraint 约束名    foreign key(作为外键的列) reference 哪个表(哪个字段)

 最佳实践:

数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)

我们想使用多张表的数据,想使用外键(程序去实现

3.2、DML语言(全部记住)——增删改

数据库意义:数据存储,数据管理

DML语言:数据操作语言

insert

update

delete

3.3、添加(insert)

插入一条数据与批量插入

--插入一条数据的格式
--insert into 表(`字段`,`字段`,`字段`) valuse('值1','值2','值3')
insert into `grade`(`gradename`) values('大四')
--一般写出入数据,我么一定要数据和字段一一对应
--------------------------------------------------
--同时插入多条数据
insert into `student`(`name`,`age`,`sex`) values('张三','12','男'),('李四','13','女'),('王五','23','男')
-----------------------------------------------------
--如果表明后面不跟字段那么他就会自己加上所有的字段

3.4、修改(update)

--任务修改id(主键)为1的数据的姓名
update `student` set `name`='张三' where id = 1;
--如果后面没有where那么整个表所有的name都会变成张三,发生了这种事你还是删库跑路吧
update `student` set `name`='张三'

语法

1、修改单个属性
update 表名 set `col`=具体的值 where 条件

2、修改多个属性、
update 表名 set `col1`=具体的值,`col2`=具体的值,`col3`=具体的值... where 条件

 条件:where 子句 运算符 id等于每个值,大于每个值,在某个区间

操作符含义范围结果
=等于
<>或!=不等于5<>6true
>
<
<=
>=
between...and...闭合区间
and(&&)相当于&&
or(||)或者

# 和c++里的差不过,与或换成了英语而已

注意

  • col是数据的列,尽量带傻瓜``
  • 条件,筛选的条件,如果没有指定,则会修改所有的列
  • value是一个具体的值,也可以是一个变量,比如时间
  • 多个设置的属性之间,用英文逗号隔开

3.5、删除(delete)

语法:

1、删除表中某条数据

--删除符合条件的数据
 delete from `表名`where id=1;

--删除全部数据
delete from `表名`

2、删库跑路——完全清空一个数据库表,表的结构和索引约束不会变

truncate `表名`

delete与truncate异同:

  • 相同点:都能删除数据,都不会删除表结构
  • 不同点:truncate重新设置自增列,计数器会归零,且其不会影响事务;

了解即可:delete删除的问题,重启数据库,现象

  • INNODB 自增列会从1开始(存在内粗当中,断电就丢失)
  • MyISAM继续从上一个子增量开始(存在文件中的,不会丢失)

4、查询数据(最重要)

4.1、DQL

(data query language:数据查询语言)

  • 所有的查询操作都是用它 select
  • 简单的查询,复杂的查询她都能做
  • 数据库中最核心的语言
  • 使用频率最高的语句

4.2、指定查询字段


-- 语法:select 字段 from 表名;
---------------------------------------
-- * 代表的是student表中的所有内容
select * from student;
---------------------------------------
-- 查询某个字段
select `name`,`number` from student;    -- 查询了姓名和学号两个字段
---------------------------------------------
-- 别名,给结果起一个名字 as 可以给字段起别名,也可以给表起别名
select `name` as 学号 ,`number` as 学号 from student;    -- 这样字段名字就会变,但是原始表是不会改变的
---------------------------------------------
-- 函数 concat(a,b)
select concat('姓名',name) as 新名字 from student



语法:select 字段 from 表名;

# 有的时候列的名字不是那么见名知意。我们起别名

去重 distinct

select * from result --查询全部的考试成绩
select `studentNo` from result; -- 查询有哪些学生参加了考试
-- 发现重复数据,去重
select distinct `studentNO` from result;

作用:去除select语句查询出来的结果中重复的数据,重复的数据只显示一条

select的其他用法 

select vesion(); -- 查询mysql的版本号
select 100*3-1 as 计算结果 --充当计算器
select @@auto_increment_increment --查询自增的步长

-- 学院考试成绩+1分查看
select `studentNo` , `studentresult`+1 from result;

select `表达式` from 表名

数据库中的表达式:文本值,列,null,函数,计算表达式,系统变量...

4.3、where条件子句

作用:检索数据中符合条件的值

搜索的条件由一个或者多个表达式组成。结果是一个bool值

-- 查询成绩在95与100之间的学生
select `studentNo`,`studentresult` from result
where studentresult>=95 and studentresult<=100
---------------------------------------------
select `studentNo`,`studentresult` from result
where studentresult>=95 && studentresult<=100
-----------------------------------------------
select `studentNo`,`studentresult` from result
where between 95 and 100

模糊查询:比较运算符

运算符语法描述
IS NULLa is NULL如果a是null,结果为真
IS NOT NULLa is NOT NULL如果a为not null ,结果为真
between anda between b and c若a在bc之间,结果为真
likea like bsql匹配,如果a匹配b,则结果为真
ina in (a1,a2a3...)a在这个里面就为真

 like的具体实例

like要与%还有_配合使用

--查询姓刘的同学
select `studentNO`,`studentname` from `student`
where studentname like '刘%'        --%代表有任意个字符

-- 查询姓刘的同学,名字后面只有一个字的
select `studentNO`,`studentname` from `student`
where studentname like '刘_'        -- _代表有一个字符

-- 查询姓刘的同学,名字后面只有2个字的
select `studentNO`,`studentname` from `student`
where studentname like '刘__'  

--查询名字中有嘉字的同学 
select `studentNO`,`studentname` from `student`
where studentname like '%嘉%'  

 in的具体实例

in (具体存在)

--查询1001,1002,1003号学员
--学要三个以下的sql语句才能把这三个学员的信息查出来
select `studentNo`,`studentname` from result
where studentname = 1001

--用in来操作
select `studentNo`,`studentname` from result
where studentname in (1001,1002,1003)



  is null/is not null的使用实例

--查询地址为空的学生
select `studentNo`,`studentname` from result
where `address`='' or `address` is null    --在这里你可能会犯错误 `address` =null

4.4、联表查询

--查询参加了考试的同学(学号,姓名,科目编号,分数)
select * from student
select * from result
/*思路
1、分析需求,分析查询的字段来自哪些表
2、确定使用那种连接查询
确定交叉点(这两个表中那个数据是相同的)
判断的条件:学生表的中的studentNo = 成绩表stdentNo  
*/

select s.studentNo,studentname,subjectNo,studentresult
from student ad s
inner join result as r
where s.studentNo = r.studentNo

自连接(了解)

自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

select a.`categoryName` as '父栏目' ,b.`categoryName` as '子栏目'
from `category` as a,`category` as b
where a.`categoryid`=b.`pid`

4.5、分页和排序

4.5.1、排序

 排序分为升序(asc)和降序(desc)——这两个关键词要记住

select `studentNo`,`studentresult` from result
where studentresult>=95 and studentresult<=100
order by studentresult desc    --查出来的成绩按照降序排列

---------------------------------------------------------------
select `studentNo`,`studentresult` from result
where studentresult>=95 and studentresult<=100
order by studentresult asc         --查出来的成绩按照升序排列

 4.5.2、分页

为什么分页?

缓解数据库压力,给人的体验更好,瀑布流(抖音)

-- 任务:分页,每页只显示5条数据
-- 语法:,limit 起始值,页面的大小
-- 起始值有点像数组的下标
select `studentNo`,`studentresult` from result
where studentresult>=95 and studentresult<=100
order by studentresult asc         --查出来的成绩按照升序排列
limit 0,5  

-- 第一页 limit 0,5
-- 第二页 limit 5,5
-- 第三页 limit 10,5
-- 第N页  limit (N-1)*pagesize,pagesize  
pagesize代表页面大小,(N-1)*pagesize代表的当前页

4.6、子查询嵌套查询

where(这个值是计算出来的)

本质:在where语句中嵌套一个子查询语句

where中的语句符合select的语法

5、MySQL函数

这个最好是去官网查看手册

5.1、常用函数

如何使用在你查询出来的列(字段)上套上函数

select `studentname` from student    -- 查询studentname

select concat('姓名:',studentname) from student        -- 运用函数
数学运算
select abs(-8);    -- 绝对值
select ceiling(9.4)    -- 向上取整
select floor(9.4)    -- 向上取整
select rand()    -- 返回一个0到1之间的随机数
select sign()    -- 判断一个数的符号 0就返回0,负数返回-1,正数返回1

字符串函数
select char_length('aasdfasdf')    -- 字符串长度
select concat('fasdfasdf','asfasdfasf')    -- 拼接字符串
select insert('我爱编程',1,2,'超级热爱')    -- 查询,替换 ,从第一个字符开始,替换两个字符
结果:超级热爱编程         -- 这么看字符串的开始是从1而不是c++一样从0开始
select lower('ASDFASDFasdf')     -- 全部转换为小写
select upper('fasdfas')        -- 全部转换为大写
select instr('aasdfasd','a')    -- 查询a第一次出现的位置
select replace('坚持就能成功','坚持','努力')     --结果:努力就能成功
select substr('asdfasdf',4,6)    -- 截取从4开始,6代表的是截取的长度,注意下标是从1开始的
select reverse('asdfasdf')    --将字符串反转

时间日期
select current_date()    -- 获取当前的日期:年月日
select curdate()    --获取当前的日期
select now()    -- 年月日 时分秒
select localtime    -- 本地时间
select sysdate() -- 系统时间

select year(now())
select month(now())
select day(now())
select hour(now())
select minute(now())
select second(now())

系统
select system_user()
select user()
select version()




5.2、聚合函数及分组过滤

5.2.1、聚合函数

函数名称描述
count()计数
sum()求和
avg()

平均值

max()最大值
min()最小值
...

...

  5.2.2、分组过滤 

order by `字段`        -- 分组,看你的字段里面有多少类,有多少类,分多少行
having 条件            -- 分组之后还要满足某种条件

 5.3、数据库级别的MD5加密(扩展)                         

 什么是MD5?

主要增强算法复杂度和不可逆性

MD5不可逆,具体的值的MD5是一样的

-- 加密,插入之后加密
--语法:update 表名 set 字段=md5(`字段`)
update testmd5 set pwd=md5(pwd)

-- 插入数据的时候就加密

insert into testmd5 values(4,'小明',md5('123456'))

-- 如何校验
-- 将用户传递进来的密码进行md5加密,然后比对加密后的值
select * from testmd5 where `name`='小明' and pwd=md5('123456')

6、事务(面试重点)

要么都成功,要么都失败

1、SQL执行,A给B转账        A 1000 ----> 200 B 200 (a给b转账200快)

2 、SQL执行,B收到A 的前        A 800 -----> B400

将一组SQL放在一个批次中去执行

事务原则:ACID原则,原子性,一致性,隔离性,持久性(参考链接

原子性:要么都成功,要么都失败

一致性:事务前后的数据完整性要保持一致

持久性:事务一旦提交就不可逆转,被持久化到数据库中

隔离性:互相隔离(会导致几个问题)

-- musql是默认开启事务自动提交的
set autocommit = 0 -- 关闭
set autocommit = 1 -- 开启(默认的)

-- 事务开启
start transaction    -- 标记一个事务的开启,从这个之后的sql都在同一个事务内
insert xx
insert xx
-- 提交:持久化
commit
--回滚:回到的原来的样子(失败!)
rollback
-- 事务结束
set autocommit = 1 -- 开启自动提交


-- 了解
savepoint  保存点名 --设置一个书屋的保存点
rollback to savepoint 保存点名
release savepoint  保存点名 --撤销保存点




 大概的流程

任务:模拟转账:事务(A给B转账)

set autocommit = 0 -- 关闭自动提交
start transaction    -- 开启事务(一组事务)
update account set money=money-500 where `name`='A' -- A 减去500
update account set money=money+500 where `name`='B' -- B 加上500

commit;    -- 提交事务,就被持久化了
rollback;    -- 回滚
set autocommit = 1;     -- 回复默认值

set autocommit = 0 如果你不关闭自动提交,那么执行完update account set money=money-500 where `name`='A'那么表中的值就改了。万一update account set money=money+500 where `name`='B'执行失败,那么钱的总数就变多了。

7、索引

MySQL官方对索引的定义为:索引(index) 是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构

 自己的理解:对于每个样本来说,唯一标识就是可以当作索引的,比如,每个人的邮箱是不同的,身份证号码是不同的,在比如王者荣耀他要求每个玩家的虚拟名字是不同的,这也是可以当作索引的。

7.1、索引的分类

 主键索引是唯一的,唯一索引可以有多个

主键索引(primary key)

  • 唯一标识,主键不可重复(身份证号码),只能有一个列作为主键

唯一索引(unioue key)

  • 避免重复的数据出现,唯一索引可以重复,多个列都可以标识为唯一索引

常规索引(key/index)

  • 默认的,index,key关键字来设置

全文索引(fulltext)

  • 在特定的数据库引擎下才有,MyISAM
  • 快速定位数据
1、在创建表的时候给字段增加索引
2、创建完毕后,添加索引——感觉这个用的少,是不是唯一的身份标识应该在一开始就知道

-- 显示所有的索引信息
show index from student

-- 增加索引
alter table `student` add fulltext index `studentname`(`字段名`)

-- explain分析sql执行的状况
explain select * from student;
selct * from student where match(student) against('刘')

7.2、测试索引

-- 插入100万数据.
DELIMITER $$    -- 写函数之前必须要写,标志
CREATE FUNCTION mock_data ()    ————创建一个mock_data()函数
RETURNS INT    -- 返回值的类型
BEGIN             -- 开始
	DECLARE num INT DEFAULT 1000000;        -- 定义一个num变量,并赋值100000
	DECLARE i INT DEFAULT 0;                 -- 定义一个循环变量               
	WHILE i<num DO        -- 循环操作
		INSERT INTO `app_user`(`name`,`eamil`,`phone`,`gender`)VALUES(CONCAT(用户,i),19224305@qq.com,123456789,FLOOR(RAND()*2));    --   插入数据
		SET i=i+1;        -- i的自增
	END WHILE;            -- 结束循环
	RETURN i;
END;                -- 结束

SELECT mock_data() -- 执行此函数 生成一百万条数据

索引在小数量的时候,用处不大,但是在大数据的时候,区别十分明显

7.3、索引原则

  • 索引不是越多越好
  • 不要对进程变动数据加索引
  • 小数据量的表不需要加索引
  • 索引一般加在常用来查询的字段上

索引的数据类型

hash类型的索引

Btree:索引默认的数据结构

8、权限管理和备份

8.1、用户管理

sqlyog创建用户能赋予的权限

 sql命令操作

 用户表:mysql.user

本质:对这张表进行增删改查

创建用户:create user 用户名 identified by '密码'
create user zhansan identified by '123456'
--------------------------------------------------
修改当前用户密码
set password = password('111111')

-------------------------------------------------
修改指定用户(zhansan)的密码
set password for zhansan = password('111111')

-------------------------------------------------
重命名:rename user 原名字 to 新名字
rename user zhansan to lisi

-------------------------------------------------
用户授权:授予全部的权限,除了给别人授权其他都能干,库.表(给lisi这个用户所有的权限)
grant all privileges on *.* to lisi

-------------------------------------------------
查看权限
show grants for lisi    -- 查看指定用户的权限
show grants for root@lacalhost

-------------------------------------------------
撤销权限: revoke 哪些权限,在哪个库撤销,给谁撤销
revoke all privileges on *.* from lisi

------------------------------------------------
删除用户
drop user zhansan






# 权限就是防止你删库跑路 

8.2、MySQL备份

为什么要备份

  • 保证重要的数据不丢失
  • 数据转移

MySQL数据库备份的方式

  • 直接拷贝物理文件——把data哪个文件夹直接拷贝一份
  • 在sqlyog这种可视化工具中手动导出

 他会生成一个sql文件,打开看你们全是sql语句,如果你要用相当于在执行一遍这些语句

  • 使用命令行导出 mysqldump

注意,这里是在cmd里面直接输入就好了(环境变量配置过了)

导出:
语法:mysqldump  -h主机 -u用户名 -p密码 数据库 表1  表2 表3>磁盘/文件名
mysqldump  -hlocalhost -uroot -p123456 school student >D:/a.sql

这个主机的地址是可以换的,你一可以在阿里云上dump下来

导入:
-------------------------------------------
1、先登录,切换到指定的数据库
2、musql> source D:/a.sql
-------------------------------------------
不登陆的话:
mysql -u用户名 -p密码 库名< 备份文件

 sql的备份不像excel,他是把数据转换成sql语句给你

9、规范数据库设计(面试常问)

 9.1、为什么需要设计

当数据库比较复杂的时候,我们就要设计了

糟糕的数据库设计:

  • 数据冗余,浪费空间
  • 数据插入和删除都会很麻烦、异常【屏蔽使用物理外键】
  • 程序性能差

良好的数据库设计

  • 节省内存空间
  • 保存数据库的完整性
  • 方便我们开发系统

软件开发中,关于数据库的设计

  • 分析需求:分析业务和需要处理的数据库的需求
  • 概要设计:设计关系图E-R图

设计数据库的步骤(个人博客)

1、收集信息,分析需求

用户表(用户登录注销,用户的个人信息。写博客,创建分类)

分类表(文章分类,谁创建的)

文章表(文章的信息)

友链表(友链信息)

自定义表(系统信息,某个关键的字,或者一些主字段)  key:value

2、标识实体(把需求落地到每个字段)

3、标识实体之间的关系

9.2、三大范式

参考链接

为什么需要数据规范化?

  • 信息重复
  • 更新异常
  • 插入异常
  • 删除异常

1.第一范式(1NF):列不可再分——原子性

a.每一列属性都是不可再分的属性值,确保每一列的原子性

b.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据

2.第二范式(2NF)属性完全依赖于主键

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键。

3.第三范式(3NF)属性不依赖于其它非主属性    属性直接依赖于主键

# 规范数据库的设计

10、C++连接并使用MySQL数据库

参考连接

 视频参考链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值