【问题标题】:What does "t" refer to in this SQL?此 SQL 中的“t”指的是什么?
【发布时间】:2012-03-15 13:46:55
【问题描述】:

我的同事编写的代码(如下所示)中有一个简单的查询。 t 在这里是什么意思?另外; 在查询中的作用是什么?我很确定t 不是任何表,也不是我数据库中任何地方的任何字段。猜猜这个查询是怎么工作的!

string query = @"SELECT COUNT(*) FROM (SELECT AttemptNo FROM attempt_exercise 
                 WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode)t;
                ";

代码如下(如有需要,可提供任何其他信息):

MySqlCommand cmd = new MySqlCommand(query, _conn);
cmd.Parameters.AddWithValue("@uId", uId);
cmd.Parameters.AddWithValue("@eId", eId);
cmd.Parameters.AddWithValue("@mode", mode);
attemptCount = Convert.ToInt32(cmd.ExecuteScalar());
_conn.Close();
return attemptCount;

【问题讨论】:

  • @BenLee 不,当我删除 t 时,我收到错误 Every derived table must have its own alias

标签: mysql sql select count


【解决方案1】:

您的同事创建了一个查询 (SELECT COUNT(*)),其中包含一个名为 t 的子查询。这个t 只是一个临时表名,它引用了

SELECT AttemptNo FROM attempt_exercise 
  WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode

他可以将其命名为temp 更明确一点。这变得像一张表的原因是,在 MySQL 中,SELECT 查询返回的数据行就像一张表。所以,这个内部查询获取AttemptNo,并创建一个临时表t。外部查询然后计算这些数据。

查询中的; 是为了在程序调用string 查询时使它成为一个完整的语句。如果这不包括在内,则字符串 query 将不包含有效的 MySQL 语句。最后的;是完成对变量的赋值。

【讨论】:

  • 查询SELECT AttemptNo FROM attempt_exercise WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode首先是一张表吗?它返回一个值,不是表名吗?
  • @nawfal 它返回组成数据“表”的表行。然后,t 将其命名为别名
  • 哦,我希望您将该信息添加到您的答案中,以便它变得清晰和完美:)
  • 查询中的; 并不总是需要。如果您有 2 个或更多查询/语句,则肯定需要它。它是分隔符(定界符),因此 SQL 解析器知道一个语句在哪里结束以及下一个语句从哪里开始。
  • @simchona - 它更像是一个“内联视图”而不是一个“表格”。
【解决方案2】:

它只是嵌套查询的别名。查询中的分号是语句终止符——它是 ANSI sql 标准的一部分。

【讨论】:

    【解决方案3】:

    t 是您的子查询的别名,您需要它。

    所以你可以这样写:

    SELECT COUNT(*) FROM attempt_exercise 
    WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode;
    

    这将是等效的。

    但如果您尝试将您的子查询加入到其他内容中,您可能会更早地看到需要:

    SELECT COUNT(*) FROM 
       (SELECT AttemptNo FROM attempt_exercise 
        WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode) t
    JOIN AttemptStatisticsTableOfSomeSort a
        ON t.AttemptNo = a.AttemptNo;
    

    【讨论】:

      【解决方案4】:

      子查询的别名。如果子查询在FROMJOIN 子句中显示为表源 - 它应该有一个别名。

      【讨论】:

        【解决方案5】:

        以这种方式创建的所有临时表(即在FROM 子句中)必须有一个可以引用的别名。在这种情况下,别名是t。如果编码人员在他们的写作中更清楚,他们就不会在它之前省略可选的AS

        关键是,它只是一个临时名称,在这种情况下并不重要,但它需要让它工作。

        也就是说,以下可能更有效:

        SELECT COUNT(DISTINCT AttemptNo) FROM attempt_exercise WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode
        

        【讨论】:

        • 不错的答案。谢谢。感谢您为提供更有效的查询所做的努力,但在我的情况下,我不仅需要不同的,还需要所有 AttemptNo :) 不过可以调整,谢谢 :)
        • @kolink:OP 的查询不计入不同的Attemptno。它计算了所有这些。
        【解决方案6】:

        分号是 MySql 命令的行分隔符。请查看此处的第一个要点以获取更多信息:http://dev.mysql.com/doc/refman/5.0/en/entering-queries.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-25
          • 1970-01-01
          • 2012-12-06
          • 2020-01-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多