看完本文你将速通Mysql基本操作和最常用的增删改查。看完你就是sqlboy

如果你再看完 Mysql攻略-进阶功能 这篇文章,你将速通:连表查询,分组与统计,子查询,事务,索引,窗口函数,悲观锁,处理 JSON 数据,复杂逻辑处理(if else),性能分析,存储过程与触发器等等高级功能你会瞬间变成Mysql高手

通过Docker安装和使用Mysql

安装和启动

这里我用docker了,因为ubuntu的apt源里面没有mysql,安装的话随意了喜欢哪种方式用那种方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cloudyou@cloudyou-i1025P:~$ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
Digest: sha256:5ca0a273ed28c73acaef91da8bf1eca3711bee94bce4c378d42846375e645a72
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
cloudyou@cloudyou-i1025P:~$ docker run -d \
> --name mysql-test \
> -e MYSQL_ROOT_PASSWORD=123456 \
> -p 3306:3306 \
> mysql
1ca08ce15790ffddff0440424b3c589a68f5c09aac5110632f9959a1485e8
cloudyou@cloudyou-i1025P:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ca08ce15790 mysql "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp mysql-testdcc

用先把mysql pull下来后,使用了docker run来运行。

  • -d:后台运行,不霸占终端

  • --name mysql-test:给容器起个名字,方便后面折腾

  • MYSQL_ROOT_PASSWORD=123456:指定Mysql的root用户密码

  • -p 3306:3306:宿主机 ↔ 容器端口打通

  • mysql:刚 pull 下来的那个镜像

现在使用docker ps就可以看到mysql的容器在运行了

停止/删除这个容器

使用docker stop 容器名 或者 docker kill 容器名

1
2
3
4
5
cloudyou@cloudyou-i1025P:~$ docker stop mysql-test
mysql-test
cloudyou@cloudyou-i1025P:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cloudyou@cloudyou-i1025P:~$

可以看到没东西了

删除的话同理,使用 docker rm 容器名 就行,这里不演示了

exec进入sql shell

使用 docker exec -it mysql-test mysql -uroot -p

-it 其实是两个参数的合体写法:

-i = interactive(保持标准输入),让键盘输入能传进容器

-t = tty(分配一个终端),给一个“像终端一样”的交互界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cloudyou@cloudyou-i1025P:~$ docker exec -it mysql-test mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 9.5.0 MySQL Community Server - GPL

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

使用Mysql Shell连接到数据库

使用 \connect 用户名@数据库地址 来连接到数据库

Mysql Shell是支持Python js 和 sql 的,如果不是SQL那要先 \sql 切换到sql语句

1
2
3
4
5
6
7
8
9
MySQL  SQL > \connect root@192.168.31.238
Creating a session to 'root@192.168.31.238'
Please provide the password for 'root@192.168.31.238': ******
Save password for 'root@192.168.31.238'? [Y]es/[N]o/Ne[v]er (default No): Y
Fetching global names for auto-completion... Press ^C to stop.
Your MySQL connection id is 9
Server version: 9.5.0 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
MySQL 192.168.31.238:3306 ssl SQL >

上手之前

自带的数据库干嘛用的?

进入sql shell后,使用show databases;可以看到自带了4个数据库

1
2
3
4
5
6
7
8
9
10
MySQL  192.168.31.238:3306 ssl  SQL > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.0164 sec)

mysql

这是最老、最重要的库。里面装的是什么?

用户账号,密码哈希,权限,角色,grant 规则

常见表:

  • mysql.user

  • mysql.db

  • mysql.tables_priv

用户能不能连、能干啥,全写在 mysql

information_schema

这是一个只读的、虚拟的库。它不存数据,只反映“现在的状态”

比如:有哪些库,有哪些表,字段类型,索引,表大小

比如常见的 SHOW TABLES;其实等价于SELECT * FROM information_schema.tables WHERE table_schema = 'xxx';

他是说明现在Mysql长什么样

performance_schema

这是 MySQL 的监控系统。看 SQL 慢不慢,哪些锁卡人,IO 用量,内存消耗,线程状态

慢查询、性能分析工具,背后大多在读它。

特点:数据是实时的,重启会清空,对性能有轻微影响(可配置)

它记录 MySQL“现在累不累”

sys

这是个“视图库”,不是原始数据。它干了啥?

把 performance_schema 里一堆表,包装成好读的视图

总之 sys = performance_schema 的精装修版

Mysql的数据类型

和编程语言类似,Mysql也提供了多种数据类型

数值类型

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

类型 大小 范围(有符号) 用途
TINYINT 1 Bytes (-128,127) 小整数值
SMALLINT 2 Bytes (-32 768,32 767) 大整数值
MEDIUMINT 3 Bytes (-8 388 608,8 388 607) 大整数值
INT或INTEGER 4 Bytes (-2 147 483 648,2 147 483 647) 大整数值
BIGINT 8 Bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) 极大整数值
FLOAT 4 Bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 单精度 浮点数值
DOUBLE 8 Bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 小数值

实际业务里常用的:

  • TINYINT (1字节)
    • 范围:-128 ~ 127。
    • 场景状态标识布尔值
    • 例子status (0=待付款, 1=已付款, 2=已发货),is_vip (0=否, 1=是)。
    • 注意:MySQL 里没有 Boolean 类型,通常用 TINYINT(1) 来存 true/false。
  • INT (4字节)
    • 范围:±21亿。
    • 场景:大多数表的主键 ID、库存数量、视频时长(秒)。
    • 技巧:如果不存负数(比如库存),建议加上 UNSIGNED,范围能翻倍到 42亿。
  • BIGINT (8字节)
    • 范围:极大(19位数字)。
    • 场景主键 ID(订单表)、视频播放量(像 YouTube 这种级别)。
    • 警示:电商的订单号通常很长(比如雪花算法生成的 ID),INT 存不下,必须用 BIGINT

小数部分如果和有关的话,不要用FLOAT / DOUBLE

它们是浮点数,会有精度丢失。存 19.9,可能数据库里变成 19.90000000119.89999999

和钱相关的业务使用:DECIMAL(M, D)

  • 它是定点数,精准存储。
  • 场景:商品价格、钱包余额。
  • 常用配置DECIMAL(10, 2)
  • 10 表示总共 10 位数字(应对亿元级别的金额)。
  • 2 表示小数点后保留 2 位(精确到分)。

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。

类型 大小 ( bytes) 格式 用途
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 混合日期和时间值,时间戳
  • DATETIME
    • 场景订单创建时间用户注册时间
    • 优点:直观,存什么就是什么,不受时区影响
  • TIMESTAMP (时间戳)
    • 场景:记录数据最后修改时间(ON UPDATE CURRENT_TIMESTAMP)。
    • 缺点:时区转换问题,且这个数据类型有“2038年虫危机”(旧版本 MySQL 只能存到 2038 年),所以现在很多新系统倾向于用 DATETIME 或直接存 BIGINT (毫秒时间戳)。

字符串类型

名字、描述、链接

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据
  • CHAR(N) (固定长度)
    • 场景MD5 值手机号身份证号国家代码 (‘CN’, ‘US’)。
    • 理由:速度极快,不容易产生内存碎片。比如密码加密后固定是 32 位,就用 CHAR(32)
  • VARCHAR(N) (可变长度)
    • 场景用户名商品标题视频链接 (URL)评论
    • 注意N 代表字符数(不是字节)。VARCHAR(255) 是个习惯写法,但如果标题只有 20 字,写 VARCHAR(50) 索引效率会更高一点点。
  • TEXT / MEDIUMTEXT (大文本)
    • 场景商品详情页 HTML 代码博客正文
    • 坑点:查询时如果没必要,千万别 SELECT *TEXT 字段也查出来,非常拖慢网络传输和内存。

CHAR和VARCHAR的区别?

char是个定长的,比如char(10) ,不管存几个字符,都占 10 个字符空间。没用满的部分,会用空格补齐

varchar是动态长度的,比如varchar(10),最多 10 个字符,用多少占多少。省空间

什么时候用CHAR?

场景 类型
UUID(32位) CHAR(32)
MD5 CHAR(32)
SHA1 CHAR(40)
国家代码 CHAR(2)
性别 CHAR(1)

长度永远固定的场景,用 VARCHAR 反而多此一举。

Mysql的运算符

同理,Mysql也提供了用于查询的时候限定条件的运算符,这里列出些常用的

比较运算符

最基础的过滤方式,用于数值或字符串的精确比较。

运算符 含义 示例
= 等于 WHERE score = 100
<>!= 不等于 WHERE status != 'deleted'
> / < 大于 / 小于 WHERE price > 50
>= / <= 大于等于 / 小于等于 WHERE age >= 18
BETWEEN ... AND ... 在范围内(含边界) WHERE age BETWEEN 20 AND 30

逻辑运算符

当有多个条件需要同时判断时,使用逻辑运算符进行组合。

  • AND:所有条件都必须满足(且)。

  • OR:只要满足其中一个条件即可(或)。

  • NOT:取反,排除符合条件的行。

    • 示例: WHERE age > 18 AND gender = 'female'

模糊匹配与集合

  • LIKE:模糊查询,配合 %(任意个字符)和 _(单个字符)使用。

  • IN (...):查询字段值是否在给定的集合中。

    • 示例: WHERE city IN ('北京', '上海', '广州')
  • IS NULL:判断某个字段是否为空(注意:不能用 = NULL)。

数据库操作

创建,删除,使用~~

创建数据库

使用 create 命令创建数据库

1
CREATE DATABASE 数据库名;

比如我创建一个哈基米数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
MySQL  192.168.31.238:3306 ssl  SQL > create database Hachimi;
Query OK, 1 row affected (0.1453 sec)
MySQL 192.168.31.238:3306 ssl SQL > show databases;
+--------------------+
| Database |
+--------------------+
| Hachimi |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.0167 sec)

删除数据库

使用 drop 命令删除数据,IF EXISTS 是一个可选的子句,表示如果数据库存在才执行删除操作。

1
2
DROP DATABASE <database_name>; -- 直接删除数据库,不检查是否存在
DROP DATABASE [IF EXISTS] <database_name>;

把刚刚创建的哈基米数据库删除掉

1
2
3
4
5
6
7
8
9
10
11
12
MySQL  192.168.31.238:3306 ssl  SQL > drop database Hachimi;
Query OK, 0 rows affected (0.0408 sec)
MySQL 192.168.31.238:3306 ssl SQL > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.0194 sec)    

使用数据库

要选择要使用的数据库,使用 USE 语句 USE 数据库名;

使用数据库 Hachimi

1
2
3
4
MySQL  192.168.31.238:3306 ssl  SQL > use Hachimi;
Default schema set to `Hachimi`.
Fetching global names, object names from `Hachimi` for auto-completion... Press ^C to stop.
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

查看数据库里的表,使用 show tables;

表的操作

创建表

以下为创建 MySQL 数据表通用语法

1
2
3
4
5
CREATE TABLE [IF NOT EXISTS] 表名 (
列名1 数据类型 ,
列名2 数据类型 ,
...
);

比如这样创建一个用户表

1
2
3
4
5
6
7
8
9
CREATE TABLE IF NOT EXISTS UserData (
username VARCHAR(50),
userid INT,
phone VARCHAR(11),
isvip TINYINT(1),
passwd CHAR(32),
regTime DATETIME,
balance DECIMAL(10, 2)
);

执行后的效果如下,使用desc 表名查看表的描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > show tables;
+-------------------+
| Tables_in_Hachimi |
+-------------------+
| UserData |
+-------------------+
1 row in set (0.0144 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL > desc UserData;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| username | varchar(50) | YES | | NULL | |
| userid | int | YES | | NULL | |
| phone | varchar(11) | YES | | NULL | |
| isvip | tinyint(1) | YES | | NULL | |
| passwd | char(32) | YES | | NULL | |
| regTime | datetime | YES | | NULL | |
| balance | decimal(10,2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
7 rows in set (0.0450 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

修改表

修改列

1
ALTER TABLE 表名 MODIFY COLUMN 列名 新的数据类型;

比如我想把username从最长50个字符改成最长30个字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > ALTER TABLE UserData MODIFY COLUMN username VARCHAR(30);
Query OK, 0 rows affected (0.3134 sec)

Records: 0 Duplicates: 0 Warnings: 0
MySQL 192.168.31.238:3306 ssl Hachimi SQL > DESC UserData;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| username | varchar(30) | YES | | NULL | |
| userid | int | YES | | NULL | |
| phone | varchar(11) | YES | | NULL | |
| isvip | tinyint(1) | YES | | NULL | |
| passwd | char(32) | YES | | NULL | |
| regTime | datetime | YES | | NULL | |
| balance | decimal(10,2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
7 rows in set (0.0174 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

MODIFY COLUMN不只是仅限于数据类型

  1. 数据类型

ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型;

  1. 是否允许 NULL

ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型 NOT NULL;

  1. 默认值

ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型 DEFAULT CURRENT_TIMESTAMP;

  1. 长度 / 精度(数字、字符类型)

ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型 NOT NULL;

修改列的名字

1
ALTER TABLE 表名 RENAME COLUMN 列名 TO 新的列名;

比如我想把username改名成dickname

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > ALTER TABLE UserData RENAME COLUMN username TO dickname;
Query OK, 0 rows affected (0.1856 sec)

Records: 0 Duplicates: 0 Warnings: 0
MySQL 192.168.31.238:3306 ssl Hachimi SQL > DESC UserData;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| dickname | varchar(30) | YES | | NULL | |
| userid | int | YES | | NULL | |
| phone | varchar(11) | YES | | NULL | |
| isvip | tinyint(1) | YES | | NULL | |
| passwd | char(32) | YES | | NULL | |
| regTime | datetime | YES | | NULL | |
| balance | decimal(10,2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
7 rows in set (0.0194 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

添加新的列

1
ALTER TABLE 表名 ADD COLUMN 列名 列的数据类型;

比如我想新建一个last_login

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > ALTER TABLE UserData ADD COLUMN last_login DATETIME;
Query OK, 0 rows affected (0.2408 sec)

Records: 0 Duplicates: 0 Warnings: 0
MySQL 192.168.31.238:3306 ssl Hachimi SQL > DESC UserData;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| dickname | varchar(30) | YES | | NULL | |
| userid | int | YES | | NULL | |
| phone | varchar(11) | YES | | NULL | |
| isvip | tinyint(1) | YES | | NULL | |
| passwd | char(32) | YES | | NULL | |
| regTime | datetime | YES | | NULL | |
| balance | decimal(10,2) | YES | | NULL | |
| last_login | datetime | YES | | NULL | |
+------------+---------------+------+-----+---------+-------+
8 rows in set (0.0150 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

删除列

1
ALTER TABLE 表名 DROP COLUMN 列名;

比如我想删掉刚刚创建的last_login

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > ALTER TABLE UserData DROP COLUMN last_login;
Query OK, 0 rows affected (0.2320 sec)

Records: 0 Duplicates: 0 Warnings: 0
MySQL 192.168.31.238:3306 ssl Hachimi SQL > DESC UserData;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| dickname | varchar(30) | YES | | NULL | |
| userid | int | YES | | NULL | |
| phone | varchar(11) | YES | | NULL | |
| isvip | tinyint(1) | YES | | NULL | |
| passwd | char(32) | YES | | NULL | |
| regTime | datetime | YES | | NULL | |
| balance | decimal(10,2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
7 rows in set (0.0168 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

删除表

使用DROP TABLE 表名即可

1
2
3
4
5
6
7
8
9
10
11
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > SHOW TABLES;
+-------------------+
| Tables_in_Hachimi |
+-------------------+
| UserData |
+-------------------+
1 row in set (0.0167 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL > DROP TABLE UserData;
Query OK, 0 rows affected (0.1020 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL > SHOW TABLES;
Empty set (0.0730 sec)

数据的操作

先把刚刚删掉的Hachimi表再创建回来,下面演示数据库四大金刚增删查改操作

INSERT-增(插)

单条插入

1
INSERT INTO user (列名) VALUES (数据);

比如我要往UserData里插入一条用户数据

1
2
3
4
5
6
7
8
9
10
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > INSERT INTO UserData (username,userid,phone,isvip,passwd,regTime,balance) VALUES ("哈基米",1,13988888888,0,"12B2E5A579905F6FDE204ED28BA209B6",CURRENT_TIMESTAMP,16.5);
Query OK, 1 row affected (0.0526 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL > select * from UserData;
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基米 | 1 | 13988888888 | 0 | 12B2E5A579905F6FDE204ED28BA209B6 | 2026-01-02 08:01:58 | 16.50 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
1 row in set (0.0161 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

可以看到UserData表里多了一个哈基米用户

可以不插入所有列的数据。如果不插入就会默认是NULL,如果有设置默认值的话就会是默认值

多条插入

1
INSERT INTO user (列名) VALUES (数据),(数据);

比如我要往UserData里再插入三条用户数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > INSERT INTO UserData (username,userid,phone,isvip,passwd,regTime,balance) VALUES
-> ("哈基爸",1,15564521111,0,"10617BC8A54FA085DC7F3E32E89EF7E9","2026-01-02 08:00:00",14.5),
-> ("哈基爷",1,16512341234,0,"12C544228857E7DB1A9872B5E37B5704","2026-01-02 09:00:00",12.5),
-> ("哈基孙",1,18912341234,0,"BBC7180B5D0FB714FD4CC0EEB480E10B","2026-01-02 09:00:00",12.5);
Query OK, 3 rows affected (0.0507 sec)

Records: 3 Duplicates: 0 Warnings: 0
MySQL 192.168.31.238:3306 ssl Hachimi SQL > select * from UserData;
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基米 | 1 | 13988888888 | 0 | 12B2E5A579905F6FDE204ED28BA209B6 | 2026-01-02 08:01:58 | 16.50 |
| 哈基爸 | 1 | 15564521111 | 0 | 10617BC8A54FA085DC7F3E32E89EF7E9 | 2026-01-02 08:00:00 | 14.50 |
| 哈基爷 | 1 | 16512341234 | 0 | 12C544228857E7DB1A9872B5E37B5704 | 2026-01-02 09:00:00 | 12.50 |
| 哈基孙 | 1 | 18912341234 | 0 | BBC7180B5D0FB714FD4CC0EEB480E10B | 2026-01-02 09:00:00 | 12.50 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
4 rows in set (0.0066 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

添加数据时使用默认值

还记得上面的修改列的内容吗,可以使用DEFAULT指定默认值

先把isvip,regTime,balance,passwd这几列设置一个默认值

1
2
3
4
ALTER TABLE UserData MODIFY COLUMN isvip INT DEFAULT 0;
ALTER TABLE UserData MODIFY COLUMN passwd CHAR(32) DEFAULT "E10ADC3949BA59ABBE56E057F20F883E";
ALTER TABLE UserData MODIFY COLUMN regTime DATETIME DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE UserData MODIFY COLUMN balance decimal(10,2) DEFAULT 0.0;

当然也可以合并成一条sql一次性修改

1
2
3
4
5
ALTER TABLE UserData
MODIFY COLUMN isvip INT DEFAULT 0,
MODIFY COLUMN passwd CHAR(32) DEFAULT 'E10ADC3949BA59ABBE56E057F20F883E',
MODIFY COLUMN regTime DATETIME DEFAULT CURRENT_TIMESTAMP,
MODIFY COLUMN balance DECIMAL(10,2) DEFAULT 0.0;

执行后的效果就是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > desc UserData;
+----------+---------------+------+-----+----------------------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+----------------------------------+-------------------+
| username | varchar(50) | YES | | NULL | |
| userid | int | YES | | NULL | |
| phone | varchar(11) | YES | | NULL | |
| isvip | int | YES | | 0 | |
| passwd | char(32) | YES | | E10ADC3949BA59ABBE56E057F20F883E | |
| regTime | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| balance | decimal(10,2) | YES | | 0.00 | |
+----------+---------------+------+-----+----------------------------------+-------------------+
7 rows in set (0.0095 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

这时候再新增数据,只需指定username userid phone三个列的内容,其余没有指定的内容就会使用默认值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > INSERT INTO UserData (username,userid,phone) VALUES ("哈基冯",2,13112345678);
Query OK, 1 row affected (0.0322 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL > select * from UserData;
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基米 | 1 | 13988888888 | 0 | 12B2E5A579905F6FDE204ED28BA209B6 | 2026-01-02 08:01:58 | 16.50 |
| 哈基爸 | 1 | 15564521111 | 0 | 10617BC8A54FA085DC7F3E32E89EF7E9 | 2026-01-02 08:00:00 | 14.50 |
| 哈基爷 | 1 | 16512341234 | 0 | 12C544228857E7DB1A9872B5E37B5704 | 2026-01-02 09:00:00 | 12.50 |
| 哈基孙 | 1 | 18912341234 | 0 | BBC7180B5D0FB714FD4CC0EEB480E10B | 2026-01-02 09:00:00 | 12.50 |
| 哈基冯 | 2 | 13112345678 | 0 | E10ADC3949BA59ABBE56E057F20F883E | 2026-01-02 08:23:47 | 0.00 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
5 rows in set (0.0149 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

SELECT-查

查询的SQL语句顺序要求如下

顺序 关键字 作用
1 SELECT 选哪些列
2 FROM 从哪个表
3 WHERE 过滤条件
4 ORDER BY 排序
5 LIMIT / OFFSET 分页截取

查全部

1
SELECT * FROM 表名;

比如我要查UserData下所有数据

1
2
3
4
5
6
7
8
9
10
11
12
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > select * from UserData;
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基米 | 1 | 13988888888 | 0 | 12B2E5A579905F6FDE204ED28BA209B6 | 2026-01-02 08:01:58 | 16.50 |
| 哈基爸 | 1 | 15564521111 | 0 | 10617BC8A54FA085DC7F3E32E89EF7E9 | 2026-01-02 08:00:00 | 14.50 |
| 哈基爷 | 1 | 16512341234 | 0 | 12C544228857E7DB1A9872B5E37B5704 | 2026-01-02 09:00:00 | 12.50 |
| 哈基孙 | 1 | 18912341234 | 0 | BBC7180B5D0FB714FD4CC0EEB480E10B | 2026-01-02 09:00:00 | 12.50 |
| 哈基冯 | 2 | 13112345678 | 0 | E10ADC3949BA59ABBE56E057F20F883E | 2026-01-02 08:23:47 | 0.00 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
5 rows in set (0.0172 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

查指定列

1
2
SELECT 列名 FROM 表名; --查单个列
SELECT 列名1,列名2 FROM 表名; --查多个列

比如我要查UserData下username和phone的数据

1
2
3
4
5
6
7
8
9
10
11
12
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > select username,phone from UserData;
+----------+-------------+
| username | phone |
+----------+-------------+
| 哈基米 | 13988888888 |
| 哈基爸 | 15564521111 |
| 哈基爷 | 16512341234 |
| 哈基孙 | 18912341234 |
| 哈基冯 | 13112345678 |
+----------+-------------+
5 rows in set (0.0119 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

条件查询

1
SELECT 字段 FROM 表名 WHERE 查询条件;

查询条件需要配合上面的Mysql的运算符来一起使用

现在数据表里都是哈基一家人,比如我想找到哈基冯的所有数据或者单独找到手机号数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > select * from UserData where username like "%冯";
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基冯 | 2 | 13112345678 | 0 | E10ADC3949BA59ABBE56E057F20F883E | 2026-01-02 08:23:47 | 0.00 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
1 row in set (0.0170 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL > select phone from UserData where username like "%冯";
+-------------+
| phone |
+-------------+
| 13112345678 |
+-------------+
1 row in set (0.0189 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

如果使用LIKE,不加%或者_的话就是要求精确匹配

排序 + 分页

1
2
3
SELECT * FROM 表名
ORDER BY 列名 DESC
LIMIT 要取多少条 OFFSET 跳过多少条;

DESC是指从高到低,如果要换成从低到高就换成ASC(或者干脆不写,因为默认就是升序)

比如我要取哈基一家最富有的前二名

1
2
3
4
5
6
7
8
9
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > SELECT * FROM UserData ORDER BY balance DESC LIMIT 2;
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基米 | 1 | 13988888888 | 0 | 12B2E5A579905F6FDE204ED28BA209B6 | 2026-01-02 08:01:58 | 16.50 |
| 哈基爸 | 1 | 15564521111 | 0 | 10617BC8A54FA085DC7F3E32E89EF7E9 | 2026-01-02 08:00:00 | 14.50 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
2 rows in set (0.0118 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

如果我要看第二页,就使用OFFSET

1
2
3
4
5
6
7
8
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > SELECT * FROM UserData ORDER BY balance DESC LIMIT 2 OFFSET 2;
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基爷 | 1 | 16512341234 | 0 | 12C544228857E7DB1A9872B5E37B5704 | 2026-01-02 09:00:00 | 12.50 |
| 哈基孙 | 1 | 18912341234 | 0 | BBC7180B5D0FB714FD4CC0EEB480E10B | 2026-01-02 09:00:00 | 12.50 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
2 rows in set (0.0052 sec)

使用运算符增加查询条件,比如要求余额还得大于15

1
2
3
4
5
6
7
8
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > SELECT * FROM UserData WHERE balance > 15 ORDER BY balance DESC LIMIT 2 OFFSET 0;
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基米 | 1 | 13988888888 | 0 | 12B2E5A579905F6FDE204ED28BA209B6 | 2026-01-02 08:01:58 | 16.50 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
1 row in set (0.0120 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

UPDATE-改

1
UPDATE 表名 SET 列名 = 数据 WHERE 条件;

全局更新

如果不加WHERE的话就会修改表内所有的数据。比如现在我要给哈基一家全都开通VIP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > update UserData set isvip = 1;
Query OK, 5 rows affected (0.0311 sec)

Rows matched: 5 Changed: 5 Warnings: 0
MySQL 192.168.31.238:3306 ssl Hachimi SQL > select * from UserData;
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基米 | 1 | 13988888888 | 1 | 12B2E5A579905F6FDE204ED28BA209B6 | 2026-01-02 08:01:58 | 16.50 |
| 哈基爸 | 1 | 15564521111 | 1 | 10617BC8A54FA085DC7F3E32E89EF7E9 | 2026-01-02 08:00:00 | 14.50 |
| 哈基爷 | 1 | 16512341234 | 1 | 12C544228857E7DB1A9872B5E37B5704 | 2026-01-02 09:00:00 | 12.50 |
| 哈基孙 | 1 | 18912341234 | 1 | BBC7180B5D0FB714FD4CC0EEB480E10B | 2026-01-02 09:00:00 | 12.50 |
| 哈基冯 | 2 | 13112345678 | 1 | E10ADC3949BA59ABBE56E057F20F883E | 2026-01-02 08:23:47 | 0.00 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
5 rows in set (0.0248 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

条件更新

通过WHERE条件,来单独再关掉哈基米的VIP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > update UserData set isvip = 0 where username like "哈基米";
Query OK, 1 row affected (0.0387 sec)

Rows matched: 1 Changed: 1 Warnings: 0
MySQL 192.168.31.238:3306 ssl Hachimi SQL > select * from UserData; ";
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基米 | 1 | 13988888888 | 0 | 12B2E5A579905F6FDE204ED28BA209B6 | 2026-01-02 08:01:58 | 16.50 |
| 哈基爸 | 1 | 15564521111 | 1 | 10617BC8A54FA085DC7F3E32E89EF7E9 | 2026-01-02 08:00:00 | 14.50 |
| 哈基爷 | 1 | 16512341234 | 1 | 12C544228857E7DB1A9872B5E37B5704 | 2026-01-02 09:00:00 | 12.50 |
| 哈基孙 | 1 | 18912341234 | 1 | BBC7180B5D0FB714FD4CC0EEB480E10B | 2026-01-02 09:00:00 | 12.50 |
| 哈基冯 | 2 | 13112345678 | 1 | E10ADC3949BA59ABBE56E057F20F883E | 2026-01-02 08:23:47 | 0.00 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
5 rows in set (0.0123 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL >

DELETE-删

1
DELETE FROM 表名 WHERE 条件;

条件删除

比如我要删掉哈基米的用户数据

1
2
3
4
5
6
7
8
9
10
11
12
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > delete from UserData where username like "哈基米";
Query OK, 1 row affected (0.1144 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL > select * from UserData; ";
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| username | userid | phone | isvip | passwd | regTime | balance |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
| 哈基爸 | 1 | 15564521111 | 1 | 10617BC8A54FA085DC7F3E32E89EF7E9 | 2026-01-02 08:00:00 | 14.50 |
| 哈基爷 | 1 | 16512341234 | 1 | 12C544228857E7DB1A9872B5E37B5704 | 2026-01-02 09:00:00 | 12.50 |
| 哈基孙 | 1 | 18912341234 | 1 | BBC7180B5D0FB714FD4CC0EEB480E10B | 2026-01-02 09:00:00 | 12.50 |
| 哈基冯 | 2 | 13112345678 | 1 | E10ADC3949BA59ABBE56E057F20F883E | 2026-01-02 08:23:47 | 0.00 |
+----------+--------+-------------+-------+----------------------------------+---------------------+---------+
4 rows in set (0.0283 sec)

跑路了兄弟

如果不加WHERE就是全表删除了

1
2
3
4
MySQL  192.168.31.238:3306 ssl  Hachimi  SQL > delete from UserData;
Query OK, 4 rows affected (0.0550 sec)
MySQL 192.168.31.238:3306 ssl Hachimi SQL > select * from UserData;
Empty set (0.0215 sec)

作为sqlboy还需要知道的…

1. 什么是主键 ?

主键就像是每个人的身份证号

  • 唯一性:表里的每一行数据,主键值必须是独一无二的。

  • 非空性:主键绝对不能为空(NOT NULL)。

  • 作用:它是每一行数据的“唯一标识”,数据库通过主键精准定位某一行。

注意: 一个表只能有一个主键。

2. 怎么设置主键?

通常在创建表(CREATE TABLE)的时候指定。最常见的方法是让它自动递增AUTO_INCREMENT),这样你插入数据时就不用管它,数据库会自动帮你数数(1, 2, 3…)。

创建表时设置:

1
2
3
4
CREATE TABLE Users (
userid INT PRIMARY KEY AUTO_INCREMENT, -- 设置userid为主键,且自动增长
username VARCHAR(50)
);

如果表已经创建了,想给现有列加主键:

1
ALTER TABLE UserData ADD PRIMARY KEY (userid);

3. 怎么配置列的内容不能重复?

如果想让某列(比如手机号、邮箱)不重复,但不把它当成主键,就需要使用 UNIQUE(唯一约束)

  • 区别:主键一张表只能有一个,但 UNIQUE 约束可以给很多列都加上。

  • 空值UNIQUE 允许内容为空(NULL),但只要有内容,就必须唯一。

示例:

1
2
3
4
5
CREATE TABLE UserData (
userid INT PRIMARY KEY AUTO_INCREMENT,
phone VARCHAR(20) UNIQUE, -- 设置手机号不能重复
email VARCHAR(50) UNIQUE -- 设置邮箱也不能重复
);