MySQL 自定義變量的概念及特點(diǎn)
MySQL 的自定義 就是存儲(chǔ)值的臨時(shí)容器,只要與服務(wù)端的連接是活躍的,容器中的值可以保存和使用??梢酝ㄟ^(guò)簡(jiǎn)單的 SET 或 SELECT語(yǔ)句 設(shè)置自定義變量,如下所示:
SET @one := 1; SET @min_actor := (SELECT MIN(actor_id) FROM sakila.actor); SET @last_week := CURRENT_DATE-INTERNAL 1 WEEK;
定義好變量后,就可以在 SQL 語(yǔ)句中使用這個(gè)變量:
SELECT * FROM film WHERE created_date <= @last_week;
雖然 MySQL 自定義變量很強(qiáng)大,但是也需要知道自定義變量本身也是有缺陷的,這些缺陷包括:
- 自定義變量會(huì)禁用查詢緩存。
- 不可以用做替代語(yǔ)義上的標(biāo)識(shí)符,例如表名稱或列名稱,或者是在 LIMIT 子句中使用。
- 自定義變量是基于單次連接的,因此不可以跨連接使用。
- 如果使用連接池或持久連接,自定義變量會(huì)導(dǎo)致你的代碼與交互隔離,這出現(xiàn)的時(shí)候可能是代碼的 bug 或連接池的 bug,但是是可能發(fā)生的。
- 在 MySQL 5.0以前的版本中是大小寫(xiě)敏感的,因此要注意(在 MySQL 5.0以后已經(jīng)不區(qū)分大小寫(xiě)了)。
- 無(wú)法顯示地指定變量類型,而實(shí)際變量的類型依賴于不確定的類型推斷,并且不同的版本會(huì)有差異,最好的方式是在一開(kāi)始定義的時(shí)候指定類型,比如使用0設(shè)定整數(shù)變量,0.0設(shè)定浮點(diǎn)數(shù)變量,''用于字符串。但是如果后面指定了新的值,類型會(huì)跟隨新的值改變,這是因?yàn)?MySQL 的自定義變量的類型是動(dòng)態(tài)的。
- 優(yōu)化器在某些情況下有可能會(huì)將自定義變量?jī)?yōu)化掉,導(dǎo)致無(wú)法按照期望的方式進(jìn)行查詢。
- 賦值的次序,甚至包括賦值的時(shí)間都是不確定的,這取決于優(yōu)化器選擇的查詢計(jì)劃。因此,最終的結(jié)果可能讓人困惑。
- 賦值操作符的優(yōu)先級(jí)低于任何其他操作符,因此必須顯示地使用括號(hào)。
- 未定義變量不會(huì)報(bào)錯(cuò),這很容導(dǎo)致錯(cuò)誤出現(xiàn)。
自定義變量可以用在所有類型的語(yǔ)句中,而不僅僅是 SELECT 語(yǔ)句。事實(shí)上,這是自定義變量的一個(gè)最大的優(yōu)勢(shì)。例如,我們可以重寫(xiě)復(fù)雜的查詢,例如利用子查詢進(jìn)行排序的計(jì)算,或者是完成一次低代價(jià)的UPDATE 語(yǔ)句。
有些時(shí)候,優(yōu)化器會(huì)認(rèn)為這個(gè)變量是編譯時(shí)常量而不進(jìn)行賦值,這會(huì)導(dǎo)致期望的行為很怪異。而將自定義變量的賦值放入類似 LEAST函數(shù)中通常會(huì)避免這個(gè)問(wèn)題。另一個(gè)方式是在使用之前檢查一下自定義變量是否有值。有時(shí)候你想這樣做,但有些時(shí)候你不想這么做。
通過(guò)一些小的實(shí)驗(yàn),我們可以使用自定義變量做很多有趣的事情,例如:
- 計(jì)算總量和平均值;
- 對(duì)于分組查詢模擬 FIRST 和 LAST 函數(shù);
- 對(duì)于很大的數(shù)做數(shù)學(xué)運(yùn)算;
- 將一整張表轉(zhuǎn)換成 MD5哈希值;
- 過(guò)濾掉0值附近但超過(guò)設(shè)定邊界的樣本值;
- 模擬讀寫(xiě)指針位置;
- 將變量嵌入到 WHERE 條件并在 SHOW 語(yǔ)句中顯示。
自定義變量在某些應(yīng)用場(chǎng)合很有用,例如統(tǒng)計(jì)出現(xiàn)次數(shù)的排序值,計(jì)算更新和插入相同數(shù)據(jù)的次數(shù),以及延遲的聯(lián)合查詢,下一篇文章將介紹具體的用法。
以上就是MySQL 的自定義變量的概念及特點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于MySQL 自定義變量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySql?字符集不同導(dǎo)致?left?join?慢查詢的問(wèn)題解決
當(dāng)兩個(gè)表的字符集不一樣,在使用字符型字段進(jìn)行表連接查詢時(shí),就需要特別注意下查詢耗時(shí)是否符合預(yù)期,本文主要介紹了MySql?字符集不同導(dǎo)致?left?join?慢查詢的問(wèn)題解決,感興趣的可以了解一下2024-05-05Windows server 2008 r2上安裝MySQL5.7.10步驟
這篇文章主要介紹了Windows server 2008 r2上安裝MySQL5.7.10的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01忘記mysql數(shù)據(jù)庫(kù)root用戶密碼重置方法[圖文]
忘記mysql數(shù)據(jù)庫(kù)root用戶密碼重置方法,需要的朋友可以參考下。2011-11-11安裝配置mysql及Navicat prenium的詳細(xì)流程
這篇文章主要介紹了安裝配置mysql及Navicat Premium的詳細(xì)流程,配置方法也真的很簡(jiǎn)單,本文給大家詳細(xì)介紹mysql Navicat Premium安裝配置相關(guān)知識(shí)感興趣的朋友,一起學(xué)習(xí)吧2021-06-06InnoDB 類型MySql恢復(fù)表結(jié)構(gòu)與數(shù)據(jù)
MySQL中.frm文件:保存了每個(gè)表的元數(shù)據(jù),包括表結(jié)構(gòu)的定義等,該文件與數(shù)據(jù)庫(kù)引擎無(wú)關(guān)。MySQL中.ibd文件:InnoDB引擎開(kāi)啟了獨(dú)立表空間(my.ini中配置innodb_file_per_table = 1)產(chǎn)生的存放該表的數(shù)據(jù)和索引的文件。2018-01-01MySQL8.x登陸root用戶突然提示mysql_native_password的實(shí)現(xiàn)
本文主要介紹了MySQL 8.x登陸root用戶突然提示mysql_native_password,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08