MySQL查询区分大小写?Windows不区分/Linux区分,建议统一小写

网站建设 厦门萤点网络科技 2026-04-28 00:17 2 0
开篇:为什么数据分析师要会建库建表 我刚入行时,以为数据分析师只需要会写查询就够了。直到有一天,我接到了一个任务:从零开始搭建一个店铺经营分析库,需要把运营每天导出的Excel订单数据导入数据库,然后做报表。我这才发现,不会建库建表,连数据...

MySQL查询区分大小写?Windows不区分/Linux区分,建议统一小写

开篇:为什么数据分析师要会建库建表

我刚入行时,以为数据分析师只需要会写查询就够了。直到有一天,我接到了一个任务:从零开始搭建一个店铺经营分析库,需要把运营每天导出的Excel订单数据导入数据库,然后做报表。我这才发现,不会建库建表,连数据都放不进去。

很多新人觉得“建库建表是DBA的事”,但在中小电商公司,数据分析师往往要自己动手。即使在大公司,理解库表操作也能帮你更好地理解数据从哪里来、数据怎么组织。这一章教你MySQL中最基础的库表操作:创建、修改、删除数据库和表。学完之后,你可以独立完成电商业务库表的全生命周期管理。

学习前准备:

已完成MySQL服务安装和启动

已安装可视化工具(或)并能连接到本地MySQL

准备一张纸,梳理电商订单表需要哪些字段(订单号、用户ID、金额、时间等)

库表操作的核心语法规则与安全准则

核心语法规则

SQL语句以分号;结尾。

关键字不区分大小写,但习惯上大写(如、DROP)。

数据库名、表名、字段名在不区分大小写,在Linux区分,建议统一用小写+下划线。

字符串值用单引号'包裹。

执行前的必备检查项

确认当前操作的数据库是否正确(USE ;)。

如果是删除操作,先备份或确认是否真的需要删除。

如果是修改表结构,确认不会影响已有数据(如删除列会导致数据丢失)。

电商场景下的操作安全准则

永远不要在删除前不备份。我见过同事直接DROP ,结果把半年的订单数据删了,只能从备份恢复。

生产环境禁止直接删除表或数据库。应该先重命名(),观察一段时间确认无影响再删除。

使用可视化工具时,注意弹窗确认。很多工具执行删除前会提示,不要手快点“是”。

我的踩坑经历:有一次我在生产库上执行DROP TABLE ,结果忘了切换数据库,删成了正式订单表。幸亏有备份,但恢复了2个小时。从那以后,我养成了习惯: *DROP执行删除前先确认数据范围,再。

数据库的创建操作详解

基础语法

sql
CREATE DATABASE [IF NOT EXISTS] 数据库名
[CHARACTER SET 字符集名]
[COLLATE 校对规则名];

IF NOT :如果数据库已存在,不会报错。

SET:指定字符集,电商场景推荐(支持emoji)。

:指定排序规则,推荐。

分步操作

步骤1:打开可视化工具,连接到MySQL。

步骤2:在SQL编辑器中输入以下语句:

sql
CREATE DATABASE IF NOT EXISTS ecommerce_shop
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

步骤3:执行语句(中点击三角形,中点击“运行”)。

预期结果:提示“Query OK, 1 row ”,左侧数据库列表中出现。

步骤4:验证:

sql
SHOW DATABASES;
USE ecommerce_shop;
SELECT DATABASE();

电商场景实操案例:创建店铺专属业务库

假设你有一家女装店铺,需要创建一个名为的数据库,字符集为。

sql
CREATE DATABASE fashion_shop_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

常见报错与解决办法

报错

原因

解决办法

Can't 'xxx' (errno: 13)

权限不足

确保用户有创建数据库的权限(root默认有)

数据库已存在且未用IF NOT

加上IF NOT ,或用DROP 先删除

数据库的修改操作详解

基础语法

sql
ALTER DATABASE 数据库名
[CHARACTER SET 字符集名]
[COLLATE 校对规则名];

注意:MySQL不允许直接重命名数据库(需通过其他方式),但可以修改字符集和校对规则。

分步操作

步骤1:确认当前数据库字符集:

sql
SHOW CREATE DATABASE ecommerce_shop;

步骤2:修改字符集为utf8(不推荐,仅示例):

sql
ALTER DATABASE ecommerce_shop
CHARACTER SET utf8
COLLATE utf8_general_ci;

预期结果:Query OK, 1 row 。

电商场景实操案例

在创建数据库时忘了指定字符集,默认是,导致中文乱码。需要修改为。

sql
ALTER DATABASE fashion_shop_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

常见报错与解决办法

报错

原因

解决办法

'xxx'

数据库不存在

先创建数据库

Can't set

权限不足

使用root账户

数据库的删除操作详解

基础语法

sql
DROP DATABASE [IF EXISTS] 数据库名;

风险控制方案

备份:删除前用或可视化工具导出备份。

确认:执行SHOW ;确认数据库名称无误。

权限:生产环境删除数据库应申请审批。

分步操作

步骤1:查看所有数据库,确认要删除的库名:

sql
SHOW DATABASES;

步骤2:执行删除:

sql
DROP DATABASE IF EXISTS ecommerce_shop;

预期结果:Query OK, 0 rows ,数据库消失。

避坑红线提醒

DROP 不要在生产环境随意。我见过新手把正式库删了,导致公司业务中断。

删除前一定确保有备份。没有备份的删除等于自杀。

建议先重命名再删除: TO (MySQL 8.0不支持,可手动改名),或者创建新库迁移数据。

我的踩坑经历:有一次我写脚本批量删除旧数据库,不小心把变量拼接错了,执行了DROP ,而是正在使用的生产库。幸亏是凌晨,影响较小,但从此我写任何删除语句都先确认。

数据表的创建操作详解

基础语法

sql
CREATE TABLE [IF NOT EXISTS] 表名 (
列名1 数据类型 [约束],
列名2 数据类型 [约束],
...
[表级约束]
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

电商场景表设计规范

主键:每张表必须有主键,推荐自增ID或业务唯一标识。

NOT NULL:尽量设置为NOT NULL,减少空值判断。

默认值:合理设置默认值(如 1)。

注释:每个字段加上,方便团队理解。

分步操作

步骤1:切换到目标数据库:

sql
USE ecommerce_shop;

步骤2:创建订单表:

sql
CREATE TABLE IF NOT EXISTS orders (
order_id VARCHAR(50) PRIMARY KEY COMMENT '订单号',
user_id INT NOT NULL COMMENT '用户ID',
amount DECIMAL(10,2) NOT NULL COMMENT '订单金额',
order_status TINYINT NOT NULL DEFAULT 1 COMMENT '订单状态:1待支付,2已支付,3已取消,4已完成',
create_time DATETIME NOT NULL COMMENT '下单时间',
pay_time DATETIME DEFAULT NULL COMMENT '支付时间',
INDEX idx_user_id (user_id),
INDEX idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单主表';

步骤3:执行,预期结果:Query OK, 0 rows 。

步骤4:查看表结构:

sql
DESC orders;

电商场景实操案例:创建商品表

sql
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
product_name VARCHAR(200) NOT NULL COMMENT '商品名称',
category VARCHAR(50) NOT NULL COMMENT '类目',
price DECIMAL(10,2) NOT NULL COMMENT '价格',
stock INT NOT NULL DEFAULT 0 COMMENT '库存',
status TINYINT NOT NULL DEFAULT 1 COMMENT '1上架,2下架',
INDEX idx_category (category)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

常见报错与解决办法

报错

原因

解决办法

Table 'xxx'

表已存在

用IF NOT 或先DROP

add key

外键引用的表或列不存在

先创建被引用的表

key was too long

索引字段太长(如(255)做索引)

缩短字段长度或使用前缀索引

数据表的修改操作详解

基础语法

sql
-- 添加列
ALTER TABLE 表名 ADD 列名 数据类型 [约束] [FIRST|AFTER 列名];
-- 修改列类型
ALTER TABLE 表名 MODIFY 列名 新数据类型 [约束];
-- 修改列名及类型
ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 [约束];
-- 删除列
ALTER TABLE 表名 DROP COLUMN 列名;
-- 添加索引
ALTER TABLE 表名 ADD INDEX 索引名 (列名);

分步操作

步骤1:给表添加一个字段(用户备注):

sql
ALTER TABLE orders ADD remark VARCHAR(200) DEFAULT NULL COMMENT '用户备注';

步骤2:修改字段类型为TEXT:

sql
ALTER TABLE orders MODIFY remark TEXT COMMENT '用户备注';

步骤3:将字段名改为:

sql
ALTER TABLE orders CHANGE order_status status TINYINT NOT NULL DEFAULT 1 COMMENT '订单状态';

步骤4:删除字段:

sql
ALTER TABLE orders DROP COLUMN remark;

电商场景高频修改场景

新增字段:运营需要记录订单的“配送方式”,加列。

修改字段长度:商品名称从(100)扩充到(200)。

添加索引:发现按查询慢,添加索引。

sql
ALTER TABLE products ADD COLUMN delivery_type TINYINT DEFAULT 1 COMMENT '配送方式:1普通,2顺丰';
ALTER TABLE products MODIFY product_name VARCHAR(200);
ALTER TABLE orders ADD INDEX idx_create_time (create_time);

常见报错与解决办法

报错

原因

解决办法

name

列已存在

先检查列是否存在,或改名

Data too long for

修改长度时现有数据超过新长度

先清理数据或增加长度

drop index 'xxx': in a key

索引被外键依赖

先删除外键,再删除索引

数据表的删除操作详解

基础语法

sql
DROP TABLE [IF EXISTS] 表名;

风险控制方案

删除前先备份( TABLE AS * FROM ;)。

确认表名无误,避免误删。

如果有外键依赖,先删除子表或外键约束。

分步操作

步骤1:查看当前表:

sql
SHOW TABLES;

步骤2:删除临时表:

sql
DROP TABLE IF EXISTS temp_orders;

步骤3:验证:

sql
SHOW TABLES; -- 确认temp_orders已消失

避坑红线提醒

DROP TABLE不要轻易,尤其是生产环境。建议先到_old后缀,确认无影响再删除。

删除主表前先处理外键,否则会报错。

使用可视化工具时,注意选中正确的表。我见过有人鼠标点错,删错了表。

我的踩坑经历:有一次要删除测试表,结果在里点到了表,右键删除,确认弹窗也没细看,直接把正式订单表删了。还好有前一天的备份,损失了当天的数据。 * FROM 表名从此删除表之前,我一定先确认内容。

综合实操案例:电商核心业务库与三张表创建

案例背景

某服饰类目电商店铺需要建立一套核心业务库,包含三张表:订单表、商品表、用户表。要求字符集,引擎。

分步操作

步骤1:创建数据库

sql
CREATE DATABASE IF NOT EXISTS fashion_shop
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE fashion_shop;

步骤2:创建用户表

sql
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
user_name VARCHAR(50) NOT NULL COMMENT '用户名',
register_time DATETIME NOT NULL COMMENT '注册时间',
user_level TINYINT NOT NULL DEFAULT 1 COMMENT '等级:1普通,2银卡,3金卡'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

步骤3:创建商品表

sql
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
product_name VARCHAR(200) NOT NULL COMMENT '商品名称',
category VARCHAR(50) NOT NULL COMMENT '类目',
price DECIMAL(10,2) NOT NULL COMMENT '价格',
stock INT NOT NULL DEFAULT 0 COMMENT '库存'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

步骤4:创建订单表

sql
CREATE TABLE orders (
order_id VARCHAR(50) PRIMARY KEY COMMENT '订单号',
user_id INT NOT NULL COMMENT '用户ID',
product_id INT NOT NULL COMMENT '商品ID',
quantity INT NOT NULL COMMENT '数量',
amount DECIMAL(10,2) NOT NULL COMMENT '金额',
order_status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:1待支付,2已支付,3已取消,4已完成',
create_time DATETIME NOT NULL COMMENT '下单时间',
INDEX idx_user_id (user_id),
INDEX idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

步骤5:修改表结构(模拟业务变更)

运营要求订单表增加字段(收货地址),且订单状态增加“5-退款中”。

sql
ALTER TABLE orders ADD delivery_address VARCHAR(200) DEFAULT NULL COMMENT '收货地址';
ALTER TABLE orders MODIFY order_status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:1待支付,2已支付,3已取消,4已完成,5退款中';

步骤6:验证

sql
SHOW TABLES;
DESC orders;
SELECT * FROM orders; -- 空表,无数据

结果验证

执行SHOW ;应返回三张表。DESC ;应看到新增的字段,且注释已更新。

电商数据合规提示:用户表中不要存储手机号、身份证等敏感信息。如果确实需要,应加密存储,且字段命名不要用phone等明文标识。本案例中用户表只保留基础信息,符合最小必要原则。

本章踩坑清单与合规总结

新手常见踩坑

错误

后果

正确做法

忘记指定字符集

中文乱码

建库时指定

主键字段不是NOT NULL

插入空值导致主键无效

主键字段加NOT NULL

修改列类型导致数据丢失

如转INT

先备份,确认转换规则

删除前不确认

误删生产数据

*确认,或先重命名

不写

别人看不懂字段含义

每个字段加

电商数据合规提示

字段注释必须清晰:不仅方便团队协作,也便于合规审计时说明字段用途。

删除操作记录:在生产环境删除表或数据库,应通过工单系统记录,保留审批日志。

数据加密:如果用户表需要存储手机号,应使用类型和函数加密。

结语

库表操作是SQL的“地基”。掌握、ALTER、DROP,你就能搭建和管理电商业务库表。下一步,我们将向表中插入订单数据,开始真正的数据查询之旅。