数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。在现代应用开发中,数据库作为数据存储的核心,承载着系统的所有业务数据,是企业的核心资产。MySQL作为目前最流行的关系型数据库管理系统之一,其轻量、高效、开源的特性使其广泛应用于各类应用场景,从个人博客到大型企业系统均能见到其身影。
查看当前MySQL服务中存在的所有数据库,使用如下命令:
SHOW DATABASES;该命令会返回一个包含所有数据库名称的列表,包括MySQL自带的系统数据库(如information_schema、mysql、performance_schema等)。
在操作过程中,经常需要确认当前正在操作的数据库,可通过以下命令实现:
SELECT DATABASE();这是MySQL提供的内置函数,若未选择任何数据库,会返回NULL。
数据库的编码集直接影响数据存储的准确性(尤其是中文等特殊字符),查看当前数据库服务的默认编码集配置:
SHOW VARIABLES LIKE '%character%';该命令会显示与字符集相关的所有系统变量,包括客户端编码、连接编码、数据库编码等。
若数据库名称为MySQL关键字(如create、database、user等),直接使用会导致语法错误。此时需用反引号(`)包裹名称:
CREATE DATABASE `create`; -- 正确写法反引号的作用是告诉MySQL解释器,内部的内容作为标识符处理而非关键字。
对数据库进行操作前,需先指定要操作的数据库,使用USE命令:
USE db_name; -- 分号可省略例如,切换到my_db数据库:
USE my_db
切换后,可通过SELECT DATABASE();命令验证当前数据库是否正确切换。

删除数据库的语法如下:
DROP DATABASE [IF EXISTS] db_name;IF EXISTS:可选参数,避免删除不存在的数据库时出现错误删除数据库是极高风险的操作,执行后数据库内的所有表和数据将被彻底删除,且难以恢复。在实际开发中需遵循以下规范:
虽然删除操作风险高,但MySQL提供了一定的恢复手段:
在MySQL客户端中,可通过以下命令查看帮助:
\?该命令会显示MySQL客户端支持的所有命令及说明。

退出MySQL客户端的命令:
\q
也可使用exit或quit这两个命令实现相同的退出功能。
数据类型是数据库表设计的基础,合理选择数据类型不仅能节省存储空间,还能提高查询效率和数据准确性。MySQL提供了丰富的数据类型,可分为数值类型、字符串类型、日期类型三大类。
整型类型适用于存储整数数据,MySQL提供了多种不同长度的整型,以满足不同范围的存储需求:
数据类型 | 占用字节 | 有符号范围 | 无符号范围 | 对应Java类型 | 适用场景 |
|---|---|---|---|---|---|
TINYINT | 1 | -128~127 | 0~255 | byte | 状态标记(如0/1表示开关) |
SMALLINT | 2 | -32768~32767 | 0~65535 | short | 小范围计数(如商品库存不多于65535) |
INT | 4 | -231~231-1 | 0~2^32-1 | int | 普通计数(如用户ID、订单数量) |
BIGINT | 8 | -263~263-1 | 0~2^64-1 | long | 大数值存储(如雪花ID、大额交易记录) |
使用建议:
unsigned(无符号)属性,当数据可能超出有符号范围时,应升级数据类型(如INT不够用则换BIGINT)TINYINT可用于表示bool类型(0表示false,1表示true),等同于BIT(1)浮点类型用于存储带小数的数据,分为精确型和近似型两类:
数据类型 | 占用字节 | 说明 | 对应Java类型 | 适用场景 |
|---|---|---|---|---|
FLOAT(M,D) | 4 | 单精度浮点,M总长度,D小数位数,可能丢失精度 | float | 非精确计算(如温度、重量) |
DOUBLE(M,D) | 8 | 双精度浮点,精度高于FLOAT,仍可能有误差 | double | 科学计算(如物理参数) |
DECIMAL(M,D) | M+2 | 精确小数,M最大65,D最大30 | BigDecimal | 金额、汇率等精确计算场景 |
NUMERIC(M,D) | M+2 | 与DECIMAL完全等价 | BigDecimal | 同DECIMAL |
关键特性:
M表示总位数(不包含小数点和符号),D表示小数位数D,默认D=0;若省略M,默认M=10DECIMAL通过字符串存储实现精确计算,无精度丢失,是金额存储的首选(如订单金额、账户余额)decimal是真正意义上的双精度decimal的注意: 在有些系统中表示金额,一般把元为单位换成以分为单位,然后用int类型去表示金额 decimal == numeric,两者都等于Java中的BigDecimal M中不计算小数点和负数的,如果D为0,则具体的值不保存小数点和小数部分(也就是说保存的是一个整数) decimal的最大位数(M)为65,支持最大的小数(D)为30 如果省略D,则默认为0,如果省略M,则默认为10
总结:我们只要知道decimal可以保存很大的数就可以了,根据自己项目中的要求去设置小数精度
示例:
-- 存储最大9999.99的金额(总长度6,小数2位)
price DECIMAL(6,2)字符串类型用于存储文本数据,MySQL提供了多种灵活的类型选择:
数据类型 | 最大长度 | 特性 | 对应Java类型 | 适用场景 |
|---|---|---|---|---|
VARCHAR(SIZE) | 65535字节 | 可变长度,仅占用实际数据长度+1~2字节存储 | String | 短文本(用户名、标题、地址) |
TEXT | 65535字节 | 长文本,适合存储大量字符 | String | 文章内容、评论 |
MEDIUMTEXT | 16,777,215字节 | 中等长度文本 | String | 日志记录、详细描述 |
BLOB | 65535字节 | 二进制数据,存储字节流 | byte[] | 小型图片、文件(不推荐) |
VARCHAR深度解析:
SIZE表示字符数(而非字节),在utf8mb4编码下,每个字符占1~4字节VARCHAR(50),邮箱设为VARCHAR(100))使用建议:
TEXT存储频繁查询的短文本(影响性能)BLOB适用于存储小型二进制数据(如验证码图片),其中存放的是byte[]数组,也就是一个文件的二进制形式,但需注意数据库容量增长txt:是Windows系统中文本文件的默认后缀名 文本文件:人类可以直接看懂的文件,比如记事本里面写的日记,配置文件,Java源码 二进制文件:我们用文本编辑器打开的文件,里面是一堆乱码,这些文件只有机器可以读得懂,一般称之为二进制文件
注意: 一般在数据库中,不建议存文件,而是把文件存在磁盘上,在数据库相应的字段中保存文件路径,在查询文件的时候,先从数据库中找到文件路径,再去根据文件路径在磁盘上加载或是返回具体的真实文件
日期时间类型用于存储时间相关数据,MySQL提供了多种精度的类型:
数据类型 | 占用字节 | 范围 | 对应Java类型 | 特性 |
|---|---|---|---|---|
DATE | 3 | 1000-01-01~9999-12-31 | java.sql.Date | 仅存储年月日 |
TIME | 3 | -838:59:59~838:59:59 | java.sql.Time | 仅存储时分秒 |
DATETIME | 8 | 1000-01-01 00:00:00~9999-12-31 23:59:59 | java.sql.Timestamp | 存储年月日时分秒,不受时区影响 |
TIMESTAMP | 4 | 1970-01-01 00:00:00~2038-01-19 03:14:07 | java.sql.Timestamp | 存储时间戳,自动转换时区 |
YEAR | 1 | 1901~2155 | java.sql.Date | 仅存储年份 |
关键对比:
DATETIME与TIMESTAMP:前者范围更大,后者受时区影响(适合跨国应用)TIMESTAMP的2038年问题:由于其基于32位整数存储,代表从1970年开始,而且MySQL 是以毫秒为单位去计时的,超4字节就范围会取值,所以那么在2038年后会溢出,长期系统建议使用DATETIME2023-10-01 15:30:00),但内部以二进制存储使用场景:
DATE(仅需年月日)DATETIME(需完整时间且不受时区影响)TIMESTAMP(自动记录当前时区时间)数据表是数据库中存储数据的基本单位,由行(记录)和列(字段)组成。合理的表结构设计是高效存储和查询数据的前提;数据库服务里面包括数据库,数据库包括了多张表,表中包括了多条记录,每条记录包括了多个列。
创建表需先指定所属数据库,再定义表结构:
USE db_name;
CREATE TABLE [IF NOT EXISTS] table_name (
field1 data_type [comment '字段说明'],
field2 data_type [comment '字段说明'],
...
-- 最后一个字段后无逗号
) [comment '表说明'];table_name为自定义数据表的名字 field1 datatype:字段名 数据类型
创建学生表(包含ID和姓名):
CREATE TABLE IF NOT EXISTS student (
id BIGINT COMMENT '学生编号',
name VARCHAR(50) COMMENT '学生姓名'
) COMMENT '学生信息表';VARCHAR(50)而非VARCHAR)COMMENT说明,提高可维护性IF NOT EXISTS可避免重复创建错误(生产环境推荐使用),只需要查看warnings即可SHOW TABLES;该命令会返回当前数据库中所有表的列表。

查看表的字段定义、类型、约束等信息:
DESC table_name; -- 简写形式
-- 或
DESCRIBE table_name;
-- 或
SHOW COLUMNS FROM table_name;输出结果解析:
Field:字段名称Type:数据类型Null:是否允许为空(YES/NO)Key:索引类型(如PRI表示主键)Default:默认值,若某些数据为保密,那么我们就要去写默认值)
没有任何指定的时候就是nullExtra:额外信息(如自增、自动更新等)查看student表结构:
DESC student;输出:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | bigint | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+DROP TABLE [IF EXISTS] table_name [, table_name2 ...];TEMPORARY关键字可用于删除临时表:DROP TEMPORARY TABLE table_name;
删除表会导致表中所有数据永久丢失,操作前必须:
如果删除表的不存在:那么就会存在这条警告

而上述图片警告这种表示的是:库名.表名 来指定一张表在MySQL服务中的完全路径
命令行工具,只执行一些简单的查询或指令,如果一两句sql可以搞定就在这里面去执行,如果说要编复杂的SQL,比如复杂的表设计,复杂查询,建议大家还是去可视化工具中编写
那么对于复杂的表结构设计,通常会在可视化工具中编写SQL脚本,保存为一个本地的.SQL文件 然后在命令窗口执行文件,先把写好的文件的路径进行复制一下,再通过命令行执行:
.sql文件(如create_tables.sql)SOURCE /path/to/create_tables.sql; -- 绝对路径或相对路径
示例:
SOURCE D:/projects/sql/create_user_table.sql;设计一个简单的电商数据库(bit_mall),包含商品、客户、订单三个核心表:
goods):存储商品信息customer):存储客户信息purchase):存储购买记录-- 创建数据库并指定编码
CREATE DATABASE IF NOT EXISTS bit_mall
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
-- 切换到该数据库
USE bit_mall;goods)drop table if exists goods;
create table goods(
goods_id bigint comment '商品编号',
goods_name varchar(50) comment '商品名称',
unitprice decimal(10, 2) comment '单价,单位分',
category varchar(20) comment '商品分类',
provider varchar(50) comment '供应商名称'
);customer)create table if not exists customer(
customer_id int comment '客户编号',
name varchar(32) comment '客户姓名',
address varchar(256) comment '客户地址',
email varchar(64) comment '电子邮箱',
sex bit comment '性别',
card_id varchar(18) comment '身份证'
);purchase)create table if not exists purchase(
order_id int comment '订单号',
customer_id int comment '客户编号',
goods_id int comment '商品编号',
nums int comment '购买数量'
);数据库名、表名、字段名使用小写字母,单词间用下划线分隔(如user_info而非UserInfo)
避免使用MySQL关键字(如order、table),必须使用时加反引号
命名需体现业务含义(如goods_category表示商品分类,而非table1)
数值类型选择:根据数据范围选择最小合适类型(如存储年龄用TINYINT而非INT)
字符串类型:短文本用VARCHAR,长文本用TEXT,避免过度设置长度(如VARCHAR(255)够用就不设VARCHAR(1000))
日期类型:避免用字符串存储日期(如'2023-10-01'),应使用DATE或DATETIME,便于日期计算和索引
SELECT、INSERT、UPDATE权限,DROP、ALTER等高危权限仅授予管理员(一般数据库运维才有这种权限)utf8mb4,连接字符串指定characterEncoding=utf8mb4BIGINT,避免INT在用户量增长后溢出DATETIME存储时间,旧系统逐步迁移CREATE DATABASE)、查看(SHOW DATABASES)、使用(USE)、删除(DROP DATABASE)DECIMAL(金额)、VARCHAR(字符串)、DATETIME(日期)CREATE TABLE)、查看(DESC)、删除(DROP TABLE),理解逻辑删除的优势希望通过本文的学习,大家已经掌握MySQL数据库的基础操作和表设计原则。如果有什么不足,欢迎大家在评论区中指出!这节内容就先到这里了。