› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
su2018
V2EX  ›  MySQL

mysql 赋值问题

  •  
  •   su2018 · Sep 27, 2022 · 3053 views
    This topic created in 1465 days ago, the information mentioned may be changed or developed.

    如图所示 图

    上面的 sql 没有赋值成功

    下面的却可以

    4 replies  •  2022-09-29 17:15:33 +08:00
    lookStupiToForce
        1
    lookStupiToForce  
       Sep 27, 2022
    以下仅针对 5.7 之前的版本,之后的版本不确定

    mysql 自定义变量的执行顺序是这样的,飘忽不定(可能按行可能按列,甚至还可能行列交叉赋值),不知道有谁能有确切的文档描述它的执行顺序 /执行规则
    所以在不确定赋值顺序的情况下,在多个列里重复使用自定义变量是个危险的“未定义”行为
    wxf666
        2
    wxf666  
       Sep 27, 2022   ❤️ 1
    1. 确实,本地可构建个类似的语句来复现,不知缘由:

    *( V 站排版原因,开头有全角空格。若要复制运行,记得删除)*

    ```mysql
    WITH
      nums(num) AS (
       VALUES ROW(1), ROW(2), ROW(3)
     )

    SELECT @total, @total := sum(num)
    FROM nums, (SELECT @total := 0) t
    GROUP BY num;
    ```



    2. 如果你只是想要『上一行的数据』,你可以使用*(连 SQLite 都支持的)*窗口函数 `LAG`:

    ```sql
    WITH
      nums(num) AS (
       VALUES ROW(1), ROW(2), ROW(3) -- SQLite 写法:VALUES (1), (2), (3)
     )

    SELECT num, LAG(num) OVER(ORDER BY num)
    FROM nums;
    ```



    3. 另外,[MySQL 官方文档]( https://dev.mysql.com/doc/refman/8.0/en/user-variables.html ) 很不推荐你图片中的用法:

    - 除了 `SET` 语句外,不应在同一条语句内赋值和读取一个用户变量*( 5.7 版本文档:As a general rule, other than in SET statements, you should never assign a value to a user variable and read the value within the same statement )*

    - 涉及用户变量的表达式的求值顺序未定义*( 8.0 版本文档:The order of evaluation for expressions involving user variables is undefined. For example, there is no guarantee that SELECT @a, @a:=@a+1 evaluates @a first and then performs the assignment )*

    - 『在 `SELECT` 中使用 `:=` 为用户变量赋值』已被弃用,未来会移除*( 8.0 版本文档:Previous releases of MySQL made it possible to assign a value to a user variable in statements other than SET. This functionality is supported in MySQL 8.0 for backward compatibility but is subject to removal in a future release of MySQL )*
    su2018
        3
    su2018  
    OP
       Sep 29, 2022
    @lookStupiToForce 确实, 好像不同版本之间不一样, 在我的笔记本的顺序是错的, 在公司的电脑确实正确的 太魔幻了
    su2018
        4
    su2018  
    OP
       Sep 29, 2022
    @wxf666 谢谢啦, 我的 mysql 版本是 5.6 的 还不支持窗口函数 感觉 8.0 的好很多
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2329 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:04 · PVG 18:04 · LAX 03:04 · JFK 06:04
    ♥ Do have faith in what you're doing.