2015-12-17 81 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