前言

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

这篇文章会从最基础的概念讲起,一步步带你认识数据库、学会安装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 ServerRedis、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)可变长度字符串,最大长度naddress 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

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐