数据库与表操作

最后更新: 2026-01-22 作者: MySQL Team
页面目录

第三章:数据库与表操作


3.1 数据库操作

创建数据库

-- 基本语法
CREATE DATABASE 数据库名;

-- 指定字符集和排序规则
CREATE DATABASE mydb
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;

-- 如果不存在则创建
CREATE DATABASE IF NOT EXISTS mydb;

查看数据库

-- 列出所有数据库
SHOW DATABASES;

-- 查看数据库创建语句
SHOW CREATE DATABASE mydb;

选择数据库

USE mydb;

删除数据库

-- 删除数据库(谨慎操作!)
DROP DATABASE mydb;

-- 如果存在则删除
DROP DATABASE IF EXISTS mydb;

修改数据库

-- 修改数据库字符集和排序规则
ALTER DATABASE mydb
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;

3.2 表操作

创建表

-- 基本语法
CREATE TABLE 表名 (
    字段1  数据类型  [约束]  [COMMENT '注释'],
    字段2  数据类型  [约束]  [COMMENT '注释'],
    ...
    [表级约束]
) ENGINE=存储引擎 DEFAULT CHARSET=utf8mb4 COMMENT='表注释';

约束类型

约束 说明 关键字
主键约束 唯一标识记录 PRIMARY KEY
唯一约束 字段值唯一 UNIQUE
非空约束 字段值不能为空 NOT NULL
默认约束 字段默认值 DEFAULT
外键约束 表间关联关系 FOREIGN KEY
自动增长 数值型字段自增 AUTO_INCREMENT
检查约束 字段值满足条件 CHECK (MySQL 8.0.16+)

完整示例

-- 创建用户表
CREATE TABLE users (
    id          INT AUTO_INCREMENT COMMENT '用户ID',
    username    VARCHAR(50) NOT NULL COMMENT '用户名',
    email       VARCHAR(100) NOT NULL COMMENT '邮箱',
    password    VARCHAR(255) NOT NULL COMMENT '密码',
    phone       VARCHAR(20) DEFAULT NULL COMMENT '手机号',
    age         TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄',
    gender      ENUM('M', 'F', 'Unknown') DEFAULT 'Unknown' COMMENT '性别',
    status      TINYINT DEFAULT 1 COMMENT '状态:0禁用 1启用',
    created_at  DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at  DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    
    PRIMARY KEY (id),
    UNIQUE KEY uk_username (username),
    UNIQUE KEY uk_email (email),
    KEY idx_status (status),
    KEY idx_created (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

复制表

-- 复制表结构(不复制数据)
CREATE TABLE users_copy LIKE users;

-- 复制表结构和数据
CREATE TABLE users_backup AS SELECT * FROM users;

-- 复制部分数据和字段
CREATE TABLE young_users AS 
SELECT id, username, email, age 
FROM users WHERE age < 30;

查看表

-- 查看所有表
SHOW TABLES;

-- 查看表结构
DESC users;
DESCRIBE users;

-- 查看建表语句
SHOW CREATE TABLE users;

-- 查看表状态
SHOW TABLE STATUS FROM mydb;

修改表

-- 添加字段
ALTER TABLE users ADD COLUMN avatar VARCHAR(255) DEFAULT NULL COMMENT '头像URL';
ALTER TABLE users ADD COLUMN (nickname VARCHAR(50), bio TEXT);

-- 添加字段到指定位置
ALTER TABLE users ADD COLUMN introduction TEXT AFTER bio;
ALTER TABLE users ADD COLUMN id_card VARCHAR(18) FIRST;

-- 修改字段
ALTER TABLE users MODIFY COLUMN phone VARCHAR(30);  -- 只修改类型
ALTER TABLE users CHANGE COLUMN phone phone_no VARCHAR(30);  -- 修改名称和类型

-- 删除字段
ALTER TABLE users DROP COLUMN avatar;
ALTER TABLE users DROP COLUMN nickname, DROP COLUMN bio;

-- 添加主键
ALTER TABLE users ADD PRIMARY KEY (id);

-- 添加唯一索引
ALTER TABLE users ADD UNIQUE KEY uk_phone (phone);

-- 添加普通索引
ALTER TABLE users ADD INDEX idx_age (age);

-- 添加外键
ALTER TABLE orders ADD CONSTRAINT fk_user_id 
    FOREIGN KEY (user_id) REFERENCES users(id) 
    ON DELETE CASCADE ON UPDATE CASCADE;

-- 删除外键
ALTER TABLE orders DROP FOREIGN KEY fk_user_id;

-- 修改表名
ALTER TABLE users RENAME TO user_info;
RENAME TABLE users TO user_info, orders TO order_info;

删除表

-- 删除表(谨慎操作!)
DROP TABLE users;

-- 如果存在则删除
DROP TABLE IF EXISTS users;

-- 删除多个表
DROP TABLE users, orders, products;

3.3 索引操作

索引类型

类型 说明 特点
主键索引 PRIMARY KEY 唯一,不允许NULL
唯一索引 UNIQUE 唯一,允许NULL
普通索引 INDEX/KEY 普通索引
全文索引 FULLTEXT 全文搜索
组合索引 INDEX(col1, col2) 多列组合

创建索引

-- 创建表时添加索引
CREATE TABLE products (
    id          INT PRIMARY KEY,
    name        VARCHAR(100),
    price       DECIMAL(10,2),
    description TEXT,
    FULLTEXT KEY ft_name_desc (name, description)  -- 全文索引
);

-- 单独创建索引
CREATE INDEX idx_name ON products(name);
CREATE UNIQUE INDEX uk_name ON products(name);
CREATE FULLTEXT INDEX ft_desc ON products(description);

-- 组合索引
CREATE INDEX idx_price_name ON products(price, name);

查看索引

SHOW INDEX FROM products;

-- 或使用 SHOW CREATE TABLE
SHOW CREATE TABLE products\G

删除索引

DROP INDEX idx_name ON products;
DROP INDEX uk_name ON products;

-- 删除主键索引(需要先删除自增)
ALTER TABLE products MODIFY id INT;
ALTER TABLE products DROP PRIMARY KEY;

3.4 外键约束

外键语法

CREATE TABLE orders (
    order_id    INT AUTO_INCREMENT PRIMARY KEY,
    user_id     INT NOT NULL,
    total_amount DECIMAL(10,2),
    created_at  DATETIME,
    
    CONSTRAINT fk_orders_users
        FOREIGN KEY (user_id) 
        REFERENCES users(id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
);

外键动作

动作 说明
RESTRICT 阻止删除/更新父表记录
CASCADE 级联删除/更新子表记录
SET NULL 将子表外键设为NULL
NO ACTION 拒绝删除/更新(默认)

删除外键

ALTER TABLE orders DROP FOREIGN KEY fk_orders_users;

3.5 存储引擎

MySQL 存储引擎对比

特性 InnoDB MyISAM
事务支持
外键约束
行级锁
全文索引
崩溃恢复
并发性能
存储空间 较大 较小
适用场景 事务、并发 读多写少

选择存储引擎

-- 指定存储引擎
CREATE TABLE innodb_table (...) ENGINE=InnoDB;
CREATE TABLE myisam_table (...) ENGINE=MyISAM;

-- 修改存储引擎
ALTER TABLE myisam_table ENGINE=InnoDB;

3.6 分区表

分区类型

-- RANGE 分区
CREATE TABLE sales (
    id          INT,
    sale_date   DATE,
    amount      DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(sale_date)) (
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION pmax VALUES LESS THAN MAXVALUE
);

-- LIST 分区
CREATE TABLE employees (
    id          INT,
    dept_id     INT,
    name        VARCHAR(50)
)
PARTITION BY LIST (dept_id) (
    PARTITION p_sales VALUES IN (1, 2, 3),
    PARTITION p_tech VALUES IN (4, 5, 6),
    PARTITION p_hr VALUES IN (7, 8)
);

-- HASH 分区
CREATE TABLE orders (
    id          INT,
    amount      DECIMAL(10,2)
)
PARTITION BY HASH(id)
PARTITIONS 4;

-- KEY 分区
CREATE TABLE user_sessions (
    id          INT,
    user_id     INT,
    login_time  DATETIME
)
PARTITION BY KEY(user_id)
PARTITIONS 8;

分区管理

-- 查看分区
SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'sales';

-- 重新组织分区
ALTER TABLE sales REORGANIZE PARTITION pmax INTO (
    PARTITION p2024 VALUES LESS THAN (2025),
    PARTITION p2025 VALUES LESS THAN (2026)
);

-- 删除分区
ALTER TABLE sales DROP PARTITION p2020;

3.7 本章小结

✅ 掌握数据库的创建、查看、删除操作
✅ 熟练使用各种表约束:主键、唯一、非空、外键
✅ 理解并应用各类索引提升查询性能
✅ 了解 InnoDB 和 MyISAM 存储引擎的特点
✅ 学会使用分区表优化大数据表

📖 下章预告:查询详解