这个SQL中“t”指的是什么?

时间:2012-02-25 07:16:20

标签: mysql sql select count

我的代码写了一个简单的查询(如下所示)。 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;

6 个答案:

答案 0 :(得分:3)

您的同事创建了一个查询(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语句。最后的;是完成变量的赋值。

答案 1 :(得分: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;

答案 2 :(得分:1)

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

答案 3 :(得分:1)

子查询的别名。如果子查询在FROMJOIN子句中显示为tablesource,则它应该有一个别名。

答案 4 :(得分:1)

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

重点是,它只是一个临时名称,在这种情况下并不重要,但它需要使其有效。

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

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

答案 5 :(得分:0)

半冒号是MySql命令的行分隔符。请查看此处的第一个项目符号,了解更多信息:http://dev.mysql.com/doc/refman/5.0/en/entering-queries.html