MySQL基础知识总结

一、MySQL简述

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

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

数据

数据是数据库存储与处理的基础素材,涵盖文本、数值、图像等各类信息形式 。在 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 unsigned 1 [-128,127] [0,255]
smallint 2 [-32768,32767] [0,65535]
mediumint 3 [-8388608,8388607] [0,16777215]
int 4 [-2147483648,2147483647] [0,4294967295]
bigint 8 [-9223372036854775808,9223372036854775807] [0,18446744073709551616]
浮点数类型和定点数类型

浮点型:

数据类型 字节数 备注
float 4 单精度浮点型 7
double 8 双精度浮点型 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。下图列举了日期和时间数据类型所对应的字节数、取值范围、日期格式以及零值:

数据类型 字节数 格式 备注
date 3 yyyy-MM-dd 存储日期值
time 3 HH:mm:ss 存储时分秒
year 1 yyyy 存储年
datetime 8 yyyy-MM-dd HH:mm:ss 存储日期+时间
timestamp 4 yyyy-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

数据库的基本操作
sql 复制代码
[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"错误。

sql 复制代码
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: 0

mysql> alter table student1 change sex gender char(2) ;        #修改sex列名为gender
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table student1 modify  gender varchar(20) ;		#修改gender数据类型
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table student1 modify  score int ;					#修改score数据类型为int
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table student1 drop addr;							#删除addr列
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 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)

小结

sql 复制代码
# 新建表
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  表名;  
相关推荐
就叫飞六吧3 小时前
麻溜启动Oracle实例demo
数据库·oracle
早睡冠军候选人6 小时前
SQL(结构化查询语言)的四大核心分类
大数据·数据库·sql
Lisonseekpan7 小时前
MVCC的底层实现原理是什么?
java·数据库·后端·mysql
一勺-_-7 小时前
全栈:JDBC驱动版本和SQLserver版本是否有关系?怎么选择JDBC的版本号?
数据库·sqlserver
HMBBLOVEPDX7 小时前
MySQL的存储引擎:
数据库·mysql·存储引擎
灰原喜欢柯南7 小时前
实战:MyBatis 中 db.properties 的正确配置与最佳实践
java·数据库·mybatis
Icey_World8 小时前
Mysql笔记-系统变量\用户变量管理
mysql·存储过程·系统变量·用户变量·会话变量
水根LP498 小时前
利用微软SQL Server数据库管理员(SA)口令为空的攻击活动猖獗
数据库·microsoft·sqlserver·dba
Starry_hello world8 小时前
MySql 表的操作
数据库·笔记·mysql