mysql中變數賦值的順序

2021-08-21 15:07:26 字數 2199 閱讀 2733

今天看高效能mysql中的6.7.9的自定義變數。

其中以一句話讓我有點懵逼,那就是:使用使用者自定義變數的乙個最常見的問題就是沒有注意到在賦值和讀取變數的時候可能是在不同的階段。

之後有乙個對這句話的解釋就是:這些出乎意料的結果可以在explain語句中找到,注意看在extra列中的'using where', 'using temporara'或者'using filesort'。

說實話,反正我是沒據explain中的extra列看懂賦值和讀取變數到底是個什麼順序。

我猜測的順序是先where,再orderby,再select。

我覺得mysql語句選取結果的過程如下:

通過where條件篩選表中的資料行

根據orderby的列進行排序

通過select選取特定的列

主要的應該就三個,那就是select, where, order by。

當在select和where的兩個語句同時進行賦值的時候

set @rownum:=0;

select actor_id, first_name, @rownum:=@rownum+1 as cnt

from actor

where (@rownum:=@rownum+1) < 2

返回的結果為

我覺得肯定是先執行的where語句,因為肯定是先where語句對錶進行篩選(where代表條件),再進行select語句選取結果。如若不是這樣,那麼where語句(條件)有何意義?

即使不是這樣,那也肯定不是select先執行的,因為假如select先執行,那麼這個cnt是由@rownum:=@rownum+1得到的。這個cnt應該是1而不是2的。

所以肯定是where先執行,select後執行。。。

當只對orderby語句進行賦值的時候

set @rownum:=0;

select actor_id, first_name, @rownum as rownum

from actor

where @rownum <= 1

order by first_name,least(0,@rownum:=@rownum+1);

返回的結果為

這種情況下,我還是認為where中的賦值語句是先執行的。

因為肯定是根據where篩選出需要的表,然後經過orderby進行排序。

那麼是不是這樣的呢?

是這樣的。。。

假如不是這樣的,而是由orderby先執行,那麼最後只會返回乙個結果,而不是兩個。

當只對select語句進行賦值的時候

set @rownum:=0;

select actor_id, first_name, @rownum:=@rownum+1 as rownum

from actor

where @rownum <= 1

order by first_name;

這個返回的是全部結果集。

先進行where,再進行orderby,最後再進行select,由於orderby中和@rownum沒關係,所以優化器,就到此結束。

由於@rownum的初始值為0,所以where中的值是true,相當於選取表中的所有資料,然後根據first_name進行排序,再經過select選取。

mysql關聯執行的策略:mysql對任何關聯都執行巢狀迴圈關聯操作,即mysql先在乙個表中迴圈取出單條資料,然後再巢狀迴圈到下乙個表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為止。然後根據各個表匹配的行,返回查詢中需要的各個列。---摘自高效能mysql中6.4.3的mysql如何執行關聯查詢

mysql變數賦值

mysql中變數不用事前申明,在用的時候直接用 變數名 使用就可以了。第一種用法 set num 1 或set num 1 這裡要使用變數來儲存資料,直接使用 num變數 第二種用法 select num 1 或 select num 欄位名 from 表名 where 注意上面兩種賦值符號,使用s...

shell中的變數賦值

shell指令碼中通常要獲取某個值,供指令碼使用,這個值來自於其他的地方,今天我們來說一下,如何獲取和計算。雙引號 阻止shell對大多數特殊字元進行解釋,但 仍保持其特殊含義 echo 把其引數傳遞給標準輸出,也就是顯示器 echo your name is name 輸出name的值,在雙引號中...

makefile中的變數賦值

在makefile中賦值方式有 和 a a b b b all echo a 執行結果 echo a b a b 這種賦值方式是沒有先後順序的,但是這種賦值方式可能會出現問題,例如遞迴定義時 a a a a b b b all echo a 執行結果 echo a a 這種賦值方式有先後順序,只能使...