看完本文你将速通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 里
这是一个只读的、虚拟的库 。它不存数据,只反映“现在的状态”
比如:有哪些库,有哪些表,字段类型,索引,表大小
比如常见的 SHOW TABLES;其实等价于SELECT * FROM information_schema.tables WHERE table_schema = 'xxx';
他是说明现在Mysql长什么样
这是 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.900000001 或 19.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'
模糊匹配与集合
数据库操作 创建,删除,使用~~
创建数据库 使用 create 命令创建数据库
比如我创建一个哈基米数据库
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不只是仅限于数据类型
数据类型
ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型;
是否允许 NULL
ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型 NOT NULL;
默认值
ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型 DEFAULT CURRENT_TIMESTAMP;
长度 / 精度 (数字、字符类型)
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 UserDataMODIFY 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
分页截取
查全部
比如我要查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. 什么是主键 ? 主键就像是每个人的身份证号 。
注意: 一个表只能有一个主键。
2. 怎么设置主键? 通常在创建表(CREATE TABLE)的时候指定。最常见的方法是让它自动递增 (AUTO_INCREMENT),这样你插入数据时就不用管它,数据库会自动帮你数数(1, 2, 3…)。
创建表时设置:
1 2 3 4 CREATE TABLE Users ( userid INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR (50 ) );
如果表已经创建了,想给现有列加主键:
1 ALTER TABLE UserData ADD PRIMARY KEY (userid);
3. 怎么配置列的内容不能重复? 如果想让某列(比如手机号、邮箱)不重复,但不把它当成主键,就需要使用 UNIQUE(唯一约束) 。
示例:
1 2 3 4 5 CREATE TABLE UserData ( userid INT PRIMARY KEY AUTO_INCREMENT, phone VARCHAR (20 ) UNIQUE , email VARCHAR (50 ) UNIQUE );