MySQL数据库基础与实战指南
在数据驱动的今天,数据库就像信息系统的“超级仓库”,我们日常用的微信聊天记录、外卖订单、游戏装备数据,都离不开它的存储和管理。无论是互联网公司的核心业务,还是小团队的日常办公,数据库都是不可或缺的核心组件。这篇文章会从最基础的概念讲起,一步步带你认识数据库、学会安装MySQL,再到熟练操作和管理数据库。内容尽量通俗,避免复杂术语堆砌,同时不遗漏关键细节,哪怕是新手也能跟着学、跟着做。
前言
在数据驱动的今天,数据库就像信息系统的“超级仓库”,我们日常用的微信聊天记录、外卖订单、游戏装备数据,都离不开它的存储和管理。无论是互联网公司的核心业务,还是小团队的日常办公,数据库都是不可或缺的核心组件。
这篇文章会从最基础的概念讲起,一步步带你认识数据库、学会安装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是操作和管理数据库的软件,相当于数据库的“管理员工具”,主要能做这些事:
- 建库与维护:创建数据表、备份恢复数据、优化性能;
- 数据定义:设定数据结构、存储方式、保密规则;
- 数据操作:查询、统计、修改数据;
- 运行管理:控制多用户同时访问、管理用户权限;
- 通信:和其他软件交互,比如和Office办公软件对接。
1.2.5 数据库系统(DBS)
数据库系统是一个完整的“人机组合”,包括:硬件(电脑服务器)、操作系统(比如Linux)、数据库、DBMS软件、应用软件(比如Navicat)、用户(包括专业的数据库管理员DBA)。
DBMS的工作流程很直观:
- 接收用户或软件的请求(比如“查询学生成绩”);
- 把请求转换成数据库能看懂的底层指令;
- 执行指令操作数据库;
- 获取操作结果;
- 把结果整理成用户能看懂的格式;
- 返回给用户。
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.5.2 NoSQL缺点
- 不支持标准SQL,查询语法不统一;
- 事务处理能力弱,比如转账这类需要原子操作的场景不适用;
- 复杂查询支持不足,多表关联查询不如关系型数据库方便;
- 大部分数据存在内存,内存成本较高。
1.5.3 Redis与Memcached对比
两者都是常用的NoSQL缓存数据库,核心作用是存储热点数据(比如高频访问的商品信息):
- 相同点:基于内存运行,速度快,专门缓存热点数据;
- 不同点:Redis支持数据持久化(数据能保存到硬盘,断电不丢失),Memcached是纯内存存储,断电数据就没了。
1.6 关系型与非关系型数据库对比
| 特点 | 关系型数据库 | 非关系型数据库 |
|---|---|---|
| 数据结构 | 二维表(行+列) | KV、文档、列式、图形等 |
| 优点 | 结构清晰,SQL通用,支持复杂查询和事务 | 格式灵活,速度快,高并发支持好 |
| 缺点 | 表结构固定,高并发下有I/O瓶颈 | 无标准SQL,事务弱,复杂查询差 |
| 代表产品 | MySQL、Oracle、SQL Server | Redis、MongoDB、HBase |
1.7 小结
- 主流数据库分两类:关系型(MySQL/Oracle)和非关系型(Redis/MongoDB);
- DBMS是连接用户和数据库的桥梁,负责处理所有数据操作请求;
- 选型思路:
- 数据结构化、关系清晰(比如财务数据、学生信息)→ 选关系型数据库;
- 高并发、非结构化数据(比如社交软件聊天记录、大数据分析)→ 选非关系型数据库;
- 实际应用中常混合使用:比如用Redis做缓存(提升访问速度),MySQL做持久化存储(保证数据安全)。
二、MySQL安装与配置
下面以MySQL 5.7为例,详细讲解源码编译安装的步骤,每个步骤都附具体命令和说明,新手也能跟着操作。
2.1 环境准备
首先要安装编译所需的工具和依赖库,同时创建MySQL专用用户(避免用root用户运行,更安全):
- 安装依赖:
yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake
- gcc/gcc-c++:编译代码的工具;
- ncurses/ncurses-devel:字符终端交互库;
- bison:语法分析器;
- cmake:MySQL专属编译工具。
- 创建MySQL用户:
useradd -s /sbin/nologin mysql
- 这个用户只能运行MySQL服务,不能登录系统,更安全。
2.2 源码解压与依赖处理
- 解压MySQL源码包到/opt目录:
tar zxvf mysql-5.7.17.tar.gz -C /opt
- 解压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编译配置
- 进入MySQL源码目录:
cd /opt/mysql-5.7.17/
- 执行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
- 编译并安装(-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管理(启动、停止、开机自启):
- 复制服务文件:
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
- 重新加载系统服务:
systemctl daemon-reload
- 启动MySQL并设置开机自启:
systemctl start mysqld.service
systemctl enable mysqld
- 检查服务是否启动成功(查看3306端口是否监听):
netstat -anpt | grep 3306
- 如果显示“LISTEN”,说明服务启动成功。
2.8 账号密码管理
- 设置root用户密码(初始为空,直接回车,然后输入新密码,这里以123456为例):
mysqladmin -u root -p password "123456"
- 登录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)
- 修改表名:
ALTER TABLE 旧表名 RENAME 新表名; -- 示例:ALTER TABLE student RENAME stu;
- 增加字段:
ALTER TABLE 表名 ADD 字段名 数据类型 [约束]; -- 示例:ALTER TABLE stu ADD gender CHAR(2);
- 修改字段(修改名称或数据类型):
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)
- 删除字段:
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 清空表
清空表中所有数据,有两种方式:
- DELETE方式(可回滚,速度慢):
DELETE FROM 表名;
- 支持事务回滚(删除后可恢复),自增ID不会重置。
- 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 克隆表
复制已有的表结构或数据,常用两种方式:
- 仅复制表结构(不复制数据):
CREATE TABLE 新表名 LIKE 旧表名;
示例:复制student表的结构,创建student_copy表
CREATE TABLE student_copy LIKE student;
- 复制表结构和数据(可能丢失主键等约束):
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 修改密码
- 修改当前登录用户密码:
SET PASSWORD = PASSWORD('新密码');
- 修改其他用户密码:
SET PASSWORD FOR '用户名'@'来源地址' = PASSWORD('新密码');
示例:
SET PASSWORD FOR 'zhangsan'@'localhost' = PASSWORD('654321');
3.9.5 忘记root密码处理
如果忘记root用户密码,按以下步骤重置:
- 修改MySQL配置文件/etc/my.cnf,在[mysqld]段添加:
skip-grant-tables -- 跳过权限验证,无需密码登录
- 重启MySQL服务:
systemctl restart mysqld
- 无需密码登录MySQL:
mysql -u root
- 修改root密码:
UPDATE mysql.user SET AUTHENTICATION_STRING=PASSWORD('新密码') WHERE user='root';
FLUSH PRIVILEGES; -- 刷新权限
- 删除/etc/my.cnf中的skip-grant-tables,重启MySQL服务:
systemctl restart mysqld
- 用新密码登录:
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的安装配置,以及日常管理的核心操作。核心要点如下:
- 数据库分关系型和非关系型,前者适合结构化数据(如财务、学生信息),后者适合高并发、非结构化数据(如缓存、大数据分析),实际应用中常混合使用;
- MySQL安装需注意环境依赖、编译配置和权限设置,一键脚本可简化安装流程;
- 日常管理的核心是SQL语句,DDL管结构、DML管数据、DQL管查询、DCL管权限,熟练掌握这些操作就能应对大部分工作场景;
- 用户管理和权限控制是数据库安全的关键,要根据实际需求分配最小权限,避免权限过大导致风险。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)