我有这个问题:
SELECT (@a:=@a+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
实际上是SELECT
语句生成的匿名视图。如果您想象而不是在括号中使用SELECT,您使用select语句定义了一个视图,然后引用该视图,语法就会清晰。答案 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的值,结果你得到该列产生一个行号。