Post

MySQL Operate

数据库(Database)

库阈值

  • MySQL 8.0 版本之前,一个数据库中最多可以有 65535 个表。因为 采用 16 位 最大值为 2^16 - 1 = 65535
  • MySQL 8.0 开始,采用 32 位整数来存储表的数量,因此最大值变成了 2^32 - 1

数据库规范

  • 命名规范
    • 使用有意义且描述性强的名称,避免使用无意义的缩写或简写。
    • 使用小写字母命名数据库,表和列名,可以提高可移植性和跨平台兼容性。
    • 使用下划线或驼峰命名法作为命名的一种风格,保持一致性
  • 使用字符集
    • 指定数据库的字符集和校对规则,确保支持所需的语言和字符集。
    • 常用的字符集包括 UTF-8 和 UTF-8mb4,它们支持更广泛的字符范围,适用于多语言环境。
  • 选择存储引擎
    • 根据应用需求选择合适的存储引擎,如 InnoDB、MyISAM、Memory 等。
    • InnoDB 是 MySQL 默认的存储引擎,支持事务和外键约束,适合大多数应用。
  • 权限管理
    • 对数据库的访问权限进行细化和管理,根据用户角色分配不同的权限。
    • 避免使用 root 或具有过大权限的账户直接连接数据库。

数据库操作

  1. 远程登录数据库:

    1
    
    mysql -h 127.0.0.1 -P 3306 -u admin -p12345678
    
  2. 查询所有数据库:

    1
    
    SHOW DATABASES;
    
  3. 创建数据库,并设置字符集为 UTF-8:

    1
    
    CREATE DATABASE my_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  4. 查询数据库:

    1
    
    SHOW DATABASES;
    
  5. 选择数据库:

    1
    
    USE my_database;
    
  6. 查询当前数据库:

    1
    
    SELECT DATABASE();
    
  7. 删除数据库

    1
    
    DROP DATABASE my_database;
    
  8. 导出指定数据库(需要包含数据库密码)

    1
    
    mysqldump -h 127.0.0.1 -P 3306 -u admin -p12345678 my_database > backup.sql
    
  9. 导入指定数据库(需要包含数据库密码)

    1
    
    mysql -h 127.0.0.1 -P 3306 -u admin -p12345678 my_database < backup.sql
    
  10. 执行外部 SQL 文件

    1
    2
    
    <!-- login sql server -->
    SOURCE /path/to/your_sql_file.sql;
    

表(Table)

表阈值

  • 5.7 版本以前的 InnoDB 存储引擎中,每个表的行数限制为约 5000 万行
  • 5.7 版本以后的 InnoDB 存储引擎中,每个表的行数限制则提高到了约 2000 亿行
  • 单表超过了 500 万行或者单表超过 2GB 建议分表

表基础操作

  1. 创建表并指定引擎和字符集

    1
    2
    3
    4
    5
    
     CREATE TABLE my_table (
       id INT AUTO_INCREMENT PRIMARY KEY,
       name VARCHAR(50),
       age INT
     ) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT 'this my_table test';
    
  2. 删除表:

    • 完全删除数据库对象,包括数据、结构和元数据信息
    1
    
    DROP TABLE my_table;
    
    • 快速删除表中的所有数据,但保留表的结构和元数据信息
    1
    
    TRUNCATE TABLE my_table;
    
  3. 修改表名:

    1
    
    ALTER TABLE old_table_name RENAME TO new_table_name;
    
  4. 修改表的字符集:

    1
    
    ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  5. 查询所有表:

    1
    
    SHOW TABLES;
    
  6. 查询某个表结构:

    • 查询接单结构
    1
    
    DESCRIBE my_table;
    
    • 查询 sql
    1
    
    SHOW CREATE TABLE my_table;
    
  7. 导出表数据

    1
    
    mysqldump -u your_username -p your_database_name your_table_name > output_file.sql
    

表索引

  1. 创建索引 (CREATE INDEX):创建一个新的索引以加速查询。

    1
    
    CREATE INDEX index_name ON table_name (column_name);
    
  2. 删除索引 (DROP INDEX):删除现有的索引。

    1
    
    DROP INDEX index_name ON table_name;
    
  3. 查看索引 (SHOW INDEX):查看表格的索引信息。

    1
    
    SHOW INDEX FROM table_name;
    
  4. 修改索引 (ALTER TABLE):修改现有的索引,如添加、删除或修改索引字段。

    1
    2
    3
    
    ALTER TABLE table_name ADD INDEX index_name (column_name);
    ALTER TABLE table_name DROP INDEX index_name;
    ALTER TABLE table_name MODIFY COLUMN column_name INT, ADD INDEX index_name (column_name);
    
  5. 重命名索引 (RENAME INDEX):重命名现有的索引。

    1
    
    ALTER TABLE table_name RENAME INDEX old_index_name TO new_index_name;
    
  6. 使用索引提示 (USE INDEX):指定查询使用的索引。

    1
    
    SELECT * FROM table_name USE INDEX (index_name);
    

事务操作

事务(Transaction)是一组数据库操作,被视为一个逻辑单元,要么全部执行成功,要么全部失败回滚,以保持数据的一致性和完整性。

  1. 开始事务 (BEGIN 或 START TRANSACTION):开始一个新的事务。

    1
    2
    3
    
    BEGIN;
    -- 或者
    START TRANSACTION;
    
  2. 提交事务 (COMMIT):将事务中的所有操作永久保存到数据库。

    1
    
    COMMIT;
    
  3. 回滚事务 (ROLLBACK):撤销事务中的所有操作,恢复到事务开始之前的状态。

    1
    
    ROLLBACK;
    
  4. 设置事务隔离级别 (SET TRANSACTION ISOLATION LEVEL):设置当前会话的事务隔离级别。

    1
    
    SET TRANSACTION ISOLATION LEVEL isolation_level;
    
  • 完整例子

    • 简单使用

      1
      2
      3
      4
      5
      6
      7
      
      START TRANSACTION;
      
      INSERT INTO table1 (column1, column2) VALUES (value1, value2);
      UPDATE table2 SET column1 = new_value WHERE condition;
      DELETE FROM table3 WHERE condition;
      
      COMMIT;
      

表视图

什么是视图

视图(View)是数据库中的一种虚拟表格,它是基于一个或多个实际表格的查询结果动态生成的。视图本身并不存储数据,而是根据定义的查询语句在查询时动态生成结果集。

  • 视图可以看作是一个存储在数据库中的预定义查询,它将复杂的查询逻辑封装起来,以简化对数据的访问和操作。通过视图,用户可以以简单的方式访问和操作数据库中的数据,而无需了解复杂的数据库结构或编写复杂的查询语句。

  • 视图的主要优点包括:

    1. 简化查询:通过视图,用户可以使用简单的 SELECT 语句从视图中检索数据,而无需编写复杂的查询语句。

    2. 隐藏复杂性:视图可以隐藏底层表格的复杂性和结构,用户只需关注视图的接口即可。

    3. 安全性:通过视图可以控制用户对数据库中数据的访问权限,可以限制用户只能访问特定的数据子集。

    4. 重用性:视图可以被多个查询和应用程序重复使用,提高了代码的重用性和可维护性。

视图在数据库中广泛应用于各种场景,包括报表生成、数据分析、权限控制等。使用视图可以使数据库更加灵活、易于管理,并提高应用程序的性能和可扩展性。

视图操作

  1. 创建视图 (CREATE VIEW):创建一个新的视图。

    1
    2
    3
    4
    
    CREATE VIEW view_name AS
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition;
    
  2. 查询视图 (SELECT):从视图中检索数据。

    1
    
    SELECT * FROM view_name;
    
  3. 更新视图 (UPDATE):更新视图中的数据。在某些情况下,可以更新视图,但要注意视图的定义必须符合一定的规则。

    1
    2
    3
    
    UPDATE view_name
    SET column1 = value1
    WHERE condition;
    
  4. 删除视图 (DROP VIEW):删除现有的视图。

    1
    
    DROP VIEW view_name;
    
  5. 查看视图定义 (SHOW CREATE VIEW):查看视图的定义。

    1
    
    SHOW CREATE VIEW view_name;
    
  6. 替换视图 (CREATE OR REPLACE VIEW):如果视图已存在,则替换现有的视图。

    1
    2
    3
    4
    
    CREATE OR REPLACE VIEW view_name AS
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition;
    
  7. 视图嵌套 (Nested Views):可以在一个视图中引用另一个视图。

  8. 使用视图权限 (GRANT 和 REVOKE):授予或撤销用户对视图的权限

  9. 完整例子

    假设我们有一个表格 employees 存储员工信息,包含 employee_id、first_name 和 last_name 字段。我们要创建一个视图,显示员工的全名

  • init
1
2
3
4
5
6
7
8
9
10
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50)
);

INSERT INTO employees (employee_id, first_name, last_name)
VALUES (1, 'John', 'Doe'),
      (2, 'Jane', 'Smith'),
      (3, 'Alice', 'Johnson');
  • 然后,我们创建一个视图来显示员工的全名
1
2
3
CREATE VIEW employee_names AS
SELECT employee_id, CONCAT(first_name, ' ', last_name) AS full_name
FROM employees;
  • 现在,我们可以从 employee_names 视图中检索员工的全名:
1
SELECT * FROM employee_names;
  • 结果
1
2
3
4
5
6
7
+-------------+--------------+
| employee_id | full_name    |
+-------------+--------------+
|           1 | John Doe     |
|           2 | Jane Smith   |
|           3 | Alice Johnson|
+-------------+--------------+

表字段操作

  1. 最后面添加字段

    1
    
    ALTER TABLE table_name ADD column_name INT;
    
  2. 最前面添加字段

    1
    
    ALTER TABLE table_name ADD column_name INT FIRST;
    
  3. 某个字段后面添加字段

    1
    
    ALTER TABLE table_name ADD column_name INT AFTER existing_column_name;
    
  4. 删除字段

    1
    
    ALTER TABLE table_name DROP COLUMN column_name;
    
  5. 修改字段名和类型

    1
    
    ALTER TABLE table_name CHANGE old_column_name new_column_name INT;
    
  6. 修改字段类型和位置

    1
    
    ALTER TABLE table_name MODIFY column_name VARCHAR(100) AFTER existing_column_name;
    

字段约束

  1. 主键约束(PRIMARY KEY)

    • 确保字段的唯一性,每个表只能有一个主键,并且主键字段不能为 NULL。
    1
    2
    3
    4
    5
    
    CREATE TABLE users (
        user_id INT PRIMARY KEY,
        username VARCHAR(50) UNIQUE,
        email VARCHAR(100) NOT NULL
    );
    
  2. 唯一约束(UNIQUE)

    • 确保字段的唯一性,但允许字段为 NULL。
    1
    2
    3
    4
    5
    
      CREATE TABLE products (
          product_id INT,
          product_name VARCHAR(100),
          UNIQUE (product_id)
      );
    
  3. 非空约束(NOT NULL)

    • 确保字段不允许为空值。
    1
    2
    3
    4
    5
    
    CREATE TABLE orders (
        order_id INT PRIMARY KEY,
        customer_id INT NOT NULL,
        order_date DATE DEFAULT CURRENT_DATE
    );
    
  4. 默认值约束(DEFAULT)

    • 指定字段的默认值,在插入数据时如果没有指定值,则自动使用默认值。
    1
    2
    3
    4
    5
    6
    
    CREATE TABLE employees (
        employee_id INT PRIMARY KEY,
        first_name VARCHAR(50) NOT NULL,
        last_name VARCHAR(50) NOT NULL,
        hire_date DATE DEFAULT '2024-01-01'
    );
    
  5. 检查约束(CHECK)

    • 对字段的取值进行条件检查,确保满足指定的条件。
    1
    2
    3
    4
    5
    
    CREATE TABLE students (
        student_id INT PRIMARY KEY,
        age INT CHECK (age >= 18),
        grade VARCHAR(2) CHECK (grade IN ('A', 'B', 'C', 'D', 'F'))
    );
    

属性设置

  1. 数据类型 (Data Types):指定字段可以存储的数据类型,如整数、字符、日期等。

  2. NULL / NOT NULL:指定字段是否允许为空值。如果设置为 NOT NULL,则该字段在插入新行时必须有值。

  3. 默认值 (Default):为字段指定默认值,在插入新行时如果未指定该字段的值,则将使用默认值。

  4. 主键 (Primary Key):唯一标识表中的每一行,并确保其唯一性。

  5. 自增 (Auto Increment):当插入新行时,自动为字段生成唯一的递增值。

  6. 唯一键 (Unique Key):确保字段的值在表中是唯一的,但允许字段为 NULL。

  7. 外键 (Foreign Key):建立表格之间的关系,确保参考另一个表中存在的值。

  8. 索引 (Index):为字段创建索引,加快查询速度。

  9. 自定义约束 (Check Constraint):定义字段值必须满足的条件。

  10. 自定义注释 (Comment):为字段添加描述性注释,以便其他人理解字段的用途。

例子

  • 依赖表

    1
    2
    3
    
      CREATE TABLE departments (
          department_id INT AUTO_INCREMENT PRIMARY KEY
      );
    
  • 完整例子

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE employees (
    employee_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'Employee unique identifier',
    first_name VARCHAR(50) NOT NULL COMMENT 'Employee first name',
    last_name VARCHAR(50) NOT NULL COMMENT 'Employee last name',
    email VARCHAR(100) UNIQUE COMMENT 'Employee email address',
    hire_date DATE NOT NULL COMMENT 'Employee hire date',
    salary DECIMAL(10, 2) DEFAULT 0.00 COMMENT 'Employee salary',
    department_id INT COMMENT 'Foreign key referencing department table',
    CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments(department_id),
    INDEX idx_last_name (last_name)
) COMMENT 'Table to store employee information';

在这个例子中:

  • employee_id 是主键,使用 AUTO_INCREMENT 自增,有注释说明。
  • first_namelast_name 是必填字段,有注释说明。
  • email 是唯一字段,有注释说明。
  • hire_date 是必填字段,有注释说明。
  • salary 有默认值,默认为 0.00,有注释说明。
  • department_id 是外键,参考另一个表格中的值,有注释说明。
  • last_name 字段有索引,以提高查询效率。
  • 整个表格有一个注释,说明了该表格的用途。
This post is licensed under CC BY 4.0 by the author.