MySQL基础操作2

以下是对该 MySQL 创建表语句 的逐部分详细解析,包含语法、数据类型、设计逻辑及注意事项:
1. 语句整体作用
CREATE TABLE t1(...)
- 核心功能:在当前数据库中创建一张名为
t1的表。 - 语法结构:
CREATE TABLE 表名 (列定义1, 列定义2, ...),括号内是列的详细配置(名称、数据类型、约束等)。
2. 逐列解析
(1) id int
- 列名:
id(通常用于标识记录的唯一ID)。 - 数据类型:
int(整数类型,默认范围-2147483648 ~ 2147483647,占4字节)。 - 常见用法:
- 若需作为主键(唯一标识行),建议添加
PRIMARY KEY约束,甚至结合AUTO_INCREMENT实现自增(如id int PRIMARY KEY AUTO_INCREMENT)。 - 仅
int类型时,允许存储任意整数,但无唯一性保证。
- 若需作为主键(唯一标识行),建议添加
(2) name varchar(10)
- 列名:
name(存储名称类字符串)。 - 数据类型:
varchar(10)(可变长度字符串)。varchar:根据实际内容占用存储空间(节省空间),但需额外1~2字节记录长度。(10):最大字符数限制(而非字节数),超出会报错(如插入11个字符的字符串会失败)。
- 适用场景:存储长度不固定、且长度有限的字符串(如姓名、昵称)。
(3) sex enum('man','gril')
- 列名:
sex(存储性别,限制可选值)。 - 数据类型:
enum(枚举类型,只能从预定义的选项中选一个值)。- 预定义选项:
'man'、'gril'(注意:gril可能是拼写错误,应为'girl',但MySQL不检查语义,仅按字面存储)。 - 存储机制:枚举值实际以整数索引存储(
'man'对应1,'gril'对应2),查询时自动转换为字符串,节省存储空间。
- 预定义选项:
- 优缺点:
- ✅ 优点:数据更规范(只能选预定义值),存储高效。
- ❌ 缺点:新增选项需修改表结构(
ALTER TABLE),灵活性低。
(4) age int
- 列名:
age(存储年龄)。 - 数据类型:
int(整数类型,同id列的类型说明)。 - 设计思考:
- 年龄通常为正整数,可结合 约束 优化(如
age int CHECK (age > 0),但MySQL 5.7及以下版本对CHECK支持有限,需通过触发器实现)。
- 年龄通常为正整数,可结合 约束 优化(如
3. 语法细节与潜在问题
(1) 语法正确性
- 列定义间用 逗号
,分隔,最后一列后不加逗号(否则报错)。 - 语句以 分号
;结尾(MySQL命令行客户端的结束标记)。 - 当前语句无语法错误,可正常执行(但需注意业务逻辑问题,如
gril的拼写)。
(2) 缺少的关键配置
- 主键约束:表若无主键,数据管理会很麻烦(如无法唯一定位行)。建议给
id加主键:id int PRIMARY KEY - 存储引擎与字符集:未指定时,继承数据库默认设置(如引擎为
InnoDB,字符集为latin1或utf8mb4)。如需显式指定:CREATE TABLE t1(...) ENGINE=InnoDB CHARSET=utf8mb4;
(3) 枚举值的“隐藏风险”
- 若插入不在枚举列表中的值,会报错(如
INSERT INTO t1(sex) VALUES ('woman')会失败)。 - 若插入空值
NULL,需确保列允许NULL(当前定义中,sex列未设NOT NULL,默认允许NULL)。
4. 完整优化建议(可选)
若要让表设计更健壮,可修改为:
CREATE TABLE t1 (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键+自增,确保唯一标识
name VARCHAR(10) NOT NULL, -- 名称非空
sex ENUM('man','girl') NOT NULL, -- 修正拼写错误,且非空(强制选性别)
age INT CHECK (age > 0) -- 年龄需为正数(MySQL 8.0+支持CHECK)
) ENGINE=InnoDB CHARSET=utf8mb4; -- 显式指定引擎和字符集
总结
- 该语句成功创建了一张简单表,但在约束、数据规范、存储细节上有优化空间。
- 重点理解
enum类型的“枚举限制”和varchar的“长度约束”,以及主键对表的重要性。 - 实际开发中,需结合业务需求(如是否允许空值、是否需要唯一标识)完善表设计。
![image]()
注意必须在MySQL里面运行
![image]()
用户的错误源于 “命令混淆”和“逻辑缺失”,以下是逐点分析和解决方法:
一、核心错误:命令与语法的双重问题
1. 命令关键字用错
-
CREATE DATABASE的作用是 创建数据库(相当于“文件夹”),语法只有:CREATE DATABASE 数据库名; -- 例如:CREATE DATABASE test_db;它不需要括号里的列定义(如
id int是表的结构,属于“文件内容”)。 -
你实际想 创建表(数据库里的“文件”),应使用
CREATE TABLE命令。
2. 缺少“数据库上下文”
表必须属于某个数据库,建表前需通过 USE 数据库名 切换到目标数据库,否则 MySQL 不知道表该存在哪里。
二、正确操作步骤(分3步)
步骤1:创建数据库(如果还没建)
CREATE DATABASE IF NOT EXISTS test_db; -- ①创建名为test_db的数据库(IF NOT EXISTS避免重复创建报错)
步骤2:进入数据库(切换上下文)
USE test_db; -- ②切换到test_db数据库,后续建表操作都属于这个数据库
步骤3:用CREATE TABLE建表(修正命令和语法)
CREATE TABLE t1 ( -- ③表名是t1,括号内是列定义
id INT, -- 列1:id,整数类型
name VARCHAR(10), -- 列2:name,最多10个字符的字符串
sex ENUM('man','gril'), -- 列3:sex,只能选'man'或'gril'(注意:`gril`可能是`girl`的拼写错误,建议修正)
age INT -- 列4:age,整数类型
);
三、额外优化建议(让表更健壮)
1. 修正枚举值拼写
把 gril 改为 girl(避免业务逻辑误解):
sex ENUM('man','girl'),
2. 添加主键(必做!表的核心约束)
主键用于唯一标识行,建议给 id 加 主键+自增(避免手动维护ID):
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键+自增,确保每行ID唯一且自动递增
3. 指定存储引擎和字符集
显式定义引擎(如 InnoDB,支持事务)和字符集(如 utf8mb4,支持 emoji):
CREATE TABLE t1 (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10),
sex ENUM('man','girl'),
age INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 适配生产环境的常见配置
四、错误对比(为什么原来的命令报错)
| 错误命令 | 错误原因 | 正确写法(对应场景) |
|---|---|---|
CREATE DATABASE t1(...) |
①用了建数据库的命令,却写了表的列定义 ② CREATE DATABASE 后面不能跟括号里的列 |
建数据库:CREATE DATABASE t1;(但通常数据库名不用t1,表名才用t1,建议数据库和表名区分开,比如数据库叫test_db,表叫t1) |
| 第二次尝试的逗号和括号问题 | 即使改了括号,命令还是CREATE DATABASE,本质错误没解决 |
必须换成CREATE TABLE,且先USE数据库 |
总结解决逻辑
- 先分清“数据库”和“表”:数据库是容器,表是容器里的结构。
- 命令要对应操作:建数据库用
CREATE DATABASE,建表用CREATE TABLE。 - 建表前必须选数据库:通过
USE切换上下文,否则表无处安放。
按上述步骤执行,即可成功建表 ✅。

在创建前必须使用database





修改密码




这段代码是 Linux 环境下 MySQL 数据库的建表语句,作用是在 wing 数据库中创建名为 t2 的表,以下逐行解析含义:
1. 整体结构
CREATE TABLE wing.t2( ... );
CREATE TABLE:MySQL 关键字,用于创建新表。wing.t2:wing是数据库名,t2是表名(格式:数据库名.表名,需确保wing数据库已存在)。
2. 列定义(每一行对应一个字段)
(1)id int primary key AUTO_INCREMENT not null,
id:列名(存储记录的唯一标识)。int:数据类型(整数)。primary key:约束,标记该列为主键(唯一、非空,用于快速定位记录)。AUTO_INCREMENT:约束,插入时若未指定id,会自动生成递增的整数值(如第一条记录id=1,第二条id=2...)。not null:约束,该列不允许为空。
(2)name varchar(30) not null,
name:列名(存储姓名)。varchar(30):数据类型,可变长度字符串,最多存 30 个字符。not null:该列不允许为空。
(3)sex enum('man','gril') default 'man' not null,
sex:列名(存储性别)。enum('man','gril'):数据类型,枚举值(只能选'man'或'gril',注意gril可能是girl的拼写错误,但语法合法)。default 'man':约束,若插入时未指定sex,默认值为'man'。not null:该列不允许为空。
(4)time date not null,
time:列名(存储日期,如2023-05-02)。date:数据类型,仅存储日期(不含时间)。not null:该列不允许为空。
(5)post varchar(50) not null,
post:列名(存储职位,如'instructor')。varchar(50):可变长度字符串,最多 50 字符。not null:不允许为空。
(6)job varchar(100),
job:列名(存储工作内容,如'teach')。varchar(100):可变长度字符串,最多 100 字符。- 无
not null:该列允许为空(插入时可省略该字段)。
(7)salary double(15,2) not null,
salary:列名(存储薪资)。double(15,2):数据类型,双精度浮点数,总长度 15 位(含整数和小数),其中小数部分占 2 位(如5000.00)。not null:不允许为空。
(8)office int,
office:列名(存储办公室编号,如501)。int:整数类型。- 无
not null:允许为空。
(9)dep_id int );
dep_id:列名(存储部门 ID,如100)。int:整数类型。- 无
not null:允许为空。
总结
- 表
t2用于存储人员信息,包含id(主键自增)、name(姓名)、sex(性别,枚举)、time(日期)、post(职位)、job(工作内容)、salary(薪资)、office(办公室)、dep_id(部门 ID)共 9 个字段。 - 约束规则:
id是主键且自增,name、sex、time、post、salary为必填字段,其余字段(job、office、dep_id)可选填。 - 细节:
sex的枚举值'gril'可能是拼写错误(应为'girl'),但语法上不影响执行。
![image]()
这条 MySQLINSERT语句 继续向wing.t2表插入 8行数据,结合表结构和数据细节解析如下:
一、整体逻辑
INSERT INTO wing.t2(name,sex,time,post,job,salary,office,dep_id)
VALUES
(行1), (行2), ..., (行8);
- 目标:向
wing数据库的t2表插入数据,指定填充name、sex、time、post、job、salary、office、dep_id列(id由自增主键自动生成)。
二、逐行数据解析(结合表结构约束)
表结构关键约束回顾:
sex:枚举('man','gril')(允许'man'或'gril',后者拼写可能为笔误,但语法合法)。job:varchar(100)(允许NULL或空字符串'',因无NOT NULL约束)。time:date类型,字符串如'20230502'会自动转为YYYY-MM-DD格式。
1. 第3行:('robin','man','20230502','instructor','teach',8000,501,100)
| 列名 | 值 | 类型匹配 & 约束 |
|---|---|---|
name |
'robin' |
varchar(30),非空,合法。 |
sex |
'man' |
符合枚举 ('man','gril'),合法。 |
time |
'20230502' |
转为 DATE 类型 2023-05-02,合法。 |
post |
'instructor' |
varchar(50),非空,合法。 |
job |
'teach' |
varchar(100),非空,合法。 |
salary |
8000 |
存为 8000.00(double(15,2)),合法。 |
office |
501 |
int,合法。 |
dep_id |
100 |
int,合法。 |
2. 第4行:('alice','gril','20230502','instructor','teach',7200,501,100)
sex为'gril'(符合枚举定义,即使拼写疑似'girl'笔误,语法仍合法)。
3. 第5行:('wing','man','20230502','hr','hrcc',600,502,101)
post为'hr'(职位:人力资源),job为'hrcc'(工作内容自定义)。
4. 第6行:('harry','man','20230502','hr', NULL,6000,502,101)
job为NULL:表示该字段无值(区别于空字符串),因job允许NULL,合法。
5. 第7行:('trf','gril','20230506','sale','salecc',20000,503,102)
time为'20230506'(转为2023-05-06),salary为20000(存为20000.00)。
6. 第8行:('test','gril','20230505','sale','salecc',2200,503,102)
time为'20230505'(转为2023-05-05)。
7. 第9行:('dog','man','20230505','sale', NULL,2200,503,102)
job为NULL:同第6行,合法(job允许NULL)。
8. 第10行:('alex','man','20230505','sale','',2200,503,102)
job为''(空字符串):表示字段值为空字符串(长度为0的字符串),与NULL不同(NULL是“无值”,''是“有值但为空”)。因job是varchar类型,允许存储空字符串,合法。
三、特殊场景总结
NULLvs 空字符串'':NULL:字段无值(需表列允许NULL)。'':字段有值但为空(varchar类型支持,本质是长度为0的字符串)。
- 枚举值容忍笔误:
sex的'gril'虽可能是'girl'笔误,但因建表时枚举定义包含它,插入仍合法。 - 自增主键:所有行的
id列无需显式赋值,MySQL 会自动从1开始递增分配(如jack是id=1,tom是id=2,以此类推)。
综上,这8行数据与前2行(jack、tom)共同完成 10条记录的批量插入,严格匹配表的列顺序、数据类型和约束规则,特殊值(NULL、空字符串)的处理也符合表结构定义。






单条件查询
多条件查询
关键字 BETWEEN AND
关键字 IS NULL
关键字 IN 集合查询
关键字 LIKE 模糊查询
1.单条件查询
mysql> select name,post from t2 where post='hr';
+-------+------+
| name | post |
+-------+------+
| wing | hr |
| harry | hr |
+-------+------+
2 rows in set (0.00 sec)
2.多条件查询
mysql> select name,post,salary from t2 where post='hr' and salary >5000;
+-------+------+---------+
| name | post | salary |
+-------+------+---------+
| harry | hr | 6000.00 |
+-------+------+---------+
1 row in set (0.00 sec)
3.查找薪资范围在8000-2000,使⽤BETWEEN区间
mysql> select name,salary from t2 where salary between 8000 and 20000;
+-------+----------+
| name | salary |
+-------+----------+
| robin | 8000.00 |
| trf | 20000.00 |
+-------+----------+
2 rows in set (0.00 sec)
4.查找部⻔为Null, 没有部⻔的员⼯
mysql> select name,job from t2 where job is null;
+-------+------+
| name | job |
+-------+------+
| harry | NULL |
| dog | NULL |
+-------+------+
2 rows in set (0.00 sec)
查找有部⻔的员⼯
mysql> select name,job from t2 where job is not null;
+-------+--------+
| name | job |
+-------+--------+
| jack | teach |
| tom | teach |
| robin | teach |
| alice | teach |
| wing | hrcc |
| trf | salecc |
| test | salecc |
| alex | |
+-------+--------+
8 rows in set (0.00 sec)
查看部⻔为空的员⼯
mysql> select name,job from t2 where job='';
+------+------+
| name | job |
+------+------+
| alex | |
+------+------+
1 row in set (0.00 sec)
5.集合查询
mysql> select name,salary from t2 where salary=4000 OR salary=5000 OR salary=8000;
mysql> select name,salary from t2 where salary in(4000,5000,8000);
+-------+---------+
| name | salary |
+-------+---------+
| jack | 5000.00 |
| robin | 8000.00 |
+-------+---------+
2 rows in set (0.01 sec)
6.模糊查询like, 通配符%
mysql> select * from t2 where name like 'al%';
+----+-------+------+------------+------------+-------+---------+--------+--------+
| id | name | sex | time | post | job | salary | office | dep_id |
+----+-------+------+------------+------------+-------+---------+--------+--------+
| 4 | alice | gril | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 |
| 10 | alex | man | 2018-02-05 | sale | | 2200.00 | 503 | 102 |
+----+-------+------+------------+------------+-------+---------+--------+--------+
2 rows in set (0.00 sec)
通配符__
mysql> select * from t2 where name like 'al__';
+----+------+-----+------------+------+------+---------+--------+--------+
| id | name | sex | time | post | job | salary | office | dep_id |
+----+------+-----+------------+------+------+---------+--------+--------+
| 10 | alex | man | 2018-02-05 | sale | | 2200.00 | 503 | 102 |










从第4条开始, 并显示5条数据
mysql> select * from t2 ORDER BY salary DESC limit 3,5;
+----+-------+------+------------+------------+--------+---------+--------+--------+
| id | name | sex | time | post | job | salary | office | dep_id |
+----+-------+------+------------+------------+--------+---------+--------+--------+
| 6 | harry | man | 2023-05-02 | hr | NULL | 6000.00 | 502 | 101 |
| 2 | tom | man | 2023-05-03 | instructor | teach | 5500.00 | 501 | 100 |
| 1 | jack | man | 2023-05-02 | instructor | teach | 5000.00 | 501 | 100 |
| 10 | alex | man | 2023-05-05 | sale | | 2200.00 | 503 | 102 |
| 8 | test | gril | 2023-05-05 | sale | salecc | 2200.00 | 503 | 102 |
+----+-------+------+------------+------------+--------+---------+--------+--------+
5 rows in set (0.00 sec)
LIMIT是MySQL中⽤于限制查询结果集的关键字,它可以在SELECT语句中使⽤。LIMIT语法如下:
SELECT column1, column2, ...
FROM table_name
LIMIT [offset,] row_count;
其中, column1, column2, ... 是要查询的列名, table_name 是要查询的表名。 offset 是可选的,表示从第
⼏条记录开始返回,默认为0,即从第⼀条记录开始返回。 row_count 表示要返回的记录数。
使⽤LIMIT⼦句时,可以只指定 row_count ,这样会从第⼀条记录开始返回指定的记录数。也可以同时指定
offset 和 row_count ,这样会从指定的记录开始返回指定的记录数。





这条 SQL 查询语句结合 分组(GROUP BY) 和 聚合函数(GROUP_CONCAT) 实现 “按职位分组,合并每组的姓名”,以下逐部分拆解:
一、语句结构解析
SELECT post, GROUP_CONCAT(name) FROM t2 GROUP BY post;
| 部分 | 作用 |
|---|---|
SELECT post |
选择 分组依据列 post(每个分组只显示一次 post 的值)。 |
GROUP_CONCAT(name) |
聚合函数:将 同一分组内的 name 列值拼接成一个字符串(默认用逗号分隔)。 |
FROM t2 |
从表 t2 中查询数据(需确保 t2 存在,且属于当前数据库或已明确库名)。 |
GROUP BY post |
按 post 列的值分组(相同 post 的行归为一组)。 |
二、聚合函数 GROUP_CONCAT 细节
- 功能:将分组内的列值 横向拼接,生成一个字符串。
- 默认分隔符:逗号
,(可通过GROUP_CONCAT(name SEPARATOR '|')自定义分隔符,如用|分隔)。 - 场景:适合合并同组的多个值(如“同一部门的所有员工姓名”)。
三、分组逻辑与结果对应
假设表 t2 中的数据如下(基于之前的插入语句):
| name | post | ... |
|---|---|---|
| wing | hr | ... |
| harry | hr | ... |
| jack | instructor | ... |
| tom | instructor | ... |
| robin | instructor | ... |
| alice | instructor | ... |
| trf | sale | ... |
| test | sale | ... |
| dog | sale | ... |
| alex | sale | ... |
分组过程:
post = 'hr'组:包含wing、harry→GROUP_CONCAT(name)结果为wing,harry。post = 'instructor'组:包含jack、tom、robin、alice→ 结果为jack,tom,robin,alice。post = 'sale'组:包含trf、test、dog、alex→ 结果为trf,test,dog,alex。
四、结果解读(对应截图)
| post | GROUP_CONCAT(name) | 含义 |
|---|---|---|
hr |
wing,harry |
职位为 hr 的员工:wing、harry。 |
instructor |
jack,tom,robin,alice |
职位为 instructor 的员工:4人。 |
sale |
trf,test,dog,alex |
职位为 sale 的员工:4人。 |
五、关键语法规则
-
GROUP BY与聚合函数的关系:- 若使用
GROUP BY,SELECT中的列 必须是分组依据列(如post) 或 聚合函数处理的列(如GROUP_CONCAT(name)),否则会触发语法错误(除非数据库开启宽松模式,但不符合标准 SQL)。
- 若使用
-
GROUP_CONCAT的长度限制:- MySQL 中,
GROUP_CONCAT默认有 长度限制(约 1024 字节),若拼接结果过长,需通过SET GLOBAL group_concat_max_len = 更大值;调整。
- MySQL 中,
综上,这条查询通过 分组 + 聚合,高效实现了 “按职位归类,合并同类人员姓名” 的需求,结果清晰展示了每个职位对应的员工名单。



正则表达式 ^ $






.外连接
SELECT 字段列表 FROM 表1 LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
左连接/右连接
LEFT JOIN从左表(play_list)返回所有的⾏,即使在右表中(dept_name)中没有匹配的⾏。
与LEFT JOIN相对应的有RIGHT JOIN关键字,会从右表那⾥返回所有的⾏,即使在左表中没有匹配的
⾏。





1. 公司MySQL版本
需结合实际环境,例如:
“我司核心业务使用 MySQL 8.0(利用CTE、窗口函数等新特性),老项目兼容 5.7 版本。”
2. MySQL数据类型(核心分类)
- 数值:
INT(整数)、DECIMAL(高精度小数)、FLOAT/DOUBLE(浮点数)。 - 字符串:
VARCHAR(变长字符串)、TEXT(大文本)、ENUM(枚举)、SET(集合)。 - 日期时间:
DATETIME(日期+时间)、TIMESTAMP(时间戳,关联时区)、DATE(仅日期)。
3. 增删改查SQL(核心语句)
- 增:
INSERT INTO 表(列) VALUES(值);(批量插入可接多个(值))。 - 删:
DELETE FROM 表 WHERE 条件;(无WHERE会删全表,需谨慎)。 - 改:
UPDATE 表 SET 列=值 WHERE 条件;(无WHERE会改全表,需谨慎)。 - 查:
SELECT 列 FROM 表 WHERE 条件;(支持联表、分组、排序等复杂查询)。
(注:题目中help insert应为笔误,实际无此语法,增删改查核心是 INSERT、DELETE、UPDATE、SELECT。)
insert update delete help insert



浙公网安备 33010602011771号