一,下载MySQL
这是下载地址:https://dev.mysql.com/downloads/mysql

二,安装步骤
下载好的文件,解压到你想安装的地方

解压好后,默认是没有my.ini文件的,需要我们自己创建一个:
[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\\Program_Files_self\\MySQL
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
# datadir=D:\\Program_Files_self\\MySQL\\MySQLData
# 允许最大连接数
max_connections=20
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
命令行操作
- 以管理员身份打开 cmd 命令行工具,按下Shift+Ctrl+Enter键即可
- 用cd命令切换到自己的安装目录下的 bin 文件夹
- 如果在D盘,再键入D:即可进入目录
#安装
mysqld install
#初始化数据库
mysqld --initialize --console
执行完成后会输出 root 用户的初此密码

#启动服务
net start mysql
#登录
mysql -u root -p
遇到的问题
出现 “ERROR 1045 (28000): Access denied for user ‘root’@’localhost‘ (using password: YES)”
解决方案:
#停止MySQL服务
net stop mysql
#跳过权限验证启动 MySQL
mysqld --console --skip-grant-tables --shared-memory
无密码登录并重置密码
重新打开一个新的 CMD 窗口,进入bin目录
#登录
mysql -u root -p
#提示输入密码时,直接按回车(无密码登录)
#登录后,执行以下命令重置密码(替换新密码为你的密码)
-- 切换到mysql系统数据库
use mysql;
-- 重置root密码(MySQL 8.0+ 必须用此语法)
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
-- 刷新权限
FLUSH PRIVILEGES;
-- 退出
exit;
重启 MySQL 服务:
关闭之前 “跳过权限验证” 的 CMD 窗口(停止临时服务)
在新 CMD 窗口中启动服务:
net start mysql
其他
mysql> ALTER USER ‘root’@’localhost‘ IDENTIFIED BY ‘root’; ERROR 1290 (HY000): The MySQL server is running with the –skip-grant-tables option so it cannot execute this statement
如果出现以上问题:
先刷新权限,再修改密码,具体步骤如下:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
exit;
之后按之前的步骤关闭临时启动的 MySQL 窗口,重新启动正常的 MySQL 服务,即可用新密码登录。
Navicat安装
Navicat Premium 16 保姆级手把手 安装教程包含下载、安装、授权(附安装包)-CSDN博客
Mysql使用
Mysql数据库通过SQL(结构化查询语言)语句对数据进行操作。
SQL操作语句可以分为三种:
- DDL(数据定义语言)
- DML(数据操作语言)
- DQL(数据查询语言)
DDL(数据定义语言)
作用:定义和管理数据库、表的结构。
关键字:CREATE,ALTER,DROP
DML(数据操作语言)
作用:对表中的数据进行增、删、改。
关键字:INSERT,UPDATE,DELETE
DQL(数据查询语言)
作用:查询表中的数据。
关键字:SELECT
查询
条件查询,如一条完整的sql查询语句结构为
SELECT [DISTINCT] 列名1, 列名2, ... -- 要查询的列(* 表示所有列)
FROM 表名 -- 数据来源的表
[JOIN 关联表名 ON 关联条件] -- 多表关联(可选)
[WHERE 筛选条件] -- 行级过滤(核心:条件查询)
[GROUP BY 分组列] -- 分组(可选)
[HAVING 分组后筛选条件] -- 分组后过滤(可选)
[ORDER BY 排序列 [ASC/DESC]] -- 排序(可选)
[LIMIT 行数 [OFFSET 偏移量]] -- 限制结果行数(可选,不同数据库语法略有差异)
基础结构
-- 基础结构:SELECT + FROM + WHERE
SELECT name, age
FROM student
WHERE gender = '女' AND age > 18;
SELECT:指定需要查询的字段,使用*表示查询所有字段
FROM:指定数据来源的表名
WHERE:定义筛选条件,只有满足该条件的记录才会被返回
二、常用运算符
1. 比较运算符
比较运算符是最基础的条件判断工具,用于判断字段值与目标值的关系:
=:等于!=/<>:不等于>:大于<:小于>=:大于等于<=:小于等于
2. 范围运算符
当需要判断字段值是否在某个连续区间时,使用BETWEEN ... AND ...会让语句更简洁:
-- 查询年龄在18到25岁之间的学生
SELECT * FROM student WHERE age BETWEEN 18 AND 25;
3. 模糊匹配
使用LIKE关键字可以实现模糊查询,通常配合通配符使用:
%:匹配任意长度的任意字符(包括 0 个字符)_:匹配单个任意字符
-- 查询姓张的学生
SELECT * FROM student WHERE name LIKE '张%';
-- 查询名字为两个字且姓张的学生
SELECT * FROM student WHERE name LIKE '张_';
4. 集合运算符
IN关键字用于判断字段值是否属于指定的集合,适合处理离散的多个取值:
-- 查询学号为1001、1003、1005的学生
SELECT * FROM student WHERE id IN (1001, 1003, 1005);
SQL 连接查询:LEFT JOIN 与 RIGHT JOIN 详解
在多表关联查询的场景中,LEFT JOIN(左连接)和RIGHT JOIN(右连接)是实现数据关联的核心方式,二者的核心区别在于保留的表数据不同。
一、LEFT JOIN(左连接)
核心特点
- 数据保留规则:保留左表(
FROM后的第一个表)的所有记录,即使右表中没有匹配的记录。 - 无匹配处理:当右表无匹配记录时,右表对应的字段会显示为
NULL。
基础语法
SELECT 字段 FROM 表1 LEFT JOIN 表2 ON 关联条件;
应用场景
适用于需要以左表数据为基础,关联右表补充信息的场景,例如:
- 查询所有学生的选课信息,包括没有选课的学生
SELECT student.name, course.course_name
FROM student LEFT JOIN course
ON student.id = course.student_id;
二、RIGHT JOIN(右连接)
核心特点
- 数据保留规则:保留右表(
JOIN后的表)的所有记录,即使左表中没有匹配的记录。 - 无匹配处理:当左表无匹配记录时,左表对应的字段会显示为
NULL。
基础语法
SELECT 字段 FROM 表1 RIGHT JOIN 表2 ON 关联条件;
应用场景
适用于需要以右表数据为基础,关联左表补充信息的场景,例如:
- 查询所有课程的选课学生,包括没有学生选择的课程
SELECT student.name, course.course_name
FROM student RIGHT JOIN course
ON student.id = course.student_id;
三、核心区别对比
| 维度 | LEFT JOIN | RIGHT JOIN |
|---|---|---|
| 保留的表 | 左表 | 右表 |
| 无匹配时的字段值 | 右表字段为 NULL | 左表字段为 NULL |
| 典型使用场景 | 以左表为主,补充右表信息 | 以右表为主,补充左表信息 |
ER 图与物理表的关系解析
ER 图是数据库设计的蓝图,而物理表是其在数据库中的最终实现,二者共同构成了从数据建模到数据存储的完整链路。
一、ER 图:数据库的设计蓝图
定义
ER 图(实体 – 关系图)是用图形化方式描述数据及其关系的工具,是数据库设计阶段的核心产出物。
核心三要素
- 实体(Entity):用矩形表示,对应业务中的核心对象,例如 “学生”“课程”。
- 属性(Attribute):用椭圆形表示,是实体的特征,例如学生的 “姓名”“年龄”。
- 关系(Relationship):用菱形表示,描述实体之间的关联,例如学生 “选课”。
核心作用
清晰规划数据结构与业务关系,提前梳理数据之间的依赖,为后续物理表的创建提供明确依据。
二、物理表:ER 图的具体实现
定义
物理表是 ER 图在数据库中的具体实现,是真实存储数据的二维表结构,也是所有 SQL 操作(增删改查)的最终对象。
与 ER 图的对应关系
| ER 图元素 | 物理表对应项 |
|---|---|
| 实体(Entity) | 表(Table) |
| 属性(Attribute) | 字段(列 / Column) |
| 关系(Relationship) | 主键 / 外键(Primary Key/Foreign Key) |
核心作用
作为数据的最终载体,通过定义字段类型、约束和关联,将 ER 图的设计转化为可操作的数据库对象。
三、从 ER 图到物理表的设计流程
- 需求梳理:分析业务场景,识别核心实体、属性与关系。
- 绘制 ER 图:用图形化方式呈现数据模型,验证业务逻辑的合理性。
- 表结构设计:将 ER 图的实体转化为表,属性转化为字段,关系转化为键约束。
- 数据库落地:通过
CREATE TABLE等 SQL 语句创建物理表,完成从设计到存储的转化。
数据库操作(Database)
1. 创建数据库
-- 基础语法
CREATE DATABASE [IF NOT EXISTS] 数据库名
[DEFAULT CHARACTER SET 字符集]
[DEFAULT COLLATE 排序规则];
-- 示例:创建名为school的数据库,指定UTF8字符集
CREATE DATABASE IF NOT EXISTS school
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
IF NOT EXISTS:避免重复创建报错(推荐必加)
常用字符集:utf8、utf8mb4(支持 emoji)
删除数据库
-- 基础语法
DROP DATABASE [IF EXISTS] 数据库名;
-- 示例:删除school数据库
DROP DATABASE IF EXISTS school;
选择数据库
USE school; -- 切换到school数据库
二、数据表操作(Table)
1. 创建数据表
-- 基础语法
CREATE TABLE [IF NOT EXISTS] 表名 (
字段1 数据类型 [约束条件],
字段2 数据类型 [约束条件],
...
[表级约束]
) [ENGINE=存储引擎] [DEFAULT CHARSET=字符集];
-- 示例:创建student学生表
CREATE TABLE IF NOT EXISTS student (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键+自增
name VARCHAR(50) NOT NULL, -- 姓名,非空
age TINYINT UNSIGNED DEFAULT 18, -- 年龄,无符号,默认18
gender ENUM('男','女','未知') DEFAULT '未知', -- 性别,枚举类型
create_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间,默认当前时间
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 常用约束:
PRIMARY KEY(主键)、NOT NULL(非空)、UNIQUE(唯一)、DEFAULT(默认值)、AUTO_INCREMENT(自增) - 常用存储引擎:
InnoDB(支持事务 / 外键,推荐)、MyISAM
删除数据表
-- 基础语法
DROP TABLE [IF EXISTS] 表名;
-- 示例:删除student表
DROP TABLE IF EXISTS student;
三、数据操作(增删改查 CRUD)
1. 新增数据(CREATE – INSERT)
-- 方式1:指定字段插入(推荐,字段顺序可自定义)
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
-- 方式2:插入多条数据(高效)
INSERT INTO 表名 (字段1, 字段2) VALUES
(值1, 值2),
(值3, 值4);
-- 示例:插入单条学生数据
INSERT INTO student (name, age, gender) VALUES ('张三', 20, '男');
-- 示例:插入多条学生数据
INSERT INTO student (name, age, gender) VALUES
('李四', 21, '女'),
('王五', 19, '男');
查询数据(READ – SELECT)
-- 基础语法
SELECT [DISTINCT] 字段1, 字段2, ... -- DISTINCT去重
FROM 表名
[WHERE 条件] -- 筛选条件
[ORDER BY 字段 [ASC/DESC]] -- 排序,ASC升序(默认),DESC降序
[LIMIT 起始位置, 条数]; -- 分页
-- 示例1:查询所有学生信息
SELECT * FROM student;
-- 示例2:查询年龄大于19的男生,按年龄降序
SELECT name, age FROM student
WHERE age > 19 AND gender = '男'
ORDER BY age DESC;
-- 示例3:分页查询,第1页(从0开始),每页10条
SELECT * FROM student LIMIT 0, 10;
更新数据(UPDATE)
-- 基础语法
UPDATE 表名
SET 字段1=值1, 字段2=值2, ...
[WHERE 条件]; -- 必加!否则更新全表数据
-- 示例:将张三的年龄改为22
UPDATE student
SET age = 22
WHERE name = '张三';
⚠️ 重要:UPDATE 语句必须加 WHERE 条件,否则会修改表中所有记录!
删除数据(DELETE)
-- 基础语法
DELETE FROM 表名 [WHERE 条件]; -- 必加!否则删除全表数据
-- 示例:删除姓名为王五的学生
DELETE FROM student WHERE name = '王五';
-- 清空表(自增主键重置,慎用)
TRUNCATE TABLE student;
ELETE:删除数据,自增主键不重置,可回滚(事务中)TRUNCATE:清空表并重置结构,不可回滚,效率更高

