MySQL基础知识及操作
1.1 什么是数据库
数据库 是一个有组织的集合,用于存储和管理数据的系统。它是一个软件系统,被设计用来存储、检索和管理数据,并提供数据的快速访问和处理。数据库可以被看作是一种特殊的文件系统,但与传统的文件系统不同的是:它能够更加高效的存储和管理大量结构化数据。
1.2 数据库分类
1.2.1 关系型数据库(RDBMS)
-
定义:基于关系模型,数据以
表格形式存储,表之间通过外键关联。 -
特点:
-
严格的表结构(Schema)
-
支持 SQL 语言
-
事务的
ACID特性(原子性、一致性、隔离性、持久性) -
适合复杂查询和事务场景
-
-
代表数据库:MySQL、Oracle、PostgreSQL、SQL Server。
1.2.2 非关系型数据库(NoSQL)
定义:非结构化存储,支持灵活的数据模型。
分类:
-
文档型:MongoDB(JSON 格式存储)
-
键值型:Redis、Memcached
-
列存储:Cassandra、HBase
-
图数据库:Neo4j
特点:
高扩展性、高性能
弱化 Schema,支持动态数据结构
适合高并发、大数据量场景(如社交网络、实时分析)
1.2.3 时序数据库(Time-Series Database)
定义: 专门用于存储和查询 时间序列数据(按时间顺序生成的数据点集合)的数据库类型。
核心特点:
-
时间为主键:数据以时间戳为默认主索引
-
高吞吐写入:支持每秒百万级数据点写入
-
高效压缩:时序数据专用压缩算法(如Delta编码)
-
时间窗口聚合:内置滑动窗口、降采样函数
-
冷热分层:自动分离热数据与历史数据
主流时序数据库对比
| 数据库 | 类型 | 核心优势 | 适用场景 | 开源协议 |
|---|---|---|---|---|
| InfluxDB | 原生时序数据库 | - 专为时序优化<br>- 内置TSQL查询语言<br>- 生态完善(Telegraf+Grafana集成) | IoT监控、实时指标分析 | 商业版+开源版 |
| TDengine | 分布式时序数据库 | - 超高压缩率(1/10存储空间)<br>- 自带流式计算引擎<br>- 兼容SQL语法 | 工业物联网、车联网 | Apache 2.0 |
| ClickHouse | 列式分析数据库 | - PB级数据分析能力<br>- 支持标准SQL<br>- 向量化查询引擎 | 日志分析、时序大数据聚合 | Apache 2.0 |
二、SQL 语言
2.1 什么是 SQL?
SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。
2.2 SQL 分类
| 类型 | 全称 | 关键字 | 功能 |
|---|---|---|---|
| DDL | 数据定义语言 | CREATE, ALTER, DROP |
定义/修改表结构 |
| DML | 数据操作语言 | INSERT, UPDATE, DELETE |
增删改数据 |
| DQL | 数据查询语言 | SELECT |
查询数据 |
| DCL | 数据控制语言 | GRANT, REVOKE |
权限管理 |
2.3 SQL 语法特点
1、不区分大小写
SELECT * FROM users; -- 等价于 select * from Users;
2、多条 SQL 语句必须以分号(;)分隔。
3、SQL 支持三种注释
## 注释1
-- 注释2
/* 注释3 */
三、MySQL 简介
3.1 什么是 MySQL?
MySQL 是一个开源的关系型数据库管理系统(RDBMS),由瑞典公司 MySQL AB 开发,现隶属于 Oracle 公司。
-
开源特性:遵循 GPL 协议,社区版免费使用,企业版提供额外功能和支持服务。
-
名称由来:创始人 Michael Widenius 的女儿名为 "My",因此命名为 MySQL。
3.2 发展历程
-
1995 年:首个版本发布,迅速成为 Web 开发领域的首选数据库。
-
2008 年:被 Sun Microsystems 收购。
-
2010 年:Oracle 收购 Sun Microsystems,MySQL 成为 Oracle 旗下产品。
-
关键版本:
-
MySQL 5.5(2010):默认存储引擎改为 InnoDB,支持半同步复制。
-
MySQL 5.7(2015):性能优化、JSON 支持、GIS 增强。
-
MySQL 8.0(2018):窗口函数、原子 DDL、默认字符集改为
utf8mb4。
-
3.3 核心特点
| 特性 | 说明 |
|---|---|
| 高性能 | 支持高并发读写,优化查询引擎,适用于 OLTP(在线事务处理)。 |
| 高可靠性 | 支持 ACID 事务、崩溃恢复、主从复制。 |
| 易扩展 | 支持分布式架构(如 MySQL Cluster、分库分表)。 |
| 跨平台 | 支持 Windows、Linux、macOS 等主流操作系统。 |
| 多存储引擎 | 提供 InnoDB(事务安全)、MyISAM(高速读)、Memory(内存表)等引擎。 |
3.4 适用场景
-
Web 应用:如 WordPress、Joomla 等 CMS 系统的默认数据库。
-
SaaS 服务:支持多租户数据隔离和快速查询。
-
电商平台:处理订单、用户、商品等结构化数据。
-
日志系统:通过 MyISAM 引擎高效存储日志(需权衡事务需求)。
3.5 数据库术语
-
数据库(database)- 保存有组织的数据的容器(通常是一个文件或一组文件)。 -
数据表(table)- 某种特定类型数据的结构化清单。 -
列(column)- 表中的一个字段。所有表都是由一个或多个列组成的。 -
行(row)- 表中的一个记录。 -
主键(primary key)- 一列(或一组列),其值能够唯一标识表中每一行。
四、MySQL安装
【mysql安装】3.win10 mysql5.7安装(zip免安装版本) - 满Sir - 博客园
net stop mysql;
net start mysql;
# 登陆MySQL
mysql -u root -p
show databases;
use test-03;
select * from employees;
exit;
五、MySQL基本操作
5.1 数据库(Database)操作
5.1.1 创建数据库
create database helloworld;
5.1.2 使用数据库
use helloworld;
5.1.3 显示当前使用的数据库
select database();
5.1.4 删除数据库
DROP DATABASE helloworld;
5.2 表(Table)操作
5.2.1 创建表(CREATE TABLE)
-- 部门表 departments
CREATE TABLE `departments` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '部门ID',
`name` varchar(50) NOT NULL COMMENT '部门名称',
`location` varchar(100) DEFAULT NULL COMMENT '办公地点',
`budget` decimal(12,2) DEFAULT NULL COMMENT '年度预算',
`department_code` varchar(20) DEFAULT NULL COMMENT '部门编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门信息表';
-- 员工表 employees
CREATE TABLE `employees` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '员工ID',
`name` varchar(50) NOT NULL COMMENT '姓名',
`gender` varchar(2) DEFAULT '男' COMMENT '性别',
`salary` decimal(10,2) NOT NULL COMMENT '薪资',
`hire_date` date NOT NULL COMMENT '入职日期',
`department_id` int(11) DEFAULT NULL COMMENT '部门id',
`employee_code` varchar(20) DEFAULT NULL COMMENT '员工编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COMMENT='员工信息表';
-- 学生表 student
CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(32) DEFAULT NULL,
`gender` varchar(2) DEFAULT NULL,
`student_code` varchar(20) DEFAULT NULL COMMENT '学生学号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5.2.2 表维护操作
-- 重命名表
RENAME TABLE student TO new_student;
-- 复制表结构(不含数据)
CREATE TABLE student_2025 LIKE student;
-- 复制表结构及数据
CREATE TABLE employees_2025 AS SELECT * FROM employees WHERE salary > 8000;
-- 删除表
DROP TABLE IF EXISTS employees_2025;
5.2.3 修改表结构(ALTER TABLE)
-- 添加新列(带位置控制)
ALTER TABLE employees ADD COLUMN phone VARCHAR(20) AFTER name;
-- 重命名列
ALTER TABLE employees
CHANGE COLUMN phone phoneNum DATE NOT NULL;
-- 删除列
ALTER TABLE employees
DROP COLUMN phoneNum;
5.2.4 索引(INDEX)
作用
通过索引可以更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速查询。
注意
更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
唯一索引
唯一索引表明此索引的每一个索引值只对应唯一的数据记录。
创建索引
CREATE INDEX student_index ON student (id);
创建唯一索引
CREATE UNIQUE INDEX code_index ON student (student_code);
删除索引
ALTER TABLE student DROP INDEX code_index;
5.3.4 数据操作
5.3.1 插入数据
-- 插入部门数据
INSERT INTO departments (name, location, budget, department_code) VALUES
('研发部', '北京总部', 1000000.00, 'RD001'),
('市场部', '上海分部', 800000.00, 'MK001'),
('销售部', '广州分部', 900000.00, 'SL001'),
('财务部', '深圳分部', 700000.00, 'FA001'),
('人力资源部', '北京总部', 600000.00, 'HR001'),
('客服部', '成都分部', 500000.00, 'CS001'),
('设计部', '杭州分部', 750000.00, 'DE001'),
('法务部', '北京总部', 400000.00, 'LE001'),
('运营部', '武汉分部', 850000.00, 'OP001'),
('采购部', '南京分部', 650000.00, 'PU001');
-- 插入员工数据
INSERT INTO employees (name, gender, salary, hire_date, department_id, employee_code) VALUES
('张三', '男', 8000.00, '2023-01-01', 1, 'E0001'),
('李四', '女', 9000.00, '2023-02-01', 1, 'E0002'),
('王五', '男', 7500.00, '2023-03-01', 2, 'E0003'),
('赵六', '女', 8500.00, '2023-04-01', 2, 'E0004'),
('孙七', '男', 9500.00, '2023-05-01', 3, 'E0005'),
('周八', '女', 8200.00, '2023-06-01', 3, 'E0006'),
('吴九', '男', 7800.00, '2023-07-01', 4, 'E0007'),
('郑十', '女', 8800.00, '2023-08-01', 4, 'E0008'),
('王十一', '男', 9200.00, '2023-09-01', 5, 'E0009'),
('李十二', '女', 8300.00, '2023-10-01', 5, 'E0010'),
('张十三', '男', 7600.00, '2023-11-01', 6, 'E0011'),
('刘十四', '女', 8600.00, '2023-12-01', 6, 'E0012'),
('陈十五', '男', 9300.00, '2024-01-01', 7, 'E0013'),
('杨十六', '女', 8400.00, '2024-02-01', 7, 'E0014'),
('黄十七', '男', 7900.00, '2024-03-01', 8, 'E0015'),
('胡十八', '女', 8900.00, '2024-04-01', 8, 'E0016'),
('林十九', '男', 9400.00, '2024-05-01', 9, 'E0017'),
('何二十', '女', 8100.00, '2024-06-01', 9, 'E0018'),
('郭二十一', '男', 7700.00, '2024-07-01', 10, 'E0019'),
('马二十二', '女', 8700.00, '2024-08-01', 10, 'E0020');
-- 向 student 表插入 10 条数据
INSERT INTO student (id, name, gender, student_code) VALUES
(1, '小明', '男', 'S001'),
(2, '小红', '女', 'S002'),
(3, '小刚', '男', 'S003'),
(4, '小丽', '女', 'S004'),
(5, '小强', '男', 'S005'),
(6, '小美', '女', 'S006'),
(7, '小辉',
