MySQL 数据库与 SQL 语言介绍

数据库介绍

数据库定义

数据库是建立在文件系统之上的电子化数据仓库,提供了高效的数据组织、存储和管理方案。与传统文件存储相比,数据库能实现数据的快速检索、多用户共享和数据一致性维护,是各类应用程序(如网站、管理系统、APP)不可或缺的底层支撑。

关系型数据库特点

关系型数据库基于关系模型构建,核心是存储实体与实体之间的关联关系(如用户与订单、部门与员工),采用二维表格结构组织数据,数据完整性和一致性有完善的保障机制,是目前应用最广泛的数据库类型。

主流数据库对比

MySQL 环境配置与基础操作

(一)核心配置文件

MySQL 安装目录下的my.ini文件是关键配置文件,其中:

  • basedir:指定 MySQL 安装路径;
  • datadir:指定数据文件的存储位置,直接影响数据读写性能。

(二)MySQL 服务连接与验证

  1. 登录测试 :打开 CMD 窗口,切换至 MySQL 的 bin 目录,输入命令**mysql -u root -p**,回车后输入密码即可登录 MySQL 服务器。
  2. 版本与用户验证:登录后可通过以下命令确认环境信息:
sql 复制代码
-- 查看MySQL版本
select version();
-- 查看当前登录用户
select user();

(三)密码修改流程

当需要重置 root 密码时,按以下步骤操作:

  1. 通过services.msc打开服务窗口,停止 MySQL 服务;

  2. 在 CMD 中执行mysqld --skip-grant-tables,启动免认证的 MySQL 服务;

  3. 新打开 CMD 窗口,输入mysql -u root -p,无需密码直接登录;

  4. 执行以下命令修改密码:

    sql 复制代码
    -- 切换至mysql系统数据库
    use mysql;
    -- 更新root用户密码(此处密码设为root,可自定义)
    update user set authentication_string=password('root') WHERE user='root';
  5. 关闭所有 CMD 窗口,在任务管理器中结束mysqld进程,重启 MySQL 服务即可生效。

(四)数据库备份与恢复

1. 数据备份

通过mysqldump工具备份指定数据库的所有数据,命令格式如下(需在 CMD 环境执行,非 MySQL 登录状态):

mysqldump -u 用户名 -p 数据库名 > 备份文件名.sql

执行后输入密码,即可将数据库数据导出为 SQL 脚本文件。

2. 数据恢复

恢复数据前需先创建空数据库并切换至该数据库,恢复命令如下:

mysql -u 用户名 -p 数据库名 < 备份文件名.sql

注意事项:

  • 命令需在 CMD 环境执行,无需登录 MySQL;
  • 备份与恢复命令中><方向不可混淆;
  • 恢复时确保目标数据库已创建,且与备份数据的表结构兼容。

SQL 语言介绍

(一)SQL 语言特性

SQL(结构化查询语言)是一种非过程性编程语言,核心特点是每条语句独立执行并返回结果,无需依赖其他语句的执行顺序。与 Oracle 专属的 PL/SQL(过程性语言)不同,SQL 具有跨数据库通用性,是操作关系型数据库的标准语言。

(二)SQL 语言分类

SQL 按功能可分为四大类,涵盖数据库操作的全流程:

数据库核心操作(CURD)

(一)数据库级操作

MySQL 服务器中可包含多个数据库,每个数据库独立存储表结构与数据,核心操作如下:

1. 创建数据库
  • 基础语法:create database 数据库名称;
  • 指定字符集与排序规则(推荐 utf8/utf8mb4):

create database 数据库名称 character set utf8 collate utf8_general_ci;

2. 查看与切换数据库
sql 复制代码
-- 查看所有数据库
show databases;
-- 切换至指定数据库(后续操作针对该数据库)
use 数据库名称;
-- 查看当前使用的数据库
select database();
-- 查看数据库创建语句(含字符集等配置)
show create database 数据库名称;
3. 修改与删除数据库
sql 复制代码
-- 修改数据库字符集
alter database 数据库名称 character set 'gbk' collate 'gbk_chinese_ci';
-- 删除数据库(谨慎操作,数据不可恢复)
drop database 数据库名称;

(二)表结构操作

表是数据库存储数据的基本单元,由字段(列)和数据(行)组成,字段需指定数据类型与约束条件。

1. 数据类型详解

MySQL 支持多种数据类型,适配不同场景的数据存储需求:

2. 表约束(保证数据完整性)

约束是对字段的规则限制,常见约束如下:

  • 主键约束(primary key):唯一标识表中每条记录,非空且唯一,一个表仅能有一个主键;
  • 唯一约束(unique):字段值唯一,允许为空;
  • 非空约束(not null):字段必须填写数据,不可为空。
3. 表结构核心操作
sql 复制代码
-- 1. 创建表(示例:创建学生表stu)
create table stu(
  id int primary key, -- 主键ID
  name varchar(30) not null, -- 学生姓名(非空)
  math int, -- 数学成绩
  english int, -- 英语成绩
  chinese int, -- 语文成绩
  create_time datetime -- 创建时间
);

-- 2. 查看表结构
desc 表名;
-- 查看表创建语句
show create table 表名;
-- 查看当前数据库所有表
show tables;

-- 3. 修改表结构
alter table 表名 add 新字段 类型(长度) 约束; -- 添加字段
alter table 表名 drop 字段名; -- 删除字段
alter table 表名 modify 字段名 新类型(长度) 新约束; -- 修改字段类型/约束
alter table 表名 change 旧字段名 新字段名 类型(长度) 约束; -- 修改字段名
rename table 表名 to 新表名; -- 修改表名
alter table 表名 character set utf8; -- 修改表字符集

-- 4. 删除表(谨慎操作)
drop table 表名;

(三)数据操作(增删改查)

1. 插入数据(INSERT)
sql 复制代码
-- 指定字段插入(推荐,顺序可自定义)
insert into stu (id, name, math, english, chinese) values (1, '聪聪', 95, 92, 98);
-- 全字段插入(需按表字段顺序赋值)
insert into stu values (2, '明明', 88, 85, 90, '2025-09-13 10:00:00');

注意:字符串和日期类型数据需用单引号包裹,数据类型需与字段类型一致。

2. 修改数据(UPDATE)
sql 复制代码
-- 修改符合条件的记录(推荐添加WHERE条件)
update stu set math=90, english=88 where name='明明';
-- 无WHERE条件时,将修改表中所有记录(谨慎使用)
update stu set create_time='2025-09-13 10:00:00';
3. 删除数据(DELETE)
sql 复制代码
-- 删除符合条件的记录
delete from stu where id=2;
-- 删除表中所有数据(保留表结构)
delete from stu;
-- 清空表数据(先删表再重建,效率更高,不可恢复)
truncate table stu;

对比说明:

  • DELETE:逐行删除,支持 WHERE 条件,可通过事务回滚恢复数据;
  • TRUNCATE:直接重建表结构,不记录日志,效率高于 DELETE,数据不可恢复;
  • DROP TABLE:删除表结构及所有数据,完全不可恢复。
4. 查询数据(SELECT)

查询是 SQL 最核心的功能,支持简单查询、条件过滤、排序、聚合等复杂操作:

(1)基础查询
sql 复制代码
-- 查询表中所有字段所有数据
select * from stu;
-- 查询指定字段数据
select name, math, chinese from stu;
(2)去重与合并查询
sql 复制代码
-- 去除重复记录(如查询所有不重复的数学成绩)
select distinct math from stu;
-- 合并两个查询结果(字段数与类型需一致,自动去重)
select name, math from stu where math>90 union select name, math from stu where chinese>90;
-- 合并结果并保留重复记录
select name, math from stu where math>90 union all select name, math from stu where chinese>90;
(3)运算与别名
sql 复制代码
-- 成绩加分(数学+10分,英语+10分)
select name, (math+10) as 数学加分, (english+10) as 英语加分 from stu;
-- 计算总分并指定别名
select name, (math+english+chinese) as 总分 from stu;
(4)条件过滤(WHERE)

支持比较运算、范围查询、模糊查询等多种条件:

sql 复制代码
-- 比较运算(查询英语成绩>90分的学生)
select name, english from stu where english>90;
-- 范围查询(数学成绩在78、88、99中的学生)
select * from stu where math in (78,88,99);
-- 模糊查询(姓名包含"张"字的学生,%表示任意字符)
select * from stu where name like '%张%';
-- 多条件组合(总分>200且数学>80)
select name, (math+english+chinese) as 总分 from stu where (math+english+chinese)>200 and math>80;
(5)NULL 值处理
sql 复制代码
-- 判断字段是否为空(返回1表示为空,0表示非空)
select name, isnull(chinese) as 语文成绩是否为空 from stu;
-- 空值替换(语文成绩为空时显示0)
select name, ifnull(chinese, 0) as 语文成绩 from stu;
-- 两值相等返回NULL(数学与英语成绩相同时返回NULL)
select name, nullif(math, english) as 数学英语是否不等 from stu;
(6)排序(ORDER BY)
sql 复制代码
-- 按总分降序排列(DESC降序,ASC升序,默认ASC)
select name, (math+english+chinese) as 总分 from stu order by 总分 desc;
-- 多字段排序(先按数学降序,再按英语升序)
select name, math, english from stu order by math desc, english asc;
(7)聚合函数与分组查询(GROUP BY/HAVING)

聚合函数用于统计分析,分组查询按指定维度聚合数据:

sql 复制代码
-- 聚合函数(统计学生总数、数学平均分、最高分)
select count(*) as 学生总数, avg(math) as 数学平均分, max(math) as 数学最高分 from stu;
-- 分组查询(按班级分组,统计每个班级的总分平均值)
select class_id, avg(math+english+chinese) as 班级平均分 from stu group by class_id;
-- 过滤分组结果(班级平均分>180)
select class_id, avg(math+english+chinese) as 班级平均分 from stu group by class_id having 班级平均分>180;

查询语句执行顺序:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY

(四)多表查询

当数据分散在多个关联表中时,需通过多表查询获取整合数据,核心依赖外键建立表间关联。

1. 内连接(INNER JOIN)

仅查询两表中满足关联条件的数据,是最常用的多表查询方式:

sql 复制代码
-- 显式内连接(推荐,逻辑清晰)
select d.dname, e.ename, e.sal from dept d inner join emp e on d.did = e.dno;
-- 隐式内连接(简化写法,通过WHERE指定关联条件)
select d.dname, e.ename, e.sal from dept d, emp e where d.did = e.dno;

注:de分别是表deptemp的别名,用于简化代码。

2. 外连接

保留一张表的全部数据,关联另一张表的匹配数据,未匹配的数据显示为 NULL:

sql 复制代码
-- 左外连接(保留左表dept的所有数据,关联emp的匹配数据)
select d.dname, e.ename from dept d left outer join emp e on d.did = e.dno;
-- 右外连接(保留右表emp的所有数据,关联dept的匹配数据)
select d.dname, e.ename from dept d right outer join emp e on d.did = e.dno;
3. 子查询(嵌套查询)

子查询是嵌套在其他 SQL 语句中的查询,内层查询结果作为外层查询的条件或数据源:

sql 复制代码
-- 示例:查询数学成绩高于平均分的学生
select name, math from stu where math > (select avg(math) from stu);

子查询可灵活实现复杂逻辑,但需注意性能优化,避免多层嵌套导致查询效率下降。

补充说明
  1. SQL 语法规范:SQL 关键字不区分大小写;语句结束需加英文分号(除备份 / 恢复等 CMD 命令外);
  2. 字符集设置:为避免中文乱码,建议数据库、表、字段统一使用 utf8 字符集;
  3. 安全风险:WHERE 子句中 AND 优先级高于 OR,可能导致 SQL 注入漏洞,开发中需使用参数化查询替代字符串拼接;
  4. 性能优化:查询大数据量时,合理使用索引(通过 CREATE INDEX 创建);避免 SELECT *,仅查询需要的字段;分组查询和子查询需控制数据量。
相关推荐
Hello.Reader1 小时前
在 Flink SQL 里做向量检索 VECTOR_SEARCH
大数据·sql·flink
hakertop1 小时前
如何基于C#读取.dot图论文件并和QuickGraph联动
数据库·c#·图论
老华带你飞1 小时前
作业管理|基于Java作业管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端
JIngJaneIL1 小时前
基于Java人力资源管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
技术夹缝寻乐1 小时前
openEuler调度器混合负载性能深度测评
redis·mysql
Xyz996_2 小时前
Redis数据库基础
数据库·redis·缓存
山南有清风2 小时前
基于Redis的分布式任务调用框架实现
数据库·redis·分布式·分布式任务
明月惊雀2 小时前
微服务依赖版本管理
java·数据库·微服务
太阳伞下的阿呆2 小时前
kafka高吞吐持久化方案(1)
分布式·mysql·kafka·db·高吞吐