2015-12-17 55 views
2

之间的逗号:我有这个疑问的SELECT语句

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

几个问题:

1 - 什么是逗号SELECTS之间在做什么?我从来没有在命令之间看到逗号,我不知道这是什么意思
2 - 为什么第二个SELECT给出了一个名字?
3 - 为什么在括号内第二个SELECT
4 - Performance-wize:它是否选择t1的前100行,然后为它们分配一个数字?这里发生了什么??

+0

逗号分隔在该(外部)选择中使用的“表格”。第一个是子查询,第二个是子查询。 –

+1

两个“派生表”,一个名为x和一个名为r。你正在做它们之间的交叉连接。 – jarlh

回答

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,结果你得到该列产生一个行号。

+0

谢谢,我无法找到任何信息! – Ted

1
  1. xr是有效地利用SELECT报表产生匿名意见。如果你认为用括号中的SELECT来代替,你使用select语句定义了一个视图,然后引用该视图,那么语法就清晰了。
  2. 这些选项是给定的名称,以便您可以在WHERE条件,连接或要选择的字段列表中引用这些名称。
  3. 这是语法。你必须有括号。
  4. 是的,它选择前100行。我不确定你的意思是“给他们一个数字”。
+0

通过给他们一个数字意味着再次通过所有结果2xO(max(100)) – Ted

+0

是的,我认为@a:= @ a + 1语法是对行进行编号。 – rghome