前言

在数据驱动的今天,数据库就像信息系统的“超级仓库”,我们日常用的微信聊天记录、外卖订单、游戏装备数据,都离不开它的存储和管理。无论是互联网公司的核心业务,还是小团队的日常办公,数据库都是不可或缺的核心组件。

这篇文章会从最基础的概念讲起,一步步带你认识数据库、学会安装MySQL,再到熟练操作和管理数据库。内容尽量通俗,避免复杂术语堆砌,同时不遗漏关键细节,哪怕是新手也能跟着学、跟着做。

一、数据库概述

1.1 前置知识

在企业应用中,数据库通常不是单独工作的,而是和其他软件组成架构来发挥作用,最常见的有两种:

  • LAMP架构:Linux(操作系统)+ Apache(网页服务器)+ MySQL/MariaDB(数据库)+ PHP(编程语言)
  • LNMP架构:Linux(操作系统)+ Nginx(网页服务器)+ MySQL/MariaDB(数据库)+ PHP(编程语言)

简单说,这两种架构就像一套“网站运行套装”,数据库在里面专门负责存储和管理核心数据,比如微信的聊天内容、美团的订单信息、王者荣耀的玩家战绩。

1.2 数据库基本概念

1.2.1 数据

数据是描述客观事物的符号记录,比如数字、文字、图片、语音都算数据。它的存储很有规律:

  • 以“记录”为单位存储,格式统一,比如每个学生的信息就是一条记录;
  • 相同类型的数据会放在一起,不会把学生数据和图书数据混放;
  • 在MySQL里,数据的存储路径是:MySQL服务 → 数据库 → 数据表 → 行(记录)+ 列(字段)。
1.2.2 表

表是数据库里组织数据的基本单位,结构很简单,就是“行+列”:

  • 行:就是一条记录,比如一个学生的完整信息;
  • 列:就是一个字段,比如学生的学号、姓名、性别;
  • 特点:多用户可以共享访问,数据重复少(冗余度低),而且独立性强,不会轻易受其他数据影响。
1.2.3 数据库

数据库就是多张相关数据表的集合,是按照特定规则组织起来的数据集。比如“学校数据库”里,会包含“学生表”“教师表”“课程表”等,这些表相互关联,共同构成完整的学校数据体系。

1.2.4 数据库管理系统(DBMS)

DBMS是操作和管理数据库的软件,相当于数据库的“管理员工具”,主要能做这些事:

  1. 建库与维护:创建数据表、备份恢复数据、优化性能;
  2. 数据定义:设定数据结构、存储方式、保密规则;
  3. 数据操作:查询、统计、修改数据;
  4. 运行管理:控制多用户同时访问、管理用户权限;
  5. 通信:和其他软件交互,比如和Office办公软件对接。
1.2.5 数据库系统(DBS)

数据库系统是一个完整的“人机组合”,包括:硬件(电脑服务器)、操作系统(比如Linux)、数据库、DBMS软件、应用软件(比如Navicat)、用户(包括专业的数据库管理员DBA)。

DBMS的工作流程很直观:

  1. 接收用户或软件的请求(比如“查询学生成绩”);
  2. 把请求转换成数据库能看懂的底层指令;
  3. 执行指令操作数据库;
  4. 获取操作结果;
  5. 把结果整理成用户能看懂的格式;
  6. 返回给用户。

1.3 数据库发展史

数据库的发展经历了三个主要阶段,一步步变得更易用、更强大:

1.3.1 第一阶段:层次型/网状型数据库
  • 代表产品:IBM在1969年推出的IMS;
  • 特点:用复杂的指针连接数据,结构不直观,操作难度大,现在很少用了。
1.3.2 第二阶段:关系型数据库
  • 核心突破:1970年,IBM研究员E.F. Codd提出“关系模型”,把数据放在二维表里,用数学集合和关系代数操作数据,不用复杂指针;
  • 代表产品:IBM的System R(第一个实现关系模型的实验性数据库)、加州大学的Ingres(PostgreSQL的前身);
  • 意义:让SQL(结构化查询语言)成为主流,现在常用的MySQL、Oracle、SQL Server都源于此。
1.3.3 第三阶段:新型数据库
  • 特点:面向对象、开放性强、支持多平台;
  • 趋势:SQL和NoSQL混合使用;
  • 代表产品:MariaDB、PostgreSQL、时序数据库(专门处理时间相关数据)。

1.4 关系型数据库

  • 数据模型:用E-R模型(实体-关系),行是实体(比如一个学生),列是属性(比如学号);
  • 核心特点:表与表之间有明确关系(一对一、一对多、多对多),比如“学生表”和“成绩表”通过学号关联;
  • 主键:表中唯一标识每条记录的字段,像学号、身份证号一样,唯一且不能为空;
  • 常见产品:MySQL、Oracle、SQL Server、DB2、PostgreSQL。

1.5 非关系型数据库(NoSQL)

NoSQL的意思是“Not Only SQL”,不是不用SQL,而是存储方式不局限于二维表,支持键值对、文档、列式等多种形式。

1.5.1 NoSQL优点
  1. 格式灵活:能存键值对、文档、图片等各种数据;
  2. 速度快:基于内存存储,读写效率高;
  3. 扩展性强:容易横向扩展,应对大量用户访问;
  4. 成本低:大多是开源软件,部署简单。
1.5.2 NoSQL缺点
  1. 不支持标准SQL,查询语法不统一;
  2. 事务处理能力弱,比如转账这类需要原子操作的场景不适用;
  3. 复杂查询支持不足,多表关联查询不如关系型数据库方便;
  4. 大部分数据存在内存,内存成本较高。
1.5.3 Redis与Memcached对比

两者都是常用的NoSQL缓存数据库,核心作用是存储热点数据(比如高频访问的商品信息):

  • 相同点:基于内存运行,速度快,专门缓存热点数据;
  • 不同点:Redis支持数据持久化(数据能保存到硬盘,断电不丢失),Memcached是纯内存存储,断电数据就没了。

1.6 关系型与非关系型数据库对比

特点 关系型数据库 非关系型数据库
数据结构 二维表(行+列) KV、文档、列式、图形等
优点 结构清晰,SQL通用,支持复杂查询和事务 格式灵活,速度快,高并发支持好
缺点 表结构固定,高并发下有I/O瓶颈 无标准SQL,事务弱,复杂查询差
代表产品 MySQL、Oracle、SQL Server Redis、MongoDB、HBase

1.7 小结

  1. 主流数据库分两类:关系型(MySQL/Oracle)和非关系型(Redis/MongoDB);
  2. DBMS是连接用户和数据库的桥梁,负责处理所有数据操作请求;
  3. 选型思路:
    • 数据结构化、关系清晰(比如财务数据、学生信息)→ 选关系型数据库;
    • 高并发、非结构化数据(比如社交软件聊天记录、大数据分析)→ 选非关系型数据库;
  4. 实际应用中常混合使用:比如用Redis做缓存(提升访问速度),MySQL做持久化存储(保证数据安全)。

二、MySQL安装与配置

下面以MySQL 5.7为例,详细讲解源码编译安装的步骤,每个步骤都附具体命令和说明,新手也能跟着操作。

2.1 环境准备

首先要安装编译所需的工具和依赖库,同时创建MySQL专用用户(避免用root用户运行,更安全):

  1. 安装依赖:
yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake
  • gcc/gcc-c++:编译代码的工具;
  • ncurses/ncurses-devel:字符终端交互库;
  • bison:语法分析器;
  • cmake:MySQL专属编译工具。
  1. 创建MySQL用户:
useradd -s /sbin/nologin mysql
  • 这个用户只能运行MySQL服务,不能登录系统,更安全。

2.2 源码解压与依赖处理

  1. 解压MySQL源码包到/opt目录:
tar zxvf mysql-5.7.17.tar.gz -C /opt
  1. 解压Boost依赖包(MySQL 5.7需要Boost支持):
tar zxvf boost_1_59_0.tar.gz -C /usr/local/
mv /usr/local/boost_1_59_0 /usr/local/boost
  • 把解压后的Boost目录重命名为boost,方便MySQL编译时查找。

2.3 CMake编译配置

  1. 进入MySQL源码目录:
cd /opt/mysql-5.7.17/
  1. 执行CMake配置(关键参数说明附后):
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=/usr/local/boost \
-DWITH_SYSTEMD=1
  1. 编译并安装(-j 4表示用4个CPU核心编译,速度更快,可根据自己服务器核心数调整):
make -j 4 && make install
  • 注意:如果CMake配置出错,要先删除CMakeCache.txt文件,再重新执行配置命令。

关键参数说明:

  • DCMAKE_INSTALL_PREFIX:MySQL安装路径(固定为/usr/local/mysql);
  • DMYSQL_UNIX_ADDR:数据库连接文件(sock文件)的存储路径;
  • DSYSCONFDIR:配置文件(my.cnf)的路径;
  • DDEFAULT_CHARSET:默认字符集(utf8,支持中文);
  • DWITH_INNOBASE_STORAGE_ENGINE:启用InnoDB存储引擎(常用核心引擎);
  • DMYSQL_DATADIR:数据库文件的存储路径;
  • DWITH_BOOST:指定Boost依赖的路径;
  • DWITH_SYSTEMD:生成systemctl可管理的服务文件。

2.4 MySQL配置

2.4.1 权限设置

给MySQL安装目录和配置文件设置正确的权限,让mysql用户能读写:

chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf
2.4.2 配置文件修改

编辑/etc/my.cnf文件,添加以下配置(直接复制粘贴即可):

[client]
port = 3306
socket=/usr/local/mysql/mysql.sock
default-character-set=utf8

[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

[mysql]
port = 3306
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock
auto-rehash

关键配置说明:

  • [client]:客户端连接配置,端口3306(MySQL默认端口),字符集utf8;
  • [mysqld]:服务器核心配置,允许任意IP连接(bind-address=0.0.0.0),最大连接数2048,默认存储引擎InnoDB;
  • [mysql]:客户端工具配置,开启自动补全(auto-rehash),命令行操作更方便。

2.5 环境变量设置

把MySQL的命令添加到系统环境变量,这样在任何目录都能执行mysql命令:

echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
  • source /etc/profile:让环境变量立即生效。

2.6 数据库初始化

初始化MySQL数据库,创建系统表和空密码的root用户:

cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
  • –initialize-insecure:表示创建空密码的root用户,后续自己设置密码。

2.7 服务管理

把MySQL注册为系统服务,用systemctl管理(启动、停止、开机自启):

  1. 复制服务文件:
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
  1. 重新加载系统服务:
systemctl daemon-reload
  1. 启动MySQL并设置开机自启:
systemctl start mysqld.service
systemctl enable mysqld
  1. 检查服务是否启动成功(查看3306端口是否监听):
netstat -anpt | grep 3306
  • 如果显示“LISTEN”,说明服务启动成功。

2.8 账号密码管理

  1. 设置root用户密码(初始为空,直接回车,然后输入新密码,这里以123456为例):
mysqladmin -u root -p password "123456"
  1. 登录MySQL:
mysql -u root -p123456
  • 登录成功后,会进入MySQL命令行(显示mysql>提示符)。

2.9 一键安装mysql一键安装脚本

如果觉得手动安装步骤太繁琐,可以用下面的一键安装脚本(复制到服务器,保存为install_mysql.sh,执行bash install_mysql.sh即可):

#!/bin/bash

# 检查是否为 root 用户
if [ "$(id -u)" != "0" ]; then
    echo "错误:此脚本必须以 root 权限运行。"
    exit 1
fi

# 定义下载链接
MYSQL_URL="https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17.tar.gz"
BOOST_URL="https://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz"

# 安装依赖
echo "正在安装依赖包..."
yum -y install wget gcc gcc-c++ ncurses ncurses-devel bison cmake

# 创建 MySQL 用户
echo "创建 MySQL 用户..."
if id "mysql" &>/dev/null; then
    echo "MySQL 用户已存在,跳过创建"
else
    useradd -s /sbin/nologin mysql
fi

# 下载 MySQL 安装包(如果不存在)
if [ ! -f "mysql-5.7.17.tar.gz" ]; then
    echo "下载 MySQL 5.7.17..."
    wget $MYSQL_URL -O mysql-5.7.17.tar.gz
    if [ $? -ne 0 ]; then
        echo "错误:MySQL 下载失败"
        exit 1
    fi
else
    echo "MySQL 安装包已存在,跳过下载"
fi

# 下载 Boost 安装包(如果不存在)
if [ ! -f "boost_1_59_0.tar.gz" ]; then
    echo "下载 Boost 1.59.0..."
    wget $BOOST_URL -O boost_1_59_0.tar.gz
    if [ $? -ne 0 ]; then
        echo "错误:Boost 下载失败"
        exit 1
    fi
else
    echo "Boost 安装包已存在,跳过下载"
fi

# 解压 MySQL
echo "解压 MySQL..."
tar zxvf mysql-5.7.17.tar.gz -C /opt > /dev/null

# 解压并设置 Boost
echo "解压并设置 Boost..."
tar zxvf boost_1_59_0.tar.gz -C /usr/local/ > /dev/null
mv /usr/local/boost_1_59_0 /usr/local/boost

# 编译安装 MySQL
echo "开始编译 MySQL (这可能需要较长时间)..."
cd /opt/mysql-5.7.17/

cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=/usr/local/boost \
-DWITH_SYSTEMD=1 > /dev/null

# 获取 CPU 核心数
CORES=$(grep -c ^processor /proc/cpuinfo)
echo "检测到系统有 $CORES 个CPU核心,使用 $CORES 核心进行编译..."
make -j $CORES && make install 

# 设置权限
echo "设置文件权限..."
chown -R mysql:mysql /usr/local/mysql/

# 创建配置文件
echo "创建 MySQL 配置文件..."
cat > /etc/my.cnf << EOF
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock
default-character-set=utf8

[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

[mysql]
port = 3306
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock
auto-rehash
EOF

chown mysql:mysql /etc/my.cnf

# 设置环境变量
echo "设置环境变量..."
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile

# 初始化 MySQL
echo "初始化 MySQL..."
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

# 设置系统服务
echo "设置系统服务..."
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl start mysqld.service
systemctl enable mysqld
# 等待mysqld启动
sleep 5
# 检查 MySQL 是否启动
echo "检查 MySQL 服务状态..."
if systemctl is-active --quiet mysqld; then
    echo "MySQL 服务已成功启动"
else
    echo "警告:MySQL 服务启动失败,请检查错误日志"
    exit 1
fi

# 检查端口监听
echo "检查 MySQL 端口监听..."
netstat -anpt | grep 3306 || echo "警告:未检测到 MySQL 端口监听,可能需要等待几秒钟后重试"

# 设置 root 密码
echo "正在设置 MySQL root 密码..."
read -s -p "请输入新的 MySQL root 密码: " MYSQL_ROOT_PASSWORD

# 设置密码(初始密码为空,直接设置新密码)
echo "" | mysqladmin -u root password "$MYSQL_ROOT_PASSWORD"

if [ $? -eq 0 ]; then
    echo "MySQL root 密码设置成功"
else
    echo "错误:密码设置失败,可能是 MySQL 服务尚未完全启动"
    echo "请等待几秒后手动执行: mysqladmin -u root password '您的密码'"
    exit 1
fi

# 测试登录
echo "测试 MySQL 连接..."
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "SELECT @@version;" >/dev/null 2>&1

if [ $? -eq 0 ]; then
    echo "MySQL 安装和配置成功完成!"
    echo "Root 密码: $MYSQL_ROOT_PASSWORD"
    echo "MySQL 已启动并设置为开机自启"
    echo "请手动执行以下命令使环境变量生效:source /etc/profile"
else
    echo "错误:MySQL 连接测试失败"
    echo "请检查 MySQL 服务状态并手动测试连接"
fi

三、MySQL数据库管理

安装好MySQL后,重点学习日常管理操作,包括数据库和表的创建、数据增删改查、用户权限管理等,这些都是工作中最常用的技能。

3.1 数据库基本操作

3.1.1 查看数据库信息

登录MySQL后,查看当前所有数据库:

SHOW DATABASES;
  • 执行后会列出MySQL默认的数据库(如mysql、information_schema)和你创建的数据库。
3.1.2 切换数据库

要操作某个数据库,先切换到该数据库:

USE 数据库名;
  • 示例:USE school;(切换到school数据库)
3.1.3 查看数据库中的表

查看当前数据库的所有表,或指定数据库的表:

SHOW TABLES;  -- 查看当前数据库的表
SHOW TABLES IN 数据库名;  -- 查看指定数据库的表
3.1.4 查看表结构

查看表的字段、数据类型、约束等信息:

DESCRIBE 表名;  -- 简写:DESC 表名;

输出结果说明:

  • Field:字段名称;
  • Type:数据类型;
  • Null:是否允许为空;
  • Key:是否是主键(PRI)、唯一键(UNI);
  • Default:默认值;
  • Extra:额外属性(如自增auto_increment)。

3.2 常用字段数据类型

创建表时,要为每个字段指定合适的数据类型,常用类型如下:

类型 说明 示例
INT 整型,存储整数 id INT
FLOAT 单精度浮点型,4字节,存储小数 score FLOAT
DOUBLE 双精度浮点型,8字节,精度比FLOAT高 price DOUBLE
CHAR(n) 固定长度字符串,长度n,不足补空格 name CHAR(10)
VARCHAR(n) 可变长度字符串,最大长度n address VARCHAR(50)
TEXT 文本类型,存储长文本 description TEXT
IMAGE 图片类型,存储图片数据 photo IMAGE
DECIMAL(p,s) 精确数值类型,p总长度,s小数位数 salary DECIMAL(5,2)

注意:

  • CHAR类型:长度不足时补空格,超出长度时低版本MySQL会截断,高版本会报错;
  • 主键可以由多个字段组成(联合主键),但必须唯一且非空。

3.3 数据库文件存储结构

MySQL的数据文件都存在/usr/local/mysql/data目录下:

  • 每个数据库对应一个子目录(目录名=数据库名);
  • 每张表对应不同的文件,取决于存储引擎:
    • MyISAM引擎:.frm(表结构)、.MYD(数据)、.MYI(索引);
    • InnoDB引擎:独享表空间(每个表一个.ibd文件)、共享表空间(多个表共用ibdata文件)。

3.4 SQL语句分类

SQL(结构化查询语言)是操作数据库的核心,按功能分为4类:

分类 功能 常用语句
DDL 数据定义语言,创建/修改/删除数据库对象 CREATE、DROP、ALTER
DML 数据操纵语言,增删改表数据 INSERT、UPDATE、DELETE
DQL 数据查询语言,查询数据 SELECT
DCL 数据控制语言,管理用户权限 GRANT、REVOKE、COMMIT

3.5 DDL操作(数据库和表管理)

DDL用于管理数据库和表的结构,常用操作如下:

3.5.1 创建数据库
CREATE DATABASE 数据库名;  -- 示例:CREATE DATABASE school;
3.5.2 创建数据表
CREATE TABLE 表名 (
  字段1 数据类型 [约束条件],
  字段2 数据类型 [约束条件],
  ...
  PRIMARY KEY (主键字段)  -- 指定主键
);

示例:创建学生表(表名student)

CREATE DATABASE school;  -- 创建数据库
USE school;  -- 切换数据库
CREATE TABLE student (
  id INT NOT NULL,  -- 学号,非空
  name CHAR(10) NOT NULL,  -- 姓名,非空
  age INT,  -- 年龄
  score DECIMAL(5,2),  -- 成绩,保留2位小数
  passwd CHAR(48) DEFAULT '',  -- 密码,默认空字符串
  PRIMARY KEY (id)  -- 主键为id
);

常用约束条件:

  • NOT NULL:字段不能为空;
  • DEFAULT:设置默认值;
  • PRIMARY KEY:主键,唯一标识记录;
  • UNIQUE KEY:唯一键,字段值不能重复;
  • AUTO_INCREMENT:自增长,字段值自动递增(仅适用于整型)。
3.5.3 删除表
DROP TABLE 表名;  -- 删除当前数据库的表
DROP TABLE 数据库名.表名;  -- 不切换数据库,直接删除指定表
3.5.4 删除数据库
DROP DATABASE 数据库名;  -- 注意:删除后数据无法恢复,谨慎操作!
3.5.5 修改表结构(ALTER TABLE)
  1. 修改表名:
ALTER TABLE 旧表名 RENAME 新表名;  -- 示例:ALTER TABLE student RENAME stu;
  1. 增加字段:
ALTER TABLE 表名 ADD 字段名 数据类型 [约束];  -- 示例:ALTER TABLE stu ADD gender CHAR(2);
  1. 修改字段(修改名称或数据类型):
ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [约束];  -- 改名称+类型
ALTER TABLE 表名 MODIFY COLUMN 字段名 数据类型;  -- 只改类型

示例:

ALTER TABLE stu CHANGE gender sex CHAR(2);  -- 字段名gender改为sex
ALTER TABLE stu MODIFY COLUMN age INT(3);  -- 年龄字段类型改为INT(3)
  1. 删除字段:
ALTER TABLE 表名 DROP 字段名;  -- 示例:ALTER TABLE stu DROP sex;

3.6 DML操作(表数据管理)

DML用于操作表中的数据(增删改),常用操作如下:

3.6.1 插入数据
INSERT INTO 表名(字段1,字段2,...) VALUES (1,2, ...);

示例:向student表插入一条数据

INSERT INTO student (id, name, age, score, passwd) 
VALUES (1, 'zhangsan', 18, 90.5, PASSWORD('123456'));
  • PASSWORD(‘123456’):对密码进行加密存储,更安全。
3.6.2 更新数据
UPDATE 表名 SET 字段1=1[,字段2=2] WHERE 条件;

示例:修改zhangsan的密码为空

UPDATE student SET passwd=PASSWORD('') WHERE name='zhangsan';
  • 注意:WHERE条件必须加,否则会修改表中所有数据!
3.6.3 删除数据
DELETE FROM 表名 WHERE 条件;

示例:删除id=1的学生数据

DELETE FROM student WHERE id=1;
  • 注意:无WHERE条件会删除表中所有数据,谨慎操作!
3.6.4 清空表

清空表中所有数据,有两种方式:

  1. DELETE方式(可回滚,速度慢):
DELETE FROM 表名;
  • 支持事务回滚(删除后可恢复),自增ID不会重置。
  1. TRUNCATE方式(不可回滚,速度快):
TRUNCATE TABLE 表名;
  • 不支持回滚,自增ID会重置为1,适合清空大表。

3.7 DQL操作(数据查询)

DQL用于查询表中的数据,核心语句是SELECT,常用操作如下:

3.7.1 查询数据
SELECT 字段1,字段2,... FROM 表名 WHERE 条件;  -- 查询指定字段
SELECT * FROM 表名;  -- 查询所有字段(不推荐,效率低)

示例:

SELECT name, score FROM student WHERE age>18;  -- 查询年龄大于18的学生姓名和成绩
SELECT * FROM student;  -- 查询所有学生的所有信息
3.7.2 限制查询结果

用LIMIT限制返回的记录数,适合分页查询:

SELECT * FROM 表名 LIMIT 起始行, 查询条数;  -- 起始行从0开始
SELECT * FROM 表名 LIMIT 2;  -- 显示前2行
SELECT * FROM 表名 LIMIT 1,2;  -- 从第1行开始,显示2行(即第2、3行)
3.7.3 竖向显示结果

当表字段较多时,用\G竖向显示结果,更易读:

SELECT * FROM 表名\G;

3.8 表高级操作

3.8.1 临时表

临时表只在当前数据库连接中存在,连接关闭后自动销毁,适合临时存储数据:

CREATE TEMPORARY TABLE 临时表名 (字段1 数据类型, ...);

示例:

CREATE TEMPORARY TABLE temp_stu (id INT, name CHAR(10));
INSERT INTO temp_stu VALUES (1, 'lisi');
SELECT * FROM temp_stu;  -- 只能在当前连接中查询
3.8.2 克隆表

复制已有的表结构或数据,常用两种方式:

  1. 仅复制表结构(不复制数据):
CREATE TABLE 新表名 LIKE 旧表名;

示例:复制student表的结构,创建student_copy表

CREATE TABLE student_copy LIKE student;
  1. 复制表结构和数据(可能丢失主键等约束):
CREATE TABLE 新表名 AS SELECT * FROM 旧表名;

示例:复制student表的结构和所有数据

CREATE TABLE student_all AS SELECT * FROM student;
  • 注意:这种方式会丢失主键、自增等约束,需要手动添加。

3.9 用户管理

MySQL支持多用户管理,不同用户可分配不同权限,常用操作如下:

3.9.1 创建用户
CREATE USER '用户名'@'来源地址' IDENTIFIED BY '密码';
  • 来源地址:localhost(仅本地登录)、%(允许任意IP登录)、具体IP(如192.168.1.100);
  • 密码:可明文或加密存储。

示例:

CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY 'abc123';  -- 本地登录用户
CREATE USER 'lisi'@'%' IDENTIFIED BY '123456';  -- 任意IP登录用户
3.9.2 查看用户

MySQL的用户信息存储在mysql数据库的user表中:

USE mysql;
SELECT User, Host, authentication_string FROM user;
3.9.3 删除用户
DROP USER '用户名'@'来源地址';

示例:

DROP USER 'lisi'@'%';
3.9.4 修改密码
  1. 修改当前登录用户密码:
SET PASSWORD = PASSWORD('新密码');
  1. 修改其他用户密码:
SET PASSWORD FOR '用户名'@'来源地址' = PASSWORD('新密码');

示例:

SET PASSWORD FOR 'zhangsan'@'localhost' = PASSWORD('654321');
3.9.5 忘记root密码处理

如果忘记root用户密码,按以下步骤重置:

  1. 修改MySQL配置文件/etc/my.cnf,在[mysqld]段添加:
skip-grant-tables  -- 跳过权限验证,无需密码登录
  1. 重启MySQL服务:
systemctl restart mysqld
  1. 无需密码登录MySQL:
mysql -u root
  1. 修改root密码:
UPDATE mysql.user SET AUTHENTICATION_STRING=PASSWORD('新密码') WHERE user='root';
FLUSH PRIVILEGES;  -- 刷新权限
  1. 删除/etc/my.cnf中的skip-grant-tables,重启MySQL服务:
systemctl restart mysqld
  1. 用新密码登录:
mysql -u root -p新密码

3.10 用户授权管理

创建用户后,需要给用户分配权限才能操作数据库,常用操作如下:

3.10.1 授权用户
GRANT 权限列表 ON 数据库.TO '用户名'@'来源地址' IDENTIFIED BY '密码';
  • 权限列表:SELECT(查询)、INSERT(插入)、UPDATE(修改)、DELETE(删除)、CREATE(创建)、DROP(删除)、ALL(所有权限);
  • 数据库.表:.(所有数据库所有表)、school.*(school数据库所有表)、school.student(school数据库的student表)。

示例:

GRANT SELECT, INSERT ON school.* TO 'zhangsan'@'localhost' IDENTIFIED BY 'abc123';  -- 授予查询和插入权限
GRANT ALL PRIVILEGES ON *.* TO 'lisi'@'%' IDENTIFIED BY '123456';  -- 授予所有权限
3.10.2 查看授权
SHOW GRANTS FOR '用户名'@'来源地址';

示例:

SHOW GRANTS FOR 'zhangsan'@'localhost';
3.10.3 撤销权限
REVOKE 权限列表 ON 数据库.FROM '用户名'@'来源地址';

示例:

REVOKE INSERT ON school.* FROM 'zhangsan'@'localhost';  -- 撤销插入权限
REVOKE ALL ON *.* FROM 'lisi'@'%';  -- 撤销所有权限

3.11 权限说明

MySQL的常用权限及功能如下:

权限 功能说明
SELECT 查询数据
INSERT 插入数据
UPDATE 更新数据
DELETE 删除数据
CREATE 创建数据库/表
DROP 删除数据库/表
INDEX 创建索引
ALTER 修改表结构
EXECUTE 执行存储过程
CREATE VIEW 创建视图
SHOW VIEW 查看视图
CREATE ROUTINE 创建存储过程
ALTER ROUTINE 修改存储过程
EVENT 创建事件
TRIGGER 创建触发器
ALL PRIVILEGES 所有权限

总结

本文从数据库基础概念出发,详细讲解了数据库的分类、发展历程,MySQL 5.7的安装配置,以及日常管理的核心操作。核心要点如下:

  1. 数据库分关系型和非关系型,前者适合结构化数据(如财务、学生信息),后者适合高并发、非结构化数据(如缓存、大数据分析),实际应用中常混合使用;
  2. MySQL安装需注意环境依赖、编译配置和权限设置,一键脚本可简化安装流程;
  3. 日常管理的核心是SQL语句,DDL管结构、DML管数据、DQL管查询、DCL管权限,熟练掌握这些操作就能应对大部分工作场景;
  4. 用户管理和权限控制是数据库安全的关键,要根据实际需求分配最小权限,避免权限过大导致风险。
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐