当前位置: 首页 > news >正文

MySQL基础知识总结

一、MySQL简述

数据库 是一个有组织的集合,用于存储和管理数据的系统。它是一个软件系统,被设计用来存储、检索和管理数据,并提供数据的快速访问和处理。数据库可以被看作是一种特殊的文件系统,但与传统的文件系统不同的是:它能够更加高效的存储和管理大量结构化数据。

数据库主要由数据库管理系统(DBMS)和数据库组成:

image-20250810194211069

数据

数据是数据库存储与处理的基础素材,涵盖文本、数值、图像等各类信息形式 。在 MySQL 应用场景里,像学生信息管理系统中的学号、姓名,成绩统计里的分数,都属于待存储、分析的数据,是后续数据库操作的核心对象

数据库
  • 存储数据的仓库,是长期存放在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按照一定数据模型组织、描述和存储,具有较小的冗余度,较高的独立性和易扩展性,并为各种用户共享,总结为以下几点:
  • 数据结构化 excel表 行 一条数据 一列一个属性(数据类型)

  • 数据的共享性高,冗余度低,易扩充

  • 数据独立性高

  • 数据由 DBMS 统一管理和控制(安全性、完整性、并发控制、故障恢复)

    注:

    1. 物理独立性高
      数据的物理存储细节(如存储路径、文件格式、索引类型、分表分库方式等)的改变,不会影响应用程序。
      例如:将数据从 MyISAM 引擎迁移到 InnoDB 引擎,或调整索引为 B + 树 / 哈希索引,应用程序的 SQL 查询无需修改 ——MySQL 通过 “模式 - 内模式映射” 自动处理底层存储与逻辑结构的适配。
    2. 逻辑独立性较强
      当数据的逻辑结构(如表结构、字段增减、表间关系)发生变化时,可通过视图(View)等机制隔离影响,减少对应用程序的改动。
      例如:在用户表中新增 “邮箱” 字段,只要应用程序查询依赖的视图(如仅包含 “ID”“姓名”)未变,原有查询语句可正常运行 —— 通过 “外模式 - 模式映射” 实现逻辑结构与应用的解耦。
常见数据库
关系型数据库

关系型数据库(RDBMS)是基于关系模型(二维表格结构)的数据库,核心特点是:

  • 数据结构固定:以表为单位,表由行列组成,字段定义严格(如数据类型、长度),表与表通过外键建立关联,形成严谨的关系模型。
  • 强事务支持:遵循 ACID 特性(原子性、一致性、隔离性、持久性),确保数据操作的准确性和完整性,适合需要严格事务的场景(如金融交易、订单管理)。
  • 标准化查询:使用 SQL(结构化查询语言)统一操作数据,支持复杂查询(如多表关联、聚合分析)。
  • 典型代表:MySQL、Oracle、SQL Server、PostgreSQL、浪潮K-DB 、武汉达梦、南大通用、人大金仓、华为高斯等。
非关系型数据库(NoSQL)

非关系型数据库是为解决海量数据、高并发、灵活结构等需求而设计,核心特点是:

  • 数据结构灵活:无固定表结构,支持键值对(Redis)、文档(MongoDB)、列族(HBase)、图形(Neo4j)等多种模型,可按需动态调整数据格式。

  • 侧重可用性与扩展性:遵循 BASE 理论(基本可用、软状态、最终一致性),牺牲部分强一致性以换取高吞吐量和横向扩展能力(通过增加节点扩容)。

  • 查询方式多样:无统一查询语言,多通过 API 操作,适合简单查询,复杂逻辑需在应用层实现。

  • 典型代表:Redis(缓存、计数)、MongoDB(文档存储)、HBase(海量数据)、Neo4j(图形关系)。

    类型数据模型核心特点代表产品典型应用场景
    键值存储键(Key)与值(Value)对应简单高效,查询速度快,适合简单数据映射Redis、Memcached、Riak缓存、会话存储、计数器
    文档存储类似 JSON 的文档格式支持嵌套结构,查询灵活,适合半结构化数据MongoDB、CouchDB内容管理(博客、电商商品描述)、日志存储
    列族存储按列族(Column Family)组织擅长读取大量数据,适合数据分析和历史数据存储HBase、Cassandra大数据分析、时序数据(如传感器数据)
    图形数据库节点(Node)和边(Edge)专注于存储实体间的关系,适合复杂关联查询Neo4j、JanusGraph社交网络关系、推荐系统、知识图谱
架构
  • 网络连接层:基于 TCP/IP 协议建立客户端与服务器连接,验证用户身份权限,借助连接池管理线程,控制连接数量,可用 show processlist 查看连接状态,负责连接建立与资源分配 。
  • 数据库服务层:处理核心逻辑,SQL 接口接收操作命令,解析器校验 SQL 语法语义,优化器选最优执行计划,缓存与缓冲区用内存暂存数据减磁盘 IO,还实现存储过程等跨引擎功能 。
  • 存储引擎层:作为可插拔的执行部件,不同引擎(如 InnoDB、MyISAM )依特性读写数据,InnoDB 适配高并发,MyISAM 适合读多写少,对接服务层计划并操作磁盘文件 。
  • 文件系统层:依托磁盘存数据,含日志(记录操作、保障恢复 )、数据(存储表及索引等 )、配置文件,实现数据持久化,借日志支持追溯与故障恢复

二、MySQL安装部署

Windows安装MySql8.0

三、数据类型

整数类型
数据类型字节数带符号值范围不带符号值范围 unsigned
tinyint unsigned1[-128,127][0,255]
smallint2[-32768,32767][0,65535]
mediumint3[-8388608,8388607][0,16777215]
int4[-2147483648,2147483647][0,4294967295]
bigint8[-9223372036854775808,9223372036854775807][0,18446744073709551616]
浮点数类型和定点数类型

浮点型:

数据类型字节数备注
float4单精度浮点型 7
double8双精度浮点型 15
  • 注意:可以使用float(M,D)、double(M,D)格式限制宽度按(M)和精度(D),如float(3,2),不指定M、D的时,会按照实际的精度来处理

  • 定点型:decimal(size,d) ,作为字符串存储的 DOUBLE 类型,允许固定的小数点,由于float、double类型存在精度丢失问题,即写入数据库的数据未必是插入数据库的数据,而decimal无论写入数据中的数据是多少,都不会存在精度丢失问题,这就是要引入decimal类型的原因,decimal类型常见于银行系统、互联网金融系统等对小数点后的数字比较敏感的系统中,结论:float/double在db中存储的是近似值,而decimal则是以字符串形式进行保存

字符串类型

在MySQL中常用CHAR 和 VARCHAR 表示字符串。两者不同的是:VARCHAR存储可变长度的字符串。
char是固定长度字符串,其长度范围为0~255且与编码方式无关,无论字符实际长度是多少,都会按照指定长度存储,不够的用空格补足,char类型数据时会将结尾的所有空格处理掉

数据类型描述
char(size)保存固定长度的字符串(可包含字母、数字以及特殊字 符)。在括号中指定字符串的长度。最多 255 个字符。
varchar(size)保存可变长度的字符串(可包含字母、数字以及特殊字 符)。在括号中指定字符串的最大长度。最多 255 个字 符。 注释:如果值的长度大于 255,则被转换为 TEXT 类型。
tinytext存放最大长度为 255 个字符的字符串。
text存放最大长度为 65,535 个字符的字符串。
blob用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。
mediumtext存放最大长度为 16,777,215 个字符的字符串。
mediumeBlob用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。
longtext存放最大长度为 4,294,967,295 个字符的字符串。
longblob用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。
enum(x,y,z,etc)允许输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。 注释:这些值是按照你输入的顺序存储的。 可以按照此格式输入可能的值: ENUM(‘X’,‘Y’,‘Z’)
set与 enum 类似, SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。
日期与时间类型

MySQL提供的表示日期和时间的数据类型分别是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。下图列举了日期和时间数据类型所对应的字节数、取值范围、日期格式以及零值:

数据类型字节数格式备注
date3yyyy-MM-dd存储日期值
time3HH:mm:ss存储时分秒
year1yyyy存储年
datetime8yyyy-MM-dd HH:mm:ss存储日期+时间
timestamp4yyyy-MM-dd HH:mm:ss存储日期+时间,可作时间戳

四、数据库、数据表的基本操作

数据库:create、drop、 alter、show
数据表:insert、delete、update、select
DDL【data definition language】 数据定义语言,用来维护存储数据的结构,代表指令: create, drop, alter
DML【data manipulation language】 数据操纵语言,用来对数据进行操作,代表指令: insert,delete,update
DML中又单独分了一个DQL,数据查询语言,代表指令: select
DCL【Data Control Language】 数据控制语言,主要负责权限管理和事务,代表指令: grant,revoke,commit

数据库的基本操作
[root@master ~]# mysql -uroot -pMysql@123
mysql> create database student;   		#创建数据库
Query OK, 1 row affected (0.00 sec)mysql> show create database student;    #查看该数据库基本信息
+----------+-----------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                                                   |
+----------+-----------------------------------------------------------------------------------------------------------------------------------+
| student  | CREATE DATABASE `student` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+-----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)mysql> drop database student;  	#删除数据库
Query OK, 0 rows affected (0.01 sec)mysql> show databases;				#查询出MySQL中所有的数据库
+--------------------+
| Database           |
+--------------------+
| db1                |
| db3                |
| db4                |
| db5                |
| information_schema |
| mydb4_product      |
| mydb5_sales        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
10 rows in set (0.00 sec)
mysql>  select user();   		 #查看当前用户
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
数据库的基本操作

数据库创建成功后可在该数据库中创建数据表(简称为表)存储数据。请注意:在操作数据表之前应使用“USE 数据库名;”指定操作是在哪个数据库中进行先关操作,否则会抛出“No database selected”错误。

mysql>  select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db3                |
| db4                |
| db5                |
| information_schema |
| mydb4_product      |
| mydb5_sales        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
10 rows in set (0.00 sec)
mysql> use db1
mysql> create table student1 (       #创建student1表-> id int ,-> name varchar(20),-> sex char(2),-> age int unsigned,-> score float,-> addr varchar(50));
ERROR 1050 (42S01): Table 'student1' already exists    #报错student1已存在
mysql> create table student10 ( id int , name varchar(20), sex char(2), agge int unsigned, score float, addr varchar(50));                              #修改为student10
Query OK, 0 rows affected (0.01 sec)mysql> desc student10;                                 查看表结构
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int          | YES  |     | NULL    |       |
| name  | varchar(20)  | YES  |     | NULL    |       |
| sex   | char(2)      | YES  |     | NULL    |       |
| age   | int unsigned | YES  |     | NULL    |       |
| score | float        | YES  |     | NULL    |       |
| addr  | varchar(50)  | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)mysql> drop table student1;                            #·删除student1
Query OK, 0 rows affected (0.00 sec)mysql> alter table student10 rename student1;          #将student10重命名为student1
Query OK, 0 rows affected (0.01 sec)mysql> desc student1;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int          | YES  |     | NULL    |       |
| name  | varchar(20)  | YES  |     | NULL    |       |
| sex   | char(2)      | YES  |     | NULL    |       |
| age   | int unsigned | YES  |     | NULL    |       |
| score | float        | YES  |     | NULL    |       |
| addr  | varchar(50)  | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)mysql> alter table student1 add phone_num int after score;     #在score列之后插入phone——num列
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> alter table student1 change sex gender char(2) ;        #修改sex列名为gender
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> alter table student1 modify  gender varchar(20) ;		#修改gender数据类型
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> alter table student1 modify  score int ;					#修改score数据类型为int
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> alter table student1 drop addr;							#删除addr列
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> desc student1;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id        | int          | YES  |     | NULL    |       |
| name      | varchar(20)  | YES  |     | NULL    |       |
| gender    | varchar(20)  | YES  |     | NULL    |       |
| age       | int unsigned | YES  |     | NULL    |       |
| score     | int          | YES  |     | NULL    |       |
| phone_num | int          | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)mysql> drop table student1;
Query OK, 0 rows affected (0.00 sec)

小结

# 新建表
create tables  表名(列名1 类型  , 列名2  类型 ……);
# 查看表结构
desc  表名;
# 修改表名
alter  table  旧表名  rename  新表名;
rename table 旧表名 to 新表名;
# 表中添加新列
alter table 表名 add  新列名 列类型  [after|first] 列名;after为之后)
# 删除列
alter table 表名 DROP 列名;
# 修改列名
alter table  表名 change  旧列名  新列名 列类型;
# 修改列类型
alter  table  表名  modify  列名  列类型;
# 移动列
alter table 表名 modify  列名  列类型 after 某列;
# 删除表
drop table  if  exists  表名;  
http://www.dtcms.com/a/325060.html

相关文章:

  • MySQL 序列使用详细说明
  • RAG (Retrieval-Augmented Generation) 原理详解与实例
  • 专题二_滑动窗口_最小覆盖子串
  • 【lucene】BlockDocsEnum 跟BlockImpactsDocsEnum 的区别
  • C++入门学习5
  • Boost.Asio io_service 与 线程 的分析
  • playwright-mcp 项目全解析:从理论到实践
  • 消息队列系统测试报告
  • Effective C++ 条款33:避免遮掩继承而来的名称
  • 企业临时文件分享方案:基于本地加密的轻量级实现
  • Unity3D游戏中如何制作空气墙
  • 动态群签名-DGS:实现抗女巫攻击
  • eBay功能升级:卖家提升流量与转化的新契机
  • 深入解析NumPy广播机制:让不同形状的数组无缝运算
  • 【MySQL——第三章 :MySQL库表操作】
  • Redis 数据类型和单线程模型补充
  • HyDE 在 RAG 知识问答助手中的应用解析
  • CentOS7安装和使用Workbench
  • AtomicStampedReference解决方案
  • 基于python/django框架的车型识别系统
  • 复现论文《基于Retinex理论和深度学习的低照度图像增强算法研究》
  • 问津集 #4:The Five-Minute Rule for the Cloud: Caching in Analytics Systems
  • windows运维
  • SF-CPI-SAP问题收集24:集成地址信息的村里字段无法页面显示问题
  • ECharts 的理解和简单应用笔记
  • 【无标题】消息队列(Message Queue)是一种**进程间通信(IPC)机制
  • 深度学习-卷积神经网络-AlexNet
  • index.d.ts 是什么?作用 + 怎么生成?
  • 糖果大冒险:公平分发的智慧挑战
  • Stagewise使用指南:从项目集成到效能跃迁的深度解析