MySQL 8.4 SQL 全攻略:所有知识点与实战场景

news2025/2/28 19:18:50

一、引言

MySQL 作为一款广泛使用的开源关系型数据库管理系统,在数据存储和管理领域占据着重要地位。MySQL 8.4 版本在性能、功能和安全性等方面都有了显著的提升。本文将全面介绍 MySQL 8.4 中 SQL 的各种知识点,并结合实战场景进行详细讲解,帮助读者更好地掌握和应用 MySQL。

二、数据库操作

2.1 创建数据库

创建数据库时,可以指定字符集和排序规则以满足不同的需求。

-- 创建名为 mydb 的数据库,指定字符集为 utf8mb4,排序规则为 utf8mb4_unicode_ci
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

实战场景:在开发一个多语言的网站时,需要存储不同语言的文本信息,使用 utf8mb4 字符集可以支持更广泛的字符编码。

2.2 查看数据库

使用 SHOW DATABASES 语句可以查看当前 MySQL 服务器中所有的数据库。

SHOW DATABASES;

2.3 选择数据库

使用 USE 语句选择要操作的数据库。

USE mydb;

2.4 删除数据库

删除数据库会永久删除数据库及其包含的所有数据,操作需谨慎。

DROP DATABASE mydb;

实战场景:当项目不再需要某个数据库时,可以使用该语句删除数据库以释放磁盘空间。

2.5 修改数据库属性

可以使用 ALTER DATABASE 语句修改数据库的字符集和排序规则。

ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

三、表操作

3.1 创建表

创建表时需要定义列名、数据类型和约束条件。

-- 创建名为 users 的表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

实战场景:在开发一个用户管理系统时,使用该表存储用户的基本信息。

3.2 查看表结构

使用 DESCRIBE 或 SHOW COLUMNS FROM 语句查看表的结构。

DESCRIBE users;
-- 或者
SHOW COLUMNS FROM users;

3.3 修改表

可以使用 ALTER TABLE 语句对表进行各种修改操作,如添加列、修改列的数据类型、删除列等。

-- 添加列
ALTER TABLE users ADD COLUMN last_login TIMESTAMP;

-- 修改列的数据类型
ALTER TABLE users MODIFY COLUMN password VARCHAR(512);

-- 删除列
ALTER TABLE users DROP COLUMN last_login;

实战场景:随着业务的发展,需要在用户表中添加一个新的字段来记录用户的最后登录时间,使用 ALTER TABLE 语句可以方便地实现。

3.4 删除表

删除表会删除表及其包含的所有数据,操作需谨慎。

DROP TABLE users;

3.5 重命名表

使用 RENAME TABLE 语句可以重命名表。

RENAME TABLE users TO new_users;

四、数据操作

4.1 插入数据

可以使用 INSERT INTO 语句向表中插入单条或多条数据。

-- 插入单条数据
INSERT INTO users (username, email, password) VALUES ('john_doe', 'john@example.com', 'hashed_password');

-- 插入多条数据
INSERT INTO users (username, email, password) VALUES 
('jane_smith', 'jane@example.com', 'hashed_password2'),
('bob_johnson', 'bob@example.com', 'hashed_password3');

实战场景:在用户注册时,将用户的信息插入到用户表中。

4.2 更新数据

使用 UPDATE 语句更新表中的数据。

UPDATE users SET password = 'new_hashed_password' WHERE username = 'john_doe';

实战场景:当用户修改密码时,使用该语句更新用户表中的密码字段。

4.3 删除数据

使用 DELETE FROM 语句删除表中的数据。

DELETE FROM users WHERE username = 'bob_johnson';

实战场景:当用户注销账户时,使用该语句从用户表中删除该用户的信息。

4.4 查询数据

使用 SELECT 语句查询表中的数据,可以使用 WHERE 子句进行条件过滤,ORDER BY 进行排序,LIMIT 进行分页等。

-- 查询所有用户的信息
SELECT * FROM users;

-- 查询用户名以 'j' 开头的用户信息
SELECT * FROM users WHERE username LIKE 'j%';

-- 查询所有用户信息,按创建时间降序排列
SELECT * FROM users ORDER BY created_at DESC;

-- 查询前 10 条用户信息
SELECT * FROM users LIMIT 10;

实战场景:在用户列表页面,需要显示所有用户的信息,并且可以根据用户输入的关键字进行筛选和排序。

五、条件查询

5.1 比较运算符

使用比较运算符(如 =><>=<=<>)进行条件过滤。

-- 查询年龄大于 20 的用户信息
SELECT * FROM users WHERE age > 20;

5.2 逻辑运算符

使用逻辑运算符(如 ANDORNOT)组合多个条件。

-- 查询年龄大于 20 且性别为男的用户信息
SELECT * FROM users WHERE age > 20 AND gender = 'male';

5.3 范围运算符

使用范围运算符(如 BETWEENIN)进行范围查询。

-- 查询年龄在 20 到 30 之间的用户信息
SELECT * FROM users WHERE age BETWEEN 20 AND 30;

-- 查询用户名是 'john_doe' 或 'jane_smith' 的用户信息
SELECT * FROM users WHERE username IN ('john_doe', 'jane_smith');

5.4 模糊查询运算符

使用模糊查询运算符(如 LIKE)进行模糊查询,% 表示任意多个字符,_ 表示任意单个字符。

-- 查询邮箱以 'example.com' 结尾的用户信息
SELECT * FROM users WHERE email LIKE '%example.com';

六、排序和分页

6.1 排序

使用 ORDER BY 语句对查询结果进行排序,可以按单个列或多个列进行排序,默认是升序(ASC),也可以指定降序(DESC)。

-- 按用户的创建时间降序排列
SELECT * FROM users ORDER BY created_at DESC;

-- 先按年龄升序排列,年龄相同的再按用户名升序排列
SELECT * FROM users ORDER BY age ASC, username ASC;

实战场景:在商品列表页面,需要按商品的价格降序排列,以便用户快速找到价格较高的商品。

6.2 分页

使用 LIMIT 语句进行分页,LIMIT offset, count 中,offset 表示从第几行开始取数据(从 0 开始计数),count 表示取多少行数据。

-- 显示第 2 页(每页显示 10 条记录)的用户信息
SELECT * FROM users LIMIT 10, 10;

实战场景:在新闻列表页面,为了提高页面加载速度,通常会采用分页的方式显示新闻,每次只加载 10 条新闻。

七、聚合函数

7.1 常用聚合函数

  • SUM():计算列的总和。
  • AVG():计算列的平均值。
  • COUNT():计算行数。
  • MAX():获取列的最大值。
  • MIN():获取列的最小值。
-- 计算所有用户的年龄总和
SELECT SUM(age) FROM users;

-- 计算所有用户的平均年龄
SELECT AVG(age) FROM users;

-- 统计用户的数量
SELECT COUNT(*) FROM users;

-- 获取用户的最大年龄
SELECT MAX(age) FROM users;

-- 获取用户的最小年龄
SELECT MIN(age) FROM users;

实战场景:在统计报表中,需要计算某一时间段内的销售总额、平均销售额等数据。

7.2 GROUP BY 子句

使用 GROUP BY 子句将查询结果按指定的列进行分组,通常与聚合函数一起使用。

-- 按性别分组,统计每个性别的用户数量
SELECT gender, COUNT(*) FROM users GROUP BY gender;

7.3 HAVING 子句

使用 HAVING 子句过滤分组后的结果,与 WHERE 子句类似,但 WHERE 用于过滤行,HAVING 用于过滤分组。

-- 按性别分组,统计每个性别的用户数量,只显示用户数量大于 10 的分组
SELECT gender, COUNT(*) FROM users GROUP BY gender HAVING COUNT(*) > 10;

八、连接查询

8.1 内连接(INNER JOIN)

内连接只返回两个表中匹配的记录。

-- 创建订单表
CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    order_amount DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 查询用户及其订单信息
SELECT users.username, orders.order_amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;

实战场景:在电商系统中,需要查询每个用户的订单信息,使用内连接可以将用户表和订单表进行关联。

8.2 左连接(LEFT JOIN)

左连接返回左表中的所有记录,以及右表中匹配的记录。如果右表中没有匹配的记录,对应列的值为 NULL。 

-- 查询所有用户及其订单信息(包括没有订单的用户)
SELECT users.username, orders.order_amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

实战场景:在用户管理系统中,需要查询所有用户的订单信息,包括没有订单的用户,使用左连接可以满足需求。

8.3 右连接(RIGHT JOIN)

右连接返回右表中的所有记录,以及左表中匹配的记录。如果左表中没有匹配的记录,对应列的值为 NULL

-- 查询所有订单及其对应的用户信息(包括没有关联用户的订单)
SELECT users.username, orders.order_amount
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;

8.4 全连接(FULL JOIN)

MySQL 8.4 中没有直接的 FULL JOIN 语法,可以通过 UNION 组合左连接和右连接来实现。

-- 实现全连接
SELECT users.username, orders.order_amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id
UNION
SELECT users.username, orders.order_amount
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;

8.5 自连接

自连接是表与自身进行连接,常用于处理具有层次结构的数据。

-- 假设用户表中有 parent_id 字段表示上级用户
SELECT u1.username AS user, u2.username AS parent_user
FROM users u1
LEFT JOIN users u2 ON u1.parent_id = u2.id;

实战场景:在组织架构管理系统中,需要查询每个员工的上级领导信息,使用自连接可以实现。

九、子查询

9.1 标量子查询

标量子查询返回单个值。

-- 查询年龄大于平均年龄的用户信息
SELECT * FROM users WHERE age > (SELECT AVG(age) FROM users);

9.2 行子查询

行子查询返回一行数据。

-- 查询与指定用户年龄和性别相同的用户信息
SELECT * FROM users WHERE (age, gender) = (SELECT age, gender FROM users WHERE id = 1);

9.3 列子查询

列子查询返回一列数据。

-- 查询所有订单金额大于平均订单金额的订单所属的用户信息
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE order_amount > (SELECT AVG(order_amount) FROM orders));

9.4 表子查询

表子查询返回一个表。

-- 查询每个月的订单数量和总金额
SELECT month, COUNT(*) AS order_count, SUM(order_amount) AS total_amount
FROM (
    SELECT MONTH(order_date) AS month, order_amount
    FROM orders
) subquery
GROUP BY month;

十、事务处理

10.1 事务的特性

事务遵循 ACID 原则,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

10.2 事务控制语句

11.2 创建索引

  • START TRANSACTION:开始一个事务。
  • COMMIT:提交事务,将事务中的所有操作永久保存到数据库。
  • ROLLBACK:回滚事务,撤销事务中的所有操作。
  • SAVEPOINT:在事务中设置保存点。
  • ROLLBACK TO SAVEPOINT:回滚到指定的保存点。
    -- 开始事务
    START TRANSACTION;
    
    -- 设置保存点
    SAVEPOINT sp1;
    
    -- 执行一系列操作
    UPDATE users SET balance = balance - 100 WHERE id = 1;
    UPDATE accounts SET amount = amount + 100 WHERE user_id = 1;
    
    -- 如果出现错误,回滚到保存点
    IF (出现错误条件) THEN
        ROLLBACK TO SAVEPOINT sp1;
    ELSE
        COMMIT;
    END IF;

    实战场景:在银行转账系统中,需要保证转账操作的原子性,使用事务可以确保转账过程中不会出现数据不一致的情况。

    10.3 事务隔离级别

    MySQL 支持四种事务隔离级别,分别是 READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READ(默认)和 SERIALIZABLE。不同的隔离级别在并发性能和数据一致性上有不同的表现。

    -- 设置事务隔离级别为 READ COMMITTED
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

    十一、索引操作

    11.1 索引类型

  • 普通索引:用于提高查询效率。
  • 唯一索引:保证列中的值唯一。
  • 主键索引:是一种特殊的唯一索引,用于唯一标识表中的每一行。
  • 全文索引:用于全文搜索。
    -- 创建普通索引
    CREATE INDEX idx_username ON users (username);
    
    -- 创建唯一索引
    CREATE UNIQUE INDEX idx_email ON users (email);
    
    -- 创建全文索引
    CREATE FULLTEXT INDEX idx_fulltext_content ON articles (content);

    实战场景:在用户表中,经常根据用户名进行查询,为用户名列创建普通索引可以提高查询效率。

    11.3 删除索引

    DROP INDEX idx_username ON users;

    11.4 查看索引

    SHOW INDEX FROM users;

    十二、视图

    12.1 创建视图

    视图是虚拟的表,基于一个或多个表的查询结果。

    -- 创建一个视图,显示用户的用户名和订单总金额
    CREATE VIEW user_order_summary AS
    SELECT users.username, SUM(orders.order_amount) AS total_amount
    FROM users
    LEFT JOIN orders ON users.id = orders.user_id
    GROUP BY users.id;

    实战场景:在数据分析系统中,经常需要查询用户的订单总金额,创建视图可以简化查询操作。

    12.2 查询视图

    可以像查询普通表一样查询视图。

    SELECT * FROM user_order_summary;

    12.3 修改视图

    ALTER VIEW user_order_summary AS
    SELECT users.username, SUM(orders.order_amount) AS total_amount
    FROM users
    INNER JOIN orders ON users.id = orders.user_id
    GROUP BY users.id;

    12.4 删除视图

    DROP VIEW user_order_summary;

    十三、存储过程和函数

    13.1 存储过程

     

    存储过程是一组预编译的 SQL 语句,存储在数据库中,可以通过名称调用。

    -- 创建一个存储过程,用于更新用户的余额
    DELIMITER //
    CREATE PROCEDURE UpdateUserBalance(IN user_id INT, IN amount DECIMAL(10, 2))
    BEGIN
        UPDATE users SET balance = balance + amount WHERE id = user_id;
        SELECT balance FROM users WHERE id = user_id;
    END //
    DELIMITER ;
    
    -- 调用存储过程
    CALL UpdateUserBalance(1, 100);

    实战场景:在金融系统中,经常需要进行账户余额的更新操作,使用存储过程可以提高代码的复用性和安全性。

13.2 函数

函数与存储过程类似,但函数必须有返回值,并且可以在 SQL 语句中像普通函数一样调用。

    -- 创建一个函数,用于计算两个数的和
    DELIMITER //
    CREATE FUNCTION AddNumbers(num1 INT, num2 INT)
    RETURNS INT
    DETERMINISTIC
    BEGIN
        DECLARE result INT;
        SET result = num1 + num2;
        RETURN result;
    END //
    DELIMITER ;
    
    -- 调用函数
    SELECT AddNumbers(5, 3);
    实战场景

    在一个电商系统中,需要根据商品的单价和数量计算商品的总价。可以创建一个函数来实现这个功能。

    -- 创建计算商品总价的函数
    DELIMITER //
    CREATE FUNCTION CalculateTotalPrice(unit_price DECIMAL(10, 2), quantity INT)
    RETURNS DECIMAL(10, 2)
    DETERMINISTIC
    BEGIN
        DECLARE total_price DECIMAL(10, 2);
        SET total_price = unit_price * quantity;
        RETURN total_price;
    END //
    DELIMITER ;
    
    -- 假设存在 products 表,包含 unit_price 和 quantity 列
    SELECT product_id, CalculateTotalPrice(unit_price, quantity) AS total_price
    FROM products;

    13.3 存储过程和函数的管理

    • 查看存储过程和函数:可以使用 SHOW PROCEDURE STATUS 和 SHOW FUNCTION STATUS 语句查看数据库中所有的存储过程和函数。
    SHOW PROCEDURE STATUS WHERE Db = 'your_database_name';
    SHOW FUNCTION STATUS WHERE Db = 'your_database_name';
    • 查看存储过程和函数的定义:使用 SHOW CREATE PROCEDURE 和 SHOW CREATE FUNCTION 语句查看存储过程和函数的具体定义。
      SHOW CREATE PROCEDURE UpdateUserBalance;
      SHOW CREATE FUNCTION AddNumbers;
    • 删除存储过程和函数:使用 DROP PROCEDURE 和 DROP FUNCTION 语句删除存储过程和函数。
      DROP PROCEDURE IF EXISTS UpdateUserBalance;
      DROP FUNCTION IF EXISTS AddNumbers;

      十四、触发器

      14.1 触发器的概念

      触发器是与表相关联的特殊存储过程,当表上发生特定事件(如 INSERTUPDATEDELETE)时自动执行。

      14.2 创建触发器

    -- 创建一个触发器,在插入新用户时记录日志
    DELIMITER //
    CREATE TRIGGER LogNewUserInsert
    AFTER INSERT ON users
    FOR EACH ROW
    BEGIN
        INSERT INTO user_logs (action, user_id, log_time)
        VALUES ('INSERT', NEW.id, NOW());
    END //
    DELIMITER ;
    代码解释
    • AFTER INSERT ON users 表示在 users 表插入新记录后触发。
    • FOR EACH ROW 表示对每一行受影响的记录都执行触发器中的 SQL 语句。
    • NEW 关键字用于引用插入的新记录,这里通过 NEW.id 获取新用户的 ID。

    14.3 触发器的类型

    • BEFORE 触发器:在事件执行之前执行,可用于数据验证和修改。
    -- 创建一个 BEFORE INSERT 触发器,验证用户年龄是否合法
    DELIMITER //
    CREATE TRIGGER ValidateUserAge
    BEFORE INSERT ON users
    FOR EACH ROW
    BEGIN
        IF NEW.age < 0 THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '年龄不能为负数';
        END IF;
    END //
    DELIMITER ;
    • AFTER 触发器:在事件执行之后执行,可用于记录日志、更新关联数据等。前面的 LogNewUserInsert 就是一个 AFTER 触发器的例子。

    14.4 删除触发器

    DROP TRIGGER IF EXISTS LogNewUserInsert;

    实战场景

    在一个库存管理系统中,当有商品出库时,需要自动更新库存数量。可以创建一个触发器来实现这个功能。

    -- 创建商品表和出库记录表
    CREATE TABLE products (
        product_id INT AUTO_INCREMENT PRIMARY KEY,
        product_name VARCHAR(100),
        stock INT
    );
    
    CREATE TABLE product_outbound (
        outbound_id INT AUTO_INCREMENT PRIMARY KEY,
        product_id INT,
        quantity INT,
        outbound_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (product_id) REFERENCES products(product_id)
    );
    
    -- 创建触发器,在商品出库时更新库存数量
    DELIMITER //
    CREATE TRIGGER UpdateStockOnOutbound
    AFTER INSERT ON product_outbound
    FOR EACH ROW
    BEGIN
        UPDATE products
        SET stock = stock - NEW.quantity
        WHERE product_id = NEW.product_id;
    END //
    DELIMITER ;

    十五、窗口函数

    15.1 窗口函数的概念

    窗口函数是对一组行进行计算,并为每行返回一个结果。它不会像聚合函数那样将多行数据合并为一行,而是在每行数据旁边返回计算结果。

    15.2 窗口函数的语法

    function_name(expression) OVER (window_specification)

    其中 function_name 是具体的窗口函数(如 SUMAVGRANK 等),expression 是要计算的表达式,window_specification 定义了窗口的范围和排序规则。

    15.3 常见窗口函数及示例

    • RANK():为每行数据分配一个排名,如果有相同的值,排名会重复,下一个排名会跳过相应的数量。
      -- 假设存在 sales 表,包含 product_id 和 sales_amount 列
      SELECT 
          product_id,
          sales_amount,
          RANK() OVER (ORDER BY sales_amount DESC) AS sales_rank
      FROM 
          sales;
    • DENSE_RANK():与 RANK() 类似,但排名不会跳过,即使有相同的值。
      SELECT 
          product_id,
          sales_amount,
          DENSE_RANK() OVER (ORDER BY sales_amount DESC) AS sales_rank
      FROM 
          sales;
    • ROW_NUMBER():为每行数据分配一个唯一的行号,按照指定的排序规则依次递增。
      SELECT 
          product_id,
          sales_amount,
          ROW_NUMBER() OVER (ORDER BY sales_amount DESC) AS row_num
      FROM 
          sales;
    • SUM() 作为窗口函数:计算窗口内的累计总和。
      SELECT 
          product_id,
          sales_amount,
          SUM(sales_amount) OVER (ORDER BY product_id) AS cumulative_sum
      FROM 
          sales;

      实战场景

      在一个销售数据分析系统中,需要统计每个月的销售排名和累计销售额。

      -- 创建 sales 表
      CREATE TABLE sales (
          sale_id INT AUTO_INCREMENT PRIMARY KEY,
          product_id INT,
          sale_date DATE,
          sale_amount DECIMAL(10, 2)
      );
      
      -- 插入示例数据
      INSERT INTO sales (product_id, sale_date, sale_amount) VALUES
      (1, '2024-01-01', 100),
      (2, '2024-01-02', 200),
      (1, '2024-02-01', 150),
      (2, '2024-02-02', 250);
      
      -- 查询每个月的销售排名和累计销售额
      SELECT 
          sale_date,
          product_id,
          sale_amount,
          RANK() OVER (PARTITION BY MONTH(sale_date) ORDER BY sale_amount DESC) AS monthly_rank,
          SUM(sale_amount) OVER (PARTITION BY MONTH(sale_date) ORDER BY sale_date) AS cumulative_monthly_sales
      FROM 
          sales;

      十六、公用表表达式(CTE)

      16.1 CTE 的概念

       

      公用表表达式是一个临时命名的结果集,它只在当前查询的执行范围内有效。CTE 可以简化复杂查询,提高代码的可读性和可维护性。

      16.2 创建和使用 CTE

      -- 定义一个 CTE,计算每个部门的平均工资
      WITH department_avg_salary AS (
          SELECT 
              department_id,
              AVG(salary) AS avg_salary
          FROM 
              employees
          GROUP BY 
              department_id
      )
      -- 主查询,查询工资高于所在部门平均工资的员工
      SELECT 
          e.employee_id,
          e.department_id,
          e.salary
      FROM 
          employees e
      JOIN 
          department_avg_salary das ON e.department_id = das.department_id
      WHERE 
          e.salary > das.avg_salary;

      实战场景

      在一个人力资源管理系统中,需要查询每个部门中工资最高的员工信息。可以使用 CTE 来实现这个功能。

      -- 创建 employees 表
      CREATE TABLE employees (
          employee_id INT AUTO_INCREMENT PRIMARY KEY,
          department_id INT,
          employee_name VARCHAR(100),
          salary DECIMAL(10, 2)
      );
      
      -- 插入示例数据
      INSERT INTO employees (department_id, employee_name, salary) VALUES
      (1, 'Alice', 5000),
      (1, 'Bob', 6000),
      (2, 'Charlie', 4500),
      (2, 'David', 5500);
      
      -- 使用 CTE 查询每个部门中工资最高的员工信息
      WITH department_max_salary AS (
          SELECT 
              department_id,
              MAX(salary) AS max_salary
          FROM 
              employees
          GROUP BY 
              department_id
      )
      SELECT 
          e.employee_id,
          e.department_id,
          e.employee_name,
          e.salary
      FROM 
          employees e
      JOIN 
          department_max_salary dms ON e.department_id = dms.department_id AND e.salary = dms.max_salary;

      十七、分区表

      17.1 分区表的概念

       

      分区表是将一个大表按照一定的规则(如范围、列表、哈希等)划分为多个小的分区,每个分区可以单独进行管理和维护。分区表可以提高查询性能、方便数据管理和维护。

      17.2 分区类型及示例

    • 范围分区(RANGE):按照列值的范围进行分区。
      -- 创建按订单日期范围分区的订单表
      CREATE TABLE orders (
          order_id INT AUTO_INCREMENT PRIMARY KEY,
          order_date DATE,
          order_amount DECIMAL(10, 2)
      )
      PARTITION BY RANGE (YEAR(order_date)) (
          PARTITION p2023 VALUES LESS THAN (2024),
          PARTITION p2024 VALUES LESS THAN (2025),
          PARTITION p2025 VALUES LESS THAN MAXVALUE
      );

    • 列表分区(LIST):按照列值的列表进行分区
    -- 创建按地区列表分区的用户表
    CREATE TABLE users (
        user_id INT AUTO_INCREMENT PRIMARY KEY,
        user_name VARCHAR(100),
        region VARCHAR(50)
    )
    PARTITION BY LIST COLUMNS (region) (
        PARTITION p_north VALUES IN ('North', 'Northeast'),
        PARTITION p_south VALUES IN ('South', 'Southeast'),
        PARTITION p_west VALUES IN ('West', 'Northwest')
    );
    • 哈希分区(HASH):根据列值的哈希值进行分区。
      -- 创建按用户 ID 哈希分区的用户表
      CREATE TABLE users (
          user_id INT AUTO_INCREMENT PRIMARY KEY,
          user_name VARCHAR(100)
      )
      PARTITION BY HASH(user_id)
      PARTITIONS 4;
    • 键分区(KEY):类似于哈希分区,但使用 MySQL 内部的哈希函数。
      -- 创建按用户 ID 键分区的用户表
      CREATE TABLE users (
          user_id INT AUTO_INCREMENT PRIMARY KEY,
          user_name VARCHAR(100)
      )
      PARTITION BY KEY(user_id)
      PARTITIONS 4;

      实战场景

      在一个电商系统中,订单表的数据量非常大。为了提高查询性能,可以按订单日期进行范围分区。

      -- 创建按订单日期范围分区的订单表
      CREATE TABLE orders (
          order_id INT AUTO_INCREMENT PRIMARY KEY,
          order_date DATE,
          order_amount DECIMAL(10, 2)
      )
      PARTITION BY RANGE (YEAR(order_date)) (
          PARTITION p2023 VALUES LESS THAN (2024),
          PARTITION p2024 VALUES LESS THAN (2025),
          PARTITION p2025 VALUES LESS THAN MAXVALUE
      );
      
      -- 插入示例数据
      INSERT INTO orders (order_date, order_amount) VALUES
      ('2023-01-01', 100),
      ('2024-02-02', 200),
      ('2025-03-03', 300);
      
      -- 查询 2024 年的订单信息,MySQL 会只在 p2024 分区中查找
      SELECT * FROM orders WHERE YEAR(order_date) = 2024;

      十八、总结

      MySQL 8.4 提供了丰富的 SQL 功能,涵盖了数据库操作、表操作、数据操作、查询优化、事务处理等多个方面。通过合理运用这些功能,可以构建高效、稳定、安全的数据库应用系统。在实际项目中,需要根据具体的业务需求选择合适的 SQL 语句和数据库特性,同时要注意数据的安全性和性能优化。希望本文能够帮助读者全面掌握 MySQL 8.4 的 SQL 知识,并在实际工作中灵活运用。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307522.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    Redis源码剖析之GEO——Redis是如何高效检索地理位置的?

    Redis GEO 用做存储地理位置信息&#xff0c;并对存储的信息进行操作。通过geo相关的命令&#xff0c;可以很容易在redis中存储和使用经纬度坐标信息。Redis中提供的Geo命令有如下几个&#xff1a; geoadd&#xff1a;添加经纬度坐标和对应地理位置名称。geopos&#xff1a;获取…

    【Java 优选算法】模拟

    欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 模拟算法的思路比较简单,根据题目描述列出流程,找出规律,将流程转化为代码 替换所有的问号 题目链接 解法 直接根据题目给出条件模拟 示例,找出规律 1.先找出字符?,再…

    @RequiredArgsConstructor 和 @Autowired区别

    1、注入方式 RequiredArgsContructor&#xff1a;通过构造函数的方式实现依赖注入。该注解会被final修饰&#xff0c;并将依赖对象通过构造参数进行注入。 Autowired&#xff1a;通过属性注入的方式实现依赖注入&#xff0c;将依赖对象自动注入到被该注解的字段上 2、使用场景…

    【Linux网络】数据链路层 其他常见的协议

    目录 1. 认识以太网 2. 以太网帧格式 3. MTU 4. ARP协议 4.1 ARP数据报的格式 4.2 ARP攻击 5. 其他重要的协议或技术 5.1 DNS协议 5.2 ICMP协议 5.3 NAT技术 5.4 代理服务器 5.5 内网穿透 总结 针对数据在网络传输中所遇到的问题&#xff0c;网络协议栈都对相应的…

    Ubuntu 安装 Nginx并配置反向代理

    Ubuntu版本&#xff1a;Ubuntu 24.04.2 LTS 一、安装Nginx ​更新系统软件包​ 安装前需确保系统处于最新状态&#xff0c;避免依赖冲突 sudo apt update && sudo apt upgrade -y ​安装Nginx主程序​ Ubuntu官方仓库已包含稳定版Nginx&#xff0c;直接安装即可 sudo…

    赋能农业数字化转型 雏森科技助力“聚农拼”平台建设

    赋能农业数字化转型&#xff0c;雏森科技助力“聚农拼”平台建设 在数字化浪潮席卷各行业的今天&#xff0c;农业领域也在积极探索转型升级之路。中农集团一直以“根植大地&#xff0c;服务三农”为核心&#xff0c;以“乡村振兴&#xff0c;农民增收”为目标&#xff0c;及时…

    1. HTTP 数据请求

    相关资源&#xff1a; 图片素材&#x1f4ce;图片素材.zip 接口文档 1. HTTP 数据请求 什么是HTTP数据请求&#xff1a; (鸿蒙)应用软件可以通过(鸿蒙)系统内置的 http 模块 和 Axios&#xff0c;通过 HTTP 协议和服务器进行通讯 学习核心Http请求技术: Http模块 - 属于鸿…

    VSCode轻松调试运行.Net 8.0 Web API项目

    1.背景 我一直都是用VS来开发.NetCore项目的&#xff0c;用的比较顺手&#xff0c;也习惯了。看其他技术文章有介绍VS Code更轻量&#xff0c;更方便。所以我专门花时间来使用VS Code&#xff0c;看看它是如何调试代码、如何运行.Net 8.0 WebAPI项目。这篇文章是一个记录的过程…

    2024年国赛高教杯数学建模D题反潜航空深弹命中概率问题解题全过程文档及程序

    2024年国赛高教杯数学建模 D题 反潜航空深弹命中概率问题 原题再现 应用深水炸弹&#xff08;简称深弹&#xff09;反潜&#xff0c;曾是二战时期反潜的重要手段&#xff0c;而随着现代军事技术的发展&#xff0c;鱼雷已成为现代反潜作战的主要武器。但是&#xff0c;在海峡或…

    obj离线加载(vue+threejs)+apk方式浏览

    demo需求&#xff1a;移动端&#xff0c;实现obj本地离线浏览 结合需求&#xff0c;利用&#xff08;vue2threejs173&#xff09;进行obj的加载&#xff0c;然后采用apk方式&#xff08;hbuilderX打包发布&#xff09;移动端浏览&#xff1b; https://github.com/bianbian886/…

    关于mysql 表中字段存储JSON对象对JSON对象中的bolean字段进行查询的方式

    业务场景如题 JSON对象为 表为客诉表中的 发现利用原有的xml中的 and a1.order_list ->‘$[*].isZg’ request.isZg 后续发现需要更改为有效 本文作为自己日常工作记录用&#xff0c;有遇到相同问题的可以作为参考。

    Kylin麒麟操作系统 | 系统监控

    以下所使用的环境为&#xff1a; 虚拟化软件&#xff1a;VMware Workstation 17 Pro 麒麟系统版本&#xff1a;Kylin-Server-V10-SP3-2403-Release-20240426-x86_64 一、系统状态查询工具 1. 静态显示系统进程信息ps ps命令会生成一个静态列表&#xff0c;列表中显示的进程其…

    vLLM服务设置开机自启动(Linux)

    要在开机时进入指定的 conda 环境并启动此 vllm 服务&#xff0c;您可以通过以下步骤设置一个 systemd 服务来自动执行脚本。 一、第一步&#xff1a;创建一个启动脚本 1.打开终端并创建启动脚本&#xff0c;例如 /home/username/start_vllm.sh&#xff08;请替换 username 为…

    几个api

    几个api 原型链 可以阅读此文 Function instanceof Object // true Object instanceof Function // true Object.prototype.isPrototypeOf(Function) // true Function.prototype.isPrototypeOf(Object) // true Object.__proto__ Function.prototype // true Function.pro…

    数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

    数字IC后端时钟树综合专题&#xff08;OCC电路案例分享&#xff09; 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC&#xff1f; 片上时钟控制器(On-chip Clock Controllers &#xff0c;OCC)&#xff0c;也称为扫描时钟控制器(Scan Clock Con…

    Trae根据原型设计稿生成微信小程序密码输入框的踩坑记录

    一、需求描述 最近经常使用Trae生成一些小组件和功能代码&#xff08;对Trae赶兴趣的可以看之前的文章《TraeAi上手体验》&#xff09;&#xff0c;刚好在用uniapp开发微信小程序时需要开发一个输入密码的弹框组件&#xff0c;于是想用Trae来实现。原型设计稿如下&#xff1a;…

    华为AP 4050DN-HD的FIT AP模式改为FAT AP,家用FAT基本配置

    在某鱼买了两台华为AP 4050DN-HD , AP是二手的 , 在AC上上过线 , 所以就不能开机自选为FIP模式了 我没有AC无线控制器 , 就是买一个自己玩 , AP又是FIT瘦AP模式 ,所以我就想把AP的瘦AP模式改为FAT胖AP模式 1. 准备工作 1.1下载好对应软件&#xff0c;进入到 企业业务网站去下…

    vue3+ts+uniapp+unibest 微信小程序(第二篇)—— 图文详解自定义背景图页面布局、普通页面布局、分页表单页面布局

    文章目录 简介一、自定义背景图布局1.1 效果预览1.2 实现思路1.3 custom-page 组件全量代码1.4 页面使用 二、普通页面布局2.1 效果预览2.2 实现思路2.3 公共样式部分2.4 页面使用 三、分页表单页面布局3.1 效果预览3.2 实现思路3.3 页面代码 简介 开发工具&#xff1a;VsCode…

    虚拟机缩放比例问题处理

    上班打开虚拟机的样子。 最开始判断可能是vmtools 异常重启安装后发现没有效果 通过 xrandr 功能查询显示器信息获取显示器名 设置显示器 同时设置分辨率 也可以同时设置刷新率 注意下图中设置的关键字

    【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,

    欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…