我的代码写了一个简单的查询(如下所示)。 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;
答案 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)
子查询的别名。如果子查询在FROM
或JOIN
子句中显示为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