SQL必知必会-读书笔记(十一)

在 MySQL 中,INSERT 语句可以使用 SELECT 子句来插入数据,但并不是所有的 SELECT 选项都可以直接用于 INSERT ... SELECT 语句中。以下是一些常见的 SELECT 选项及其在 INSERT ... SELECT 语句中的适用性:

可以使用的 SELECT 选项

  1. 基本 SELECT 子句

    1
    2
    3
    4
    INSERT INTO target_table (column1, column2, column3)
    SELECT column1, column2, column3
    FROM source_table
    WHERE condition;
  2. JOIN 操作

    1
    2
    3
    4
    5
    INSERT INTO target_table (column1, column2, column3)
    SELECT t1.column1, t1.column2, t2.column3
    FROM table1 t1
    JOIN table2 t2 ON t1.id = t2.id
    WHERE condition;
  3. 聚合函数

    1
    2
    3
    4
    INSERT INTO target_table (column1, column2)
    SELECT MAX(column1), COUNT(column2)
    FROM source_table
    WHERE condition;
  4. 子查询

    1
    2
    3
    4
    INSERT INTO target_table (column1, column2)
    SELECT column1, (SELECT column2 FROM another_table WHERE condition)
    FROM source_table
    WHERE condition;
  5. UNION 操作

    1
    2
    3
    4
    INSERT INTO target_table (column1, column2)
    SELECT column1, column2 FROM table1
    UNION
    SELECT column1, column2 FROM table2;

不可以直接使用的 SELECT 选项

  1. **FOR UPDATELOCK IN SHARE MODE**:
    这些选项用于锁定行,通常在事务中使用,但不能直接用于 INSERT ... SELECT 语句中。

    1
    2
    3
    4
    5
    -- 错误示例
    INSERT INTO target_table (column1, column2)
    SELECT column1, column2
    FROM source_table
    FOR UPDATE;
  2. **INTO OUTFILEINTO DUMPFILE**:
    这些选项用于将查询结果导出到文件,不能用于 INSERT ... SELECT 语句中。

    1
    2
    3
    4
    5
    -- 错误示例
    INSERT INTO target_table (column1, column2)
    SELECT column1, column2
    FROM source_table
    INTO OUTFILE '/path/to/file.csv';
  3. **PROCEDURESQL_CALC_FOUND_ROWS**:
    这些选项有特定用途,不能直接用于 INSERT ... SELECT 语句中。

    1
    2
    3
    4
    5
    -- 错误示例
    INSERT INTO target_table (column1, column2)
    SELECT SQL_CALC_FOUND_ROWS column1, column2
    FROM source_table
    WHERE condition;

总结

  • INSERT ... SELECT 语句可以使用大多数标准的 SELECT 子句,包括 JOIN、聚合函数、子查询和 UNION
  • 不能使用涉及锁定、文件导出或特定过程的 SELECT 选项。