簡體   English   中英

在 SQL SELECT 語句及其評估中使用變量

[英]Using variables in SQL SELECT statements and its evaluation

SELECT (@row:=@row+1) AS ROW, ID  
FROM table1 ,(SELECT @row := 0) r   
order by ID desc

SQl 如何評價這個? 奇怪的是,SELECT 聲明中的變量似乎幾乎沒有關於這種類型的文獻。

  1. SELECT select怎么能行=0? 我以為 select 不得不 select 整列
  2. 這里的 r 是什么?
  3. SELECT @row:=@row+1 如何知道如何遍歷行?
  4. 我不清楚這里的 ID 是如何設置的。 @row 肯定以某種方式對應於 ROW,但 ID 似乎只是掛在上面
  5. 為什么 FROM 需要的不僅僅是表 1?

對此有非常重要的“文獻”

也可以在 SET 以外的語句中為用戶變量賦值。 (此功能在 MySQL 8.0 中已棄用,並可能在后續版本中刪除。)

換句話說,此代碼將在 MySQL 中的某個時間點停止工作。

做你想做的事情的正確方法是使用row_number()

SELECT ROW_NUMBER() OVER (ORDER BY ID DESC) AS ROW, ID  
FROM table1 
ORDER BY ID DESC;

了解 MySQL SELECT語句中的變量分配的唯一原因是出於對歷史的好奇——或者如果您無法維護尚未遷移到 MySQL 8+ 的系統。

  • (SELECT @row:= 0) r,被翻譯為一個有 1 列(沒有名稱的列)的表,並且您為該表提供了一個別名“r”
  • 你正在 table1 和 r 表之間進行連接,所以如果你執行:
SELECT  *  
FROM table1 ,(SELECT @row := 0) r   
order by ID desc

您將看到 table1 中的所有列以及表中始終為 0 的新列(沒有名稱)

  • 但是,在您的查詢中,您每次都顯示一個變量絞盤,每次計算,而且每次執行時,您都會為變量分配一個新值,它本身就是 + 1 @row:=@row+1
  • 你是按 ID 排序的,所以你是如何顯示最終結果的,如果你改變你的順序,它會發現差異

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM