SELECT语句之间的逗号

时间:2015-12-17 09:59:25

标签: mysql sql database

我有这个问题:

SELECT (@a:=@a+1) AS priority
FROM (SELECT t1.name FROM t1 LIMIT 100) x, (SELECT @a:=0) r

几个问题:

1 - SELECTS之间的逗号是什么?我从来没有见过命令之间的逗号,我不知道它是什么意思 2 - 为什么第二个SELECT有名字? 3 - 为什么括号内的第二个SELECT4 - Performance-wize:是否从t1中选择前100行,然后为它们分配一个数字?这是怎么回事?

2 个答案:

答案 0 :(得分:1)

  1. xr实际上是SELECT语句生成的匿名视图。如果您想象而不是在括号中使用SELECT,您使用select语句定义了一个视图,然后引用该视图,语法就会清晰。
  2. 选择是给定的名称,以便您可以在WHERE条件,联接或要选择的字段列表中引用这些名称。
  3. 这就是语法。你必须有括号。
  4. 是的,它选择前100行。我不确定你的意思"给他们一个号码"。

答案 1 :(得分:1)

它正在执行CROSS JOIN(行的笛卡尔积)但没有明确的语法。以下2个查询在结果中产生相同的结果:

SELECT *
FROM TableA, TableB

SELECT *
FROM TableA
CROSS JOIN TableB

问题中的查询使用2“派生表”。我鼓励你使用显式连接语法CROSS JOIN,从不使用逗号。使用逗号的最大问题是你不知道笛卡尔积是故意的还是偶然的。

两个“派生表”都被赋予了别名 - 这是一件好事。你怎么会引用第一个或第二个“派生表”的某些项目?例如想象一下,他们都是具有列ID的查询,然后您就可以引用x.ID或r.ID

关于整体查询的作用。首先请注意,第二个查询只是一行(1行)。因此,即使语法产生CROSS JOIN,它也不会扩展总行数,因为100 * 1 = 100.实际上,子查询“r”在每一行上添加一个“占位符”@a(最初为零值)。一旦@a属于每一行,那么你可以为每行增加1的值,结果你得到该列产生一个行号。