MySQL基础操作2

image
以下是对该 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,字符集为latin1utf8mb4)。如需显式指定:
    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数据库

总结解决逻辑

  1. 先分清“数据库”和“表”:数据库是容器,表是容器里的结构。
  2. 命令要对应操作:建数据库用CREATE DATABASE,建表用CREATE TABLE
  3. 建表前必须选数据库:通过USE切换上下文,否则表无处安放。

按上述步骤执行,即可成功建表 ✅。
image
在创建前必须使用database
image
image
image
image
image
修改密码
image
image
image
image
这段代码是 Linux 环境下 MySQL 数据库的建表语句,作用是在 wing 数据库中创建名为 t2 的表,以下逐行解析含义:

1. 整体结构

CREATE TABLE wing.t2( ... );
  • CREATE TABLE:MySQL 关键字,用于创建新表
  • wing.t2wing数据库名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 是主键且自增,namesextimepostsalary 为必填字段,其余字段(jobofficedep_id)可选填。
  • 细节:sex 的枚举值 'gril' 可能是拼写错误(应为 'girl'),但语法上不影响执行。
    image
    这条 MySQL INSERT 语句 继续向 wing.t2 表插入 8行数据,结合表结构和数据细节解析如下:

一、整体逻辑

INSERT INTO wing.t2(name,sex,time,post,job,salary,office,dep_id) 
VALUES
  (行1), (行2), ..., (行8);
  • 目标:向 wing 数据库的 t2 表插入数据,指定填充 namesextimepostjobsalaryofficedep_id 列(id 由自增主键自动生成)。

二、逐行数据解析(结合表结构约束)

表结构关键约束回顾:

  • sex:枚举 ('man','gril')(允许 'man''gril',后者拼写可能为笔误,但语法合法)。
  • jobvarchar(100)允许 NULL 或空字符串 '',因无 NOT NULL 约束)。
  • timedate 类型,字符串如 '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.00double(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)

  • jobNULL:表示该字段无值(区别于空字符串),因 job 允许 NULL,合法。

5. 第7行:('trf','gril','20230506','sale','salecc',20000,503,102)

  • time'20230506'(转为 2023-05-06),salary20000(存为 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)

  • jobNULL:同第6行,合法(job 允许 NULL)。

8. 第10行:('alex','man','20230505','sale','',2200,503,102)

  • job''(空字符串):表示字段值为空字符串(长度为0的字符串),与 NULL 不同(NULL 是“无值”,'' 是“有值但为空”)。因 jobvarchar 类型,允许存储空字符串,合法。

三、特殊场景总结

  1. NULL vs 空字符串 ''
    • NULL:字段无值(需表列允许 NULL)。
    • '':字段有值但为空varchar 类型支持,本质是长度为0的字符串)。
  2. 枚举值容忍笔误sex'gril' 虽可能是 'girl' 笔误,但因建表时枚举定义包含它,插入仍合法。
  3. 自增主键:所有行的 id 列无需显式赋值,MySQL 会自动从 1 开始递增分配(如 jackid=1tomid=2,以此类推)。

综上,这8行数据与前2行(jacktom)共同完成 10条记录的批量插入,严格匹配表的列顺序、数据类型和约束规则,特殊值(NULL、空字符串)的处理也符合表结构定义。
image
image
image
image
image
image
单条件查询
多条件查询
关键字 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 |

image
image
image
image
image
image
image
image
image
image

从第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 ,这样会从指定的记录开始返回指定的记录数。
image
image
image
image
image
这条 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 ...

分组过程:

  1. post = 'hr':包含 wingharryGROUP_CONCAT(name) 结果为 wing,harry
  2. post = 'instructor':包含 jacktomrobinalice → 结果为 jack,tom,robin,alice
  3. post = 'sale':包含 trftestdogalex → 结果为 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人。

五、关键语法规则

  1. GROUP BY 与聚合函数的关系

    • 若使用 GROUP BYSELECT 中的列 必须是分组依据列(如 post聚合函数处理的列(如 GROUP_CONCAT(name),否则会触发语法错误(除非数据库开启宽松模式,但不符合标准 SQL)。
  2. GROUP_CONCAT 的长度限制

    • MySQL 中,GROUP_CONCAT 默认有 长度限制(约 1024 字节),若拼接结果过长,需通过 SET GLOBAL group_concat_max_len = 更大值; 调整。

综上,这条查询通过 分组 + 聚合,高效实现了 “按职位归类,合并同类人员姓名” 的需求,结果清晰展示了每个职位对应的员工名单。
image
image
image
正则表达式 ^ $
image
image
image
image
image
image
.外连接
SELECT 字段列表 FROM 表1 LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
左连接/右连接
LEFT JOIN从左表(play_list)返回所有的⾏,即使在右表中(dept_name)中没有匹配的⾏。
与LEFT JOIN相对应的有RIGHT JOIN关键字,会从右表那⾥返回所有的⾏,即使在左表中没有匹配的
⾏。
image
image
image
image
image

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

posted on 2025-07-20 09:47  爱尔奎特‘殷’  阅读(14)  评论(0)    收藏  举报