【MySQL】表和列、增删改查语句及数据类型约束详解

一、数据库、表和列的基本概念

1.1 数据库的概念与用途

数据库是存储在计算机上的有组织的数据集合,核心目的是实现数据的高效存储、管理、访问与更新,其主要用途体现在:

  • 数据存储和管理:可存储结构化(表格)与非结构化(文本、图片、视频)等多种类型的海量数据,实现数据的有序组织;

  • 数据访问:支持查询、过滤、排序等高效操作,让用户快速检索所需数据;

  • 数据共享:允许多个用户同时访问,实现团队间的数据协作与共享;

  • 数据分析和挖掘:提供统计分析、数据挖掘等能力,助力用户从数据中提取价值,为决策提供支撑。

1.2 MySQL的层级关系与使用步骤

MySQL中存在清晰的层级关系:MySQL数据库服务器 → 数据库(DB) → 表 → 列 ,且层级间均为一对多关系,一个服务器可创建多个数据库,一个数据库可包含多张表,一张表由多个列(字段)组成。

使用MySQL的标准步骤为:登录MySQL → 创建数据库 → 切换到指定数据库 → 创建表 → 使用表,所有表的操作都需先确定所属的数据库,这是MySQL操作的基础原则。

二、数据库与表的基础操作

2.1 数据库的创建、查看与删除

(1)创建数据库
复制代码
-- 基础创建
CREATE DATABASE [IF NOT EXISTS] 数据库名;
-- 指定字符集(推荐)
CREATE DATABASE [IF NOT EXISTS] 数据库名 DEFAULT CHARSET utf8;
(2)查看数据库
复制代码
-- 查看所有数据库
SHOW DATABASES;
-- 查看指定数据库的创建语句(含字符集等配置)
SHOW CREATE DATABASE 数据库名;
(3)删除数据库
复制代码
-- IF EXISTS避免删除不存在的数据库时报错
DROP DATABASE [IF EXISTS] 数据库名;

2.2 数据库的切换与当前库查看

复制代码
-- 切换到指定数据库(后续表操作均基于此库)
USE 数据库名;
-- 查看当前正在使用的数据库
SELECT database();

2.3 表的创建、修改与删除

(1)表的创建

创建表使用CREATE TABLE语句,需指定表名、列名、数据类型及约束,IF NOT EXISTS可选,用于避免重复创建。核心语法及示例:

复制代码
CREATE TABLE [IF NOT EXISTS] 表名(
  列名1 数据类型 [约束],
  列名2 数据类型 [约束],
  ...
);

-- 学生表创建示例
CREATE TABLE [IF NOT EXISTS]  students(
  id VARCHAR(255) PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  age INT,
  gender VARCHAR(255),
  clazz VARCHAR(255)
);

补充 :可通过LOAD DATA加载本地数据到表中,示例:

复制代码
LOAD DATA local INFILE 'students.txt' INTO TABLE students FIELDS TERMINATED BY ',' ;
(2)表的修改

表的修改通过ALTER TABLE语句实现,支持追加列、修改列属性、重命名列/表、修改字符集、删除列等操作,核心用法:

复制代码
-- 增加列
alter table students add length float;
-- 修改列类型/属性
alter table students modify length int not null;
-- 修改表名
rename table students to student;
-- 修改列名
alter table  student change id sid varchar(255);
-- 修改表的字符集
alter table student character set utf8;
-- 删除列
alter table students drop length;
(3)表的删除
复制代码
-- IF NOT EXISTS避免删除不存在的表时报错
DROP TABLE [IF NOT EXISTS ] students;

三、数据类型和约束

3.1 常见数据类型

MySQL的数据类型丰富,可满足不同业务的数据存储需求,核心分为数值类型、字符串类型、日期时间类型、二进制类型、枚举类型、集合类型六大类,重点常用类型如下:

(1)数值类型

适用于存储数字类数据,包含整数和浮点数,不同类型的存储大小、取值范围不同,需根据业务场景选择:

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 Bytes (-128,127) (0,255) 小整数值
SMALLINT 2 Bytes (-32768,32767) (0,65535) 大整数值
MEDIUMINT 3 Bytes (-8388608,8388607) (0,16777215) 大整数值
INT/INTEGER 4 Bytes (-2147483648,2147483647) (0,4294967295) 常用整数值(ID、年龄等)
BIGINT 8 Bytes (-9223372036854775808,9223372036854775807) (0,18446744073709551615) 极大整数值
FLOAT 4 Bytes (-3.402823466E+38,-1.175494351E-38)、0、(1.175494351E-38,3.402823466351E+38) 0、(1.175494351E-38,3.402823466E+38) 单精度浮点数值
DOUBLE 8 Bytes (-1.7976931348623157E+308,-2.2250738585072014E-308)、0、(2.2250738585072014E-308,1.7976931348623157E+308) 0、(2.2250738585072014E-308,1.7976931348623157E+308) 双精度浮点数值
DECIMAL(M,D) M+2/D+2 依赖M和D的值 依赖M和D的值 高精度小数值(价格、金额等)
(2)字符串类型

适用于存储文本类数据,TEXT系列适用于长文本存储:

类型 大小 用途
CHAR 0-255 bytes 定长字符串(性别、状态等短固定长度数据)
VARCHAR 0-65535 bytes 变长字符串(姓名、邮箱等长度不固定数据)
TINYTEXT 0-255 bytes 短文本字符串
TEXT 0-65535 bytes 长文本数据(备注、详情等)
MEDIUMTEXT 0-16777215 bytes 中等长度文本数据
LONGTEXT 0-4294967295 bytes 极大文本数据
补充:UTF-8编码下一个汉字占3个字节,GBK编码下一个汉字占2个字节,定义字符串长度时需考虑编码规则。
(3)日期和时间类型

适用于存储时间相关数据,不同类型对应不同的时间存储粒度:

类型 大小 范围 格式 用途
DATE 3 bytes 1000-01-01/9999-12-31 YYYY-MM-DD 仅存储日期(生日、创建日期等)
TIME 3 bytes -838:59:59/838:59:59 HH:MM:SS 时间值或持续时间
YEAR 1 byte 1901/2155 YYYY 年份值
DATETIME 8 bytes 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD hh:mm:ss 混合日期和时间值
TIMESTAMP 4 bytes 1970-01-01 00:00:01 UTC/2038-01-19 03:14:07 UTC YYYY-MM-DD hh:mm:ss 时间戳(自动更新时间优选)

3.2 常用约束规则

约束是对表中列数据的强制校验规则,用于保证数据的规范性、完整性和唯一性,核心约束类型及作用如下:

  1. 主键约束(PRIMARY KEY):唯一标识表中的每一行数据,主键列默认非空且唯一,可使用单列或多列组合作为一个主键;

  2. 唯一约束(UNIQUE):保证列中的所有值唯一,允许包含空值,一个表可定义多个唯一约束;

  3. 外键约束(FOREIGN KEY):相同的属性列,定义表与表之间的关联关系,保证引用完整性(如订单表的产品ID关联产品表的产品ID);

  4. 非空约束(NOT NULL):确保列中不包含空值,插入/修改数据时必须为该列赋值;

  5. 默认值约束(DEFAULT):插入新行时,若未指定该列值,则自动使用默认值;

  6. 检查约束(CHECK):确保列中的值满足特定条件(如年龄≥18)。

3.3 特殊属性:AUTO_INCREMENT

这是MySQL特有的属性,仅适用于INT、BIGINT等整型列,通常与主键约束配合使用,实现列值的自动递增,每次插入新行时,该列会自动生成唯一值,无需手动赋值,是创建自增ID的核心属性,示例:

复制代码
CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT
);

3.4 数据类型+约束综合建表示例

复制代码
CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  email VARCHAR(100) UNIQUE,
  password VARCHAR(100) NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  age INT CHECK(age >= 18),
  address TEXT,
  role ENUM('admin', 'user') DEFAULT 'user'
);
枚举类型(ENUM)
  • 语法格式字段名 ENUM('值1', '值2', ..., '值n')
  • 作用:限制该字段只能存储枚举列表中指定的值(多选一),无法插入列表外的任何内容,强制数据规范性。

四、SQL语言基础

4.1 SQL语言简介

SQL的核心功能分为四大类:查询、操纵、定义、控制关系型数据库,对应的语言分类为DQL、DML、DDL、DCL,是MySQL操作的核心语法体系。

4.2 SQL语言四大分类

SQL按功能可分为四大类,各类别的核心作用、关键字及典型操作不同,是掌握SQL的基础框架,具体如下:

分类 核心作用 核心关键字 典型操作
DDL(数据定义语言) 定义/修改/删除数据库对象(表、索引、视图等)的结构 CREATE、ALTER、DROP、RENAME、TRUNCATE 建库、建表、修改表结构、删表
DML(数据操作语言) 增/删/改数据库表中的数据内容(不改变表结构) INSERT、UPDATE、DELETE、MERGE 新增记录、修改数据、删除记录
DCL(数据控制语言) 管理数据库权限、控制事务 GRANT、REVOKE、COMMIT、ROLLBACK 授权、撤销权限、提交/回滚事务
DQL(数据查询语言) 从数据库中查询/检索数据(仅读取,不修改数据) SELECT、FROM、WHERE、GROUP BY、ORDER BY 单表查询、多表查询、数据统计
  • TRUNCATE 操作不可回滚,drop可回滚

4.3 核心SQL语句详解

4.3.1 DQL:数据查询语言(SELECT)

SELECT是最常用的SQL语句,用于从表中检索数据,核心语法为:

复制代码
SELECT column1, column2, ... FROM table_name WHERE condition;
  • column1, column2:指定要查询的列,*代表查询所有列;

  • FROM table_name:指定要查询的表;

  • WHERE condition:指定查询的筛选条件。

基础示例

复制代码
-- 查询学生表中所有男生的记录
select * from student where  sex='男';

高级查询扩展

  1. 模糊查询(LIKE)%代表任意字符,_代表单个字符

    -- 查询班级以"文科"开头的学生
    SELECT * FROM students WHERE clazz LIKE '文科%';

2.范围查询(IN/BETWEEN AND)

复制代码
-- 查询文科一班、二班、三班的学生
select * from students where clazz in ('文科一班','文科二班','文科三班');
-- 查询年龄在22到24之间的学生
select * from students where age BETWEEN 22 AND 24;

3.排序(ORDER BY)ASC升序(默认),DESC降序

复制代码
-- 按年龄降序查询学生
SELECT * FROM students ORDER BY age DESC;

4. 分组(GROUP BY)+ 聚合函数:聚合函数包括COUNT(计数)、SUM(求和)、AVG(平均值)等,用于分组统计

复制代码
-- 按性别分组,统计每组学生数量
SELECT gender, COUNT(*) FROM students GROUP BY gender;

5.分组筛选(HAVING):对GROUP BY的统计结果进行筛选(区别于WHERE:WHERE筛选原始数据,HAVING筛选分组结果)

复制代码
-- 按班级分组,统计学生数大于20的班级
SELECT clazz, COUNT(*) FROM students GROUP BY clazz HAVING COUNT(*) > 20;

6.分页查询(LIMIT/OFFSET):限制查询结果的行数,实现分页

复制代码
-- 查询前10条记录
SELECT * FROM students LIMIT 10;
-- 从第5条开始,查询10条记录(OFFSET为偏移量,从0开始)
SELECT * FROM students LIMIT 10 OFFSET 4;
4.3.2 DML:数据操作语言
(1)INSERT(新增数据)

用于向表中插入新的记录,核心语法:

复制代码
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

注意:列名与值的数量、类型必须一一对应,非空约束的列必须赋值。

(2)UPDATE(修改数据)

用于修改表中已有的记录,核心语法:

复制代码
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE some_column = some_value;

关键注意WHERE some_column = some_value:指定修改数据的筛选条件,仅修改满足条件的记录。条件支持多种写法(如>、<、!=、AND、OR等)

(3)DELETE(删除数据)

用于删除表中的记录,核心语法:

复制代码
DELETE FROM table_name
WHERE some_column = some_value;

关键注意:① 必须加WHERE子句,否则删除表中所有数据;② DELETE是DML操作,删除的数据可通过事务回滚恢复,与TRUNCATE(DDL操作,不可回滚)不同。

4.3.3 DCL:数据控制语言
  1. 权限管理

    -- 授予用户test对users表的查询和插入权限
    GRANT SELECT, INSERT ON users TO 'test'@'localhost';
    -- 撤销test用户的插入权限
    REVOKE INSERT ON users FROM 'test'@'localhost';

2.事务控制

复制代码
-- 开启事务(部分数据库需显式声明)
START TRANSACTION;
-- 设置保存点
SAVEPOINT sp1;
-- 回滚到保存点(仅撤销删除操作,修改操作保留)
ROLLBACK TO sp1;
-- 提交最终修改
COMMIT;
复制代码
相关推荐
不懒不懒5 小时前
【MySQL 实战:从零搭建规范用户表(含完整 SQL 与避坑指南)】
数据库
ID_180079054735 小时前
Python结合淘宝关键词API进行商品价格监控与预警
服务器·数据库·python
数据知道5 小时前
PostgreSQL 故障排查:万字详解如何找出数据库中的死锁
数据库·postgresql
AI_56785 小时前
阿里云OSS成本优化:生命周期规则+分层存储省70%
运维·数据库·人工智能·ai
choke2335 小时前
软件测试任务测试
服务器·数据库·sqlserver
龙山云仓5 小时前
MES系统超融合架构
大数据·数据库·人工智能·sql·机器学习·架构·全文检索
IT邦德5 小时前
OEL9.7 安装 Oracle 26ai RAC
数据库·oracle
jianghua0015 小时前
Django视图与URLs路由详解
数据库·django·sqlite
那我掉的头发算什么6 小时前
【Mybatis】Mybatis-plus使用介绍
服务器·数据库·后端·spring·mybatis