MySQL数据库
1|0基本概念
概念:用于存储和管理数据的仓库
数据库的特点:
- 持久化存储数据
- 方便存储和管理数据
- 使用了统一的方式操作数据库
2|0安装,卸载
安装
略,百度有,基本就两种方式:
- 绿色版压缩包
- 安装包
卸载
- 在MySQL安装目录下找到my.ini文件(MySQL的配置文件)
复制datadir地址(数据存放位置)- 卸载MySQL
- 删除MySQL安装目录文件夹
3|0启动和退出
打开windows服务命令:services.msc
启动和关闭MySQL的服务:命令提示符(管理员)
- 启动:net start mysql
- 关闭:net stop mysql
MySQL的登录和退出(本地数据库)
- 先启动MySQL服务:net start mysql
- root是管理员账号,一般管理员账号root的密码也设置为root
- 连接数据库方式1:mysql -uroot -proot
- 连接数据库方式2:mysql -uroot -p,然后输入密码
- 退出数据库方式1:exit
- 退出数据库方式2:quit
MySQL的登录和退出(远程数据库)
- 连接数据库方式1:mysql -h"ip地址" -uroot -p,然后输入连接目标的密码
如:mysql -h127.0.0.1 -uroot -p- 连接数据库方式2:mysql --host="ip地址" --user="用户名" --password="密码"
如:mysql --host=127.0.0.1 --user=root --password=root- 退出数据库方式1:exit
- 退出数据库方式2:quit
4|0目录结构
安装目录
- MySQL的安装目录下有个配置文件:my.ini
- MySQL的安装位置:my.ini文件中的basedir
数据目录
- MySQL的数据存放位置:my.ini文件中的datadir
- 数据库:文件夹(相当于)
- 表:文件
- 数据:文件的内容
5|0SQL
SQL:结构化查询语言
- 其实就是定义了操作所有关系型数据库的规则
- 每种数据库操作的方式存在不同的地方,称为“方言”
SQL的通用语法
- SQL语句可以单行或多行书写,以分号结尾
- 可以使用空格和缩进,来增强语句的可读性
- MySQL数据库的SQL语句不分大小写,关键字建议使用大写
- 注释
单行注释
-- 注释(--之后有空格)
# 注释(mysql特有)
多行注释
/* 注释 */
6|0SQL的分类
- Data Definition Language (DDL 数据定义语言) 如:建库,建表
- Data Manipulation Language(DML 数据操作语言),如:对表中的记录操作增删改
- Data Query Language(DQL 数据查询语言),如:对表中的查询操作
- Data Control Language(DCL 数据控制语言),如:对用户权限的设置
6|1DDL:操作数据库和表
操作数据库
CRUD
- C: 创建
创建数据库:create database 数据库名称;
创建数据库前判断是否存在,如果存在就不创建,不存在再创建:create database if not exists 数据库名称;
创建数据库时设置字符集:create database 数据库名称 character set gbk;
创建数据库前判断是否存在并设置字符集:create database if not EXISTS db1 CHARACTER set gbk;- R: 查询
查询所有数据库的名称:show databases;
查询数据库的创建语句和字符集:show create database 数据库名称;- U: 修改
修改数据库的字符集:ALTER DATABASE 数据库名称 CHARACTER set utf8;- D: 删除
删除数据库:DROP DATABASE 数据库名称;
删除数据库之前判断是否存在,如果存在就删除,如果不存在就不删除:DROP DATABASE if EXISTS 数据库名称;
使用数据库:
- 查询当前正在使用的数据库:SELECT DATABASE();
- 使用数据库:USE 数据库名称;
操作表
- 创建
创建表:create table 表名(
列名1 数据类型1,
列名2 数据类型2,
……,
列名n 数据类型n
);
如:create table student(
id int,
NAME VARCHAR(32),
age int,
score double(4,1),
birthday DATE,
insert_time TIMESTAMP
);- 查询
查询数据库中所有表的名称:show tables;
查询表结构:desc 表名- 修改
修改表名:alter table 表名 rename to 新的表名;
如:alter table stu rename to stu1;
修改表的字符集:ALTER TABLE 表名 CHARACTER set gbk;
添加一列:ALTER TABLE 表名 add 列名 数据类型;
修改列名称和类型:ALTER TABLE 表名 change 列名 新的列名 新的类型;
修改列类型:ALTER TABLE 表名 modify 列名 新的类型;
删除列:ALTER TABLE 表名 DROP 列名;- 删除
删除表:drop table 表名;
删除表之前判断表是否存在:drop table if exists 表名;- 复制
复制表:create table 目标表名 like 原始表名;
如:create table stu like student;
常用的数据类型:
- int:整数
如:age int- double:小数类型
如:score double(5,2)
共5位小数,小数点后保留2位
最大就是999.99- date:日期,只包含年月日,yyyy-MM-dd
- datetime:日期,包含年月日时分秒,yyyy-MM-dd HH:mm:ss
- timestamp:时间戳类型,包含年月日时分秒,yyyy-MM-dd HH:mm:ss
如果不给这个字段赋值 或 赋值为null,则默认使用当前系统时间来自动赋值- varchar:字符串类型
如:name varchar(20)
姓名最大20个字符
6|2DML:增删改表中的数据
添加数据
删除数据
修改数据
6|3DQL:查询表中的数据
基础查询
- 多个字段的查询
- 去除重复
- 计算列
- 起别名
- 多个字段的查询
- 去除重复
- 计算列
- 起别名
条件查询
- where子句 + 条件
- 运算符:
> 、< 、<= 、>= 、= 、<>
BETWEEN...AND
IN( 集合)
LIKE ' 张%'
IS NULL
and 或 &&
or 或 ||
not 或 !
条件查询-模糊查询
- _:表示单个任意字符
- %:表示多个任意字符
排序查询
语法:order by 子句
- order by 排序字段1 排序方式1,排序字段2 排序方式2……
排序方式:
- ASC:升序,默认的
- DESC:降序
聚合函数
将一列数据作为一个整体,进行纵向计算
- count:个数
一般使用主键:SELECT COUNT(*) FROM 表名;
count( * ):不推荐使用- max:最大值
- min:最小值
- sum:求和
- avg:求平均数
注意:聚合函数计算时,null值不加入计算
计算个数
语法:SELECT COUNT(列名) FROM 表名;
最大值
语法:select MAX(列名) FROM 表名;
最小值
语法:select MIN(列名) FROM 表名;
求和
语法:select SUM(列名) FROM 表名;
平均值
语法:select AVG(列名) FROM 表名;
分组查询
语法:group by 分组字段;
注意:
- 分组之后查询的字段:分组字段、聚合函数
- where和having的区别?
- where在分组之前进行限定,如果不满足限定条件,就不参与分组
- having在分组之后进行限定,如果不满足限定条件,就不显示出来
- where后不可以跟聚合函数,having后可以加上聚合函数的判断
分页查询
语法:limit 开始的索引,每页的查询条数;
- 开始的索引:0代表第一条数据
- 开始的索引 = (当前页码 - 1) * 每页显示的条数
注意:limit是一个方言,只在MySQL中使用
6|4DCL:管理用户权限
查询用户
添加用户
修改密码
注意:
- 旧版需要 password()函数给密码加密
- 新版取消了password关键字,改为了authentication_string关键字
- 新版取消了password()函数
如果忘记root用户的密码,该怎么办?
- 在命令提示符管理员的权限下,停止mysql服务:net stop mysql;
- 使用无验证方式,启动MySQL服务:mysqld --skip-grant-tables,回车;
- 新打开一个命令提示符窗口输入:MySQL,回车;
- 登录之后,使用命令更改root账户的密码;
- 使用任务管理器,手动结束mysqld.exe进程;
- 在命令提示符管理员的权限下,打开mysql服务:net start mysql;
- 通过更改之后的 root账户的密码,登录MySQL数据库;
删除用户
管理用户权限
授予用户的权限(权限列表)
- 如 CREATE、ALTER、SELECT、INSERT、UPDATE 等;
- 如果要授予所有的权限则使用 ALL;
7|0约束
概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
约束的分类:
- 主键约束:primary key
- 非空约束:not null
- 唯一约束:unique
- 外键约束:foreign key
非空约束
- 非空约束:某一列的值不能为null
- 添加非空约束的两种方式
- 创建表时,添加非空约束
- 创建完表之后,添加非空约束
唯一约束
- 某一列的值不能重复
- 唯一约束可以有null值,但只能有一条记录为null
- 删除唯一约束
- ALTER TABLE 表名 DROP INDEX 列名;
- 添加唯一约束的两种方式
- 创建表时,添加唯一约束
- 创建完表之后,添加唯一约束
主键约束
- 主键:非空且唯一
- 一张表只能有一个字段为主键
- 主键就是表中记录的唯一标识
- 添加主键约束的两种方式
- 创建表时,添加主键约束
- 创建完表之后,添加主键约束
- 删除主键:ALTER TABLE 表名 DROP PRIMARY KEY;
4.主键自动增长:auto_increment
- 自动跟随上一条记录的最大值进行+1
主键约束-自动增长
如果某列是数值类型,可以使用auto_increment实现自动增长
- 自动增长一般配合主键id使用
- 主键id自动增长,会自动跟随上一条记录的id最大值进行+1
运行结果:id自动增长成功
外键约束
- 外键约束:让表与表产生关系,从而保证数据的正确性
- 外键可以为null(没有关联),但是不可以为主表中不存在的值
- 添加外键约束的方式
- 在创建表时,添加外键约束
create table 表名(
……
外键列,
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);- 在创建表之后,添加外键约束
ALTER TABLE 表名 ADD constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称);
- 删除外键
- ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
案例
创建emp表,并添加数据
- 发现emp表中有多条重复的内容
- dep_name:部门名称
- dep_location:部门位置
- 使用外键约束进行优化
1.创建部门表department,并添加数据
这样就没有了重复内容
2.创建员工表employee
dep_id关联department表中的部门信息
- 但是这样并没有真正的起作用
- 让我们使用外键约束来重新设计表吧
3.在创建表时,添加外键约束
使用外键约束,重新设计数据库表
此时employee表已经和主表department通过外键约束关联起来了
删除外键
在创建表之后,添加外键约束
外键约束-级联操作
- 主表中的列,被外键约束之后,就不能随意更改了;如果想要更改,就要设置级联操作
- 添加外键时,设置级联操作:
ALTER TABLE 表名 ADD constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;
- 级联操作的分类
- 级联更新:ON UPDATE CASCADE
表的外键列,随着关联的主表列的改变,而自动改变- 级联删除:ON DELETE CASCADE
表中的记录,随着主表数据的删除,而自动删除
查看更改后的主表department数据
SELECT * FROM department;
主表数据更改之后,employee表中的外键也随之更新了
SELECT * FROM employee;
查看删除数据之后的主表department数据
SELECT * FROM department;
可以看到删除主表department中的数据之后,employee表中与之相关联的数据也被删除了
SELECT * FROM employee;
8|0数据库的设计
- 多表之间的关系
- 一对一
- 一对多(多对一)
- 多对多
- 数据库设计的范式
8|11. 多表之间的关系
- 一对一: 一个人只有一个身份证,一个身份证只能对应一个人
- 一对多(多对一): 一个部门有多个员工,一个员工只对应一个部门
- 多对多: 一个学生可以选择多门课程,每门课程也可以被多个学生选择
多表关系:一对多关系实现
如:部门和员工
- 实现方式:在多的一方建立外键,指向一的一方的主键
多表关系:多对多关系实现
如:学生和课程
- 实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键。
- 联合主键:PRIMARY KEY(a,b);
多表关系:一对一关系实现(了解)
如:人和身份证
- 实现方式:任意一方添加唯一外键,指向另一方的主键
- 注意:一对一的关系,一般设计成一张表
8|22. 范式
概念
设计数据库时,需要遵循的一些规范;首先要遵循三大范式。
- 好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储,这些规则就称为范式。
分类
- 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
- 满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。
- 一般说来,数据库只需满足第三范式(3NF)就行了。
详解
第一范式
每一列不可再拆分,称为原子性
第二范式
在 1NF 的基础上所有列完全依赖于主键列
特点:
- 一张表只描述一件事情。
- 表中的每一列都完全依赖于主键
- 函数依赖:A-->B,如果通过A(属性或属性组)的值,可以确定唯一 B属性的值。则称B依赖于A
- 完全函数依赖:A-->B,A是一个属性组,如果B属性的值需要依赖于A中所有的属性值,则称B完全依赖于A
- 部分函数依赖:A-->B,A是一个属性组,如果A中的某些属性值就能确定B属性的值,则称B部分依赖于A
- 传递函数依赖:A-->B-->C,如果通过A(属性或属性组)的值,可以确定唯一 B属性的值;通过B(属性或属性组)的值,可以确定唯一 C属性的值。则称C传递依赖于A
- 码:如果在一张表中,一个属性或者属性组被其他所有属性完全依赖,则称这个属性或属性组为该表的码。
主属性:码属性组中的所有属性
非主属性:除过码属性组中的属性
第三范式
在满足 2NF 的基础上,任何非主列不得传递依赖于主键
9|0数据库的备份和还原
9|1命令行方式
10|0多表查询
多表查询的分类
- 内连接:隐式内连接、显式内连接
- 外连接:左外连接、右外连接
- 子查询
创建部门表和员工表,并添加信息
查询部门表和员工表中的笛卡尔积
笛卡尔积:A集合与B集合的所有的组合结果
使用多表查询可以消除无用信息
10|11.内连接
- 从哪些表中查询数据
- 条件是什么
- 查询哪些字段
隐式内连接:使用where条件消除无用数据
显式内连接
语法:select 字段列表 from 表名1 inner join 表名2 on 条件
10|22.外连接
左外连接
语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;
- 查询的是左表所有数据以及与右表的交集部分
右外连接
语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
- 查询的是右表所有数据以及与左表的交集部分
10|33.子查询
概念:查询中嵌套查询,称嵌套查询为子查询
情况1
子查询的结果是单行单列的
- 子查询可以作为条件,使用运算符(>, <, =, >=, <=) 去判断。
情况2
子查询的结果是多行单列的
- 子查询可以作为条件,使用运算符 in 去判断。
情况3
子查询的结果是多行多列的
- 子查询可以当做一张虚拟表来参与查询
11|0事务
11|1基本介绍
概念:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作,要么同时成功,要么同时失败。
- 开启事务:START TRANSACTION;
- 回滚:ROLLBACK;
- 提交事务:COMMIT;
事务提交的两种方式
手动提交:
- 需要先开启事务,再提交;
自动提交:
- MySQL数据库中事务默认自动提交,一条DML(增删改)语句会自动提交一次事务;
- Oracle数据库中事务默认手动提交;
事物的默认提交方式
11|2事务四大特征
- 原子性:不可分割的最小操作单位,要么同时成功,要么同时失败;
- 持久性:事务一旦提交或者回滚,数据库将持久化访问数据;
- 隔离性:多个事物之间,相互独立;
- 一致性:事务操作前后,数据总量不变;
11|3事务隔离级别
概念
多个事物之间相互独立,如果多个事务操作同一批数据,则会引发一些问题;设置不同的隔离级别,就可以解决这些问题;
存在问题
- 脏读:一个事务读取到另一个事务中,没有提交的数据;
- 不可重复读(虚读):在同一个事物中,两次读取到的数据不一样;
- 幻读:一个事务操作(DML)数据表中所有的记录,另一个事务添加了一条数据,导致第一个事务查询不到自己的修改;
隔离级别
read uncommited:读未提交
- 产生的问题:脏读、不可重复读、幻读;
read commited:读已提交(Oracle默认)
- 产生的问题:不可重复读、幻读;
repeatable read:可重复读(MySQL默认)
- 产生的问题:幻读;
serializable:串行化
- 可以解决所有的问题;
注意:隔离级别从小到大,安全性递增,效率递减;
数据库查询 / 设置隔离级别
- 查询隔离级别:select @@tx_isolation;
- 设置隔离级别:set global transaction isolation level 隔离级别;
__EOF__

本文链接:https://www.cnblogs.com/chawaner/p/17396669.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix