mysql變量的術(shù)語分類:
創(chuàng)新互聯(lián)主要從事做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)來安,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
1.用戶變量:以"@"開始,形式為"@變量名"
用戶變量跟mysql客戶端是綁定的,設(shè)置的變量,只對(duì)當(dāng)前用戶使用的客戶端生效
2.全局變量:定義時(shí),以如下兩種形式出現(xiàn),set
GLOBAL
變量名
或者
set
@@global.變量名,對(duì)所有客戶端生效。只有具有super權(quán)限才可以設(shè)置全局變量
3.會(huì)話變量:只對(duì)連接的客戶端有效。
4.局部變量:作用范圍在begin到end語句塊之間。在該語句塊里設(shè)置的變量
declare語句專門用于定義局部變量。set語句是設(shè)置不同類型的變量,包括會(huì)話變量和全局變量
通俗理解術(shù)語之間的區(qū)別:
用戶定義的變量就叫用戶變量。這樣理解的話,會(huì)話變量和全局變量都可以是用戶定義的變量。只是他們是對(duì)當(dāng)前客戶端生效還是對(duì)所有客戶端生效的區(qū)別了。所以,用戶變量包括了會(huì)話變量和全局變量
局部變量與用戶變量的區(qū)分在于兩點(diǎn):
1.
用戶變量是以"@"開頭的。局部變量沒有這個(gè)符號(hào)。
2.
定義變量不同。用戶變量使用set語句,局部變量使用declare語句定義
3.
作用范圍。局部變量只在begin-end語句塊之間有效。在begin-end語句塊運(yùn)行完之后,局部變量就消失了。
所以,最后它們之間的層次關(guān)系是:變量包括局部變量和用戶變量。用戶變量包括會(huì)話變量和全局變量。
使用備忘,set
@var
若沒有指定GLOBAL
或SESSION
,那么默認(rèn)將會(huì)定義用戶變量
兩種方式定義用戶變量:
1."=",如
set
@a
=3,@a:=5
2.":="。select常常這樣使用
總結(jié):使用select
和set設(shè)置變量的區(qū)別,set可以使用以上兩種形式設(shè)置變量。而select只能使用":="的形式設(shè)置變量
實(shí)踐積累:用戶變量在mysql客戶端退出后,會(huì)自動(dòng)消失。之后我打開客戶端,使用"select
@a;"
顯示變了的值為null。說明,未定義的變量初始化是null
實(shí)際中的問題
設(shè)置常量對(duì)group_concat()的配置影響:
SET
@@GROUP_CONCAT_MAX_LEN=4
手冊(cè)中提到設(shè)置的語法是這樣的:
SET
[SESSION
|
GLOBAL]
group_concat_max_len
=
val;
以下兩種形式都能達(dá)到達(dá)到同樣的效果,但是有什么區(qū)別?
SET
@@global.GROUP_CONCAT_MAX_LEN=4;
global可以省略,那么就變成了:SET
@@GROUP_CONCAT_MAX_LEN=4;
2011.2.25
之前的理解不怎么準(zhǔn)確?,F(xiàn)在對(duì)加深理解后的地方進(jìn)行總結(jié)。
mysql中變量的層次關(guān)系是:大體包括用戶變量和系統(tǒng)變量。系統(tǒng)變量包括系統(tǒng)會(huì)話變量和系統(tǒng)全局變量。
相互之間的區(qū)別:
因?yàn)橛脩糇兞烤褪怯脩舳x的變量,系統(tǒng)變量就是mysql定義和維護(hù)的變量。所以,用戶變量與系統(tǒng)變量的區(qū)別在于,是誰在管理這些變量。mysql一啟動(dòng)的時(shí)候就會(huì)讀取系統(tǒng)變量(這樣做目的是可以確定mysql的以何種機(jī)制或模式運(yùn)行)。
系統(tǒng)會(huì)話變量與用戶變量都是在當(dāng)前客戶端退出后消失。他們之間的區(qū)別可以這樣理解,雖然常常看到"set
@@varible"的形式去改變系統(tǒng)變量的值,但是并不涉及到定義系統(tǒng)變量。用戶變量是可以自己定義(初始化)。系統(tǒng)變量按照只是在改變值。
局部變量只在begin-end語句塊中定義并有效。執(zhí)行到該語句塊之后就消失了。定義的方式有明顯的特點(diǎn),使用declare語句。
使用系統(tǒng)變量理論上是可以使用兩種形式:
1.
前面帶有符號(hào)"@@"
2.
符號(hào)省略。比如我會(huì)看的如下形式:CURRENT_USER。但是,約定系統(tǒng)變量要使用"@@變量名"的形式,就是在前面加上符號(hào)"@@"
在select 語句中賦值給用戶變量的語法是 @ var_name := value ,這里的var_name 是變量名,value是正檢索的值.
1:變量可以用在以后語句中表達(dá)式可用的任何地方,例如where字句或者insert 語句中。
例如select @id :=cust_id from customers where cust_id='customer name';
delete from orders where cust_id = @id;
2:變量的另一個(gè)用途是保存在一個(gè)auto_increment列的表中 插入新的一行后last_insert_id()的結(jié)果
select @last_id :=Last_INSERT_ID();
LAST_INSERT_ID()返回新的AUTO_INCREMENT列值,通過將其保存在變量中,你可以在之后的語句中多次引用該值。
即使發(fā)起其他的語句創(chuàng)建他們自身的atuo_increment值,從而改變了last_insert_id()返回的值
3:用戶變量擁有單一的值,如果使用返回多行的語句來將值賦給一個(gè)變量,那么只有最后一行的值被賦給了該變量。
4:要將一個(gè)變量顯示地設(shè)為一個(gè)特定值,使用set語句,set語法可以使用:=或者=來進(jìn)行賦值
5:set也可以用來將一個(gè)select的結(jié)果賦給一個(gè)變量.
mysql有臨時(shí)表:create temporary table if not exists {表定義}--關(guān)鍵字”temporary“指示mysql創(chuàng)建會(huì)話級(jí)別的臨時(shí)表。
臨時(shí)表只對(duì)當(dāng)前會(huì)話可見,連接斷開時(shí),自動(dòng)刪除!
你不必?fù)?dān)心所創(chuàng)建的臨時(shí)表的名稱會(huì)和其他會(huì)話建立的臨時(shí)表、或非臨時(shí)表沖突!注意如果你的臨時(shí)表和正常表名稱相同,正常表會(huì)被隱藏——如同全局變量和局部變量那樣
創(chuàng)建臨時(shí)表不會(huì)引發(fā)通常的commit事務(wù)提交
使用臨時(shí)表的諸多限制
引擎類型只能是:memory(heap)、myisam、merge、innodb
不支持mysql cluster
同一個(gè)查詢語句中只能引用一次! 如 SELECT * FROM TP_TABLE , TP_TABLE AS ALIAS_NAME;是錯(cuò)誤的
同一個(gè)用戶存儲(chǔ)函數(shù)中只能引用一次!
show tables 不會(huì)顯示臨時(shí)表
不能使用rename重命名臨時(shí)表。只能使用ALTER TABLE OLD_TP_TABLE_NAME RENAME NEW_TP_TABLE_NAME;
影響使用replication功能
mysql服務(wù)器自動(dòng)使用的內(nèi)部臨時(shí)表
在某些情況下,mysql服務(wù)器會(huì)自動(dòng)創(chuàng)建內(nèi)部臨時(shí)表:該臨時(shí)表可以是只存在于內(nèi)存的memory臨時(shí)表,或者是存儲(chǔ)于硬盤的myisam臨時(shí) 表;而且 初始創(chuàng)建的memory臨時(shí)表由于表的增大 可能會(huì)轉(zhuǎn)變?yōu)閙yisam臨時(shí)表——其轉(zhuǎn)化臨界點(diǎn)由max_heap_table_size 和tmp_table_size系統(tǒng)變量的 較小值 決定的!注意:max_heap_table_size系統(tǒng)變量應(yīng)用于所有的memory引擎的表,不管是用戶臨時(shí)表、正常表、或者內(nèi)部臨時(shí)表。
內(nèi)部臨時(shí)表的創(chuàng)建條件:
group by 和 order by中的列不相同
order by的列不是引用from 表列表中 的第一表
group by的列不是引用from 表列表中 的第一表
使用了sql_small_result選項(xiàng)
含有distinct 的 order by語句
初始創(chuàng)建內(nèi)部myisam臨時(shí)表的條件:
表中存在text、blob列
在group by中的 列 有超過512字節(jié)
在distinct查詢中的 列 有超過512字節(jié)
在union、union all聯(lián)合查詢中,select 列 列表中的 列 有超過512字節(jié)的
如何判斷某個(gè)查詢是否會(huì)產(chǎn)生內(nèi)部臨時(shí)表:使用explain查看執(zhí)行計(jì)劃,檢查extra列看是否使用臨時(shí)表“using temporary”
mysql中各種類型變量的定義以及賦值使用
MySQL中實(shí)現(xiàn)rank排名查詢
# 1、局部變量(即@開頭的變量)
在一個(gè)會(huì)話內(nèi),只須初始化一次,之后在會(huì)話內(nèi)都是對(duì) 上一次計(jì)算的結(jié)果 ,就相當(dāng)于在是這個(gè)會(huì)話內(nèi)的全局變量。
mysql中局部變量不用事前申明,在用的時(shí)候直接用“@變量名”使用就可以了。
# 2、語法
初始值賦值 :
使用
注意:
使用set時(shí)可以用“=”或“:=”,但是使用select時(shí)必須用“:=賦值”
如果直接寫:select @name:=password from user;
如果這個(gè)查詢返回多個(gè)值的話,那@name變量的值就是最后一條記錄的password字段的值 。
題目1:根據(jù)學(xué)生的年年齡進(jìn)行排序,相同年齡的學(xué)生為一組,組內(nèi)編號(hào)依次為1,2,3...
實(shí)現(xiàn):一個(gè)字段內(nèi)部的排序。
MySQL中row_number的實(shí)現(xiàn)
通常,用group by 可以實(shí)現(xiàn)一個(gè)字段的聚合,再結(jié)合order by進(jìn)行排序。但是在一個(gè)字段內(nèi)部不同的'值'再聚合并排序,就不是group by能夠做到的了。
此處可以使用局部變量實(shí)現(xiàn)自增,給字段內(nèi)不同value 使用case...when...進(jìn)行條件判斷后打上標(biāo)簽,也就實(shí)現(xiàn)了排序功能。
使用
具體運(yùn)行過程成:
另一種用戶變量的初始賦值技巧:
得到相同的運(yùn)行結(jié)果
題目2:按各科成績進(jìn)行排序,并顯示排名, Score 重復(fù)時(shí)也繼續(xù)排名
set @i:=0,@j:=null
select sid,cid,@i:=if(@i=@j,@i,@i+1) as stu_rank,@j:=score as stu_score
from sc
order by stu_score desc
方法一:case ...when...
另一種初始賦值形式也可以寫成:
運(yùn)行結(jié)果:
方法二:if(exp1,exp2,exp3)
另一種初始賦值形式也可以寫成:
運(yùn)行結(jié)果:
題目中的要求要簡單些,不需要判斷是否與上一行相等,一直繼續(xù)排序即可。相當(dāng)于根據(jù)成績排名后添加行號(hào)。
運(yùn)行結(jié)果:
create procedure p
@a char(15)
as
begin
insert into @a (name)
values ('zhangsan')
end
String sql="SELECT * FROM `test`.`changetalbe` where HZ= @temp ;";
改為
String sql="SELECT * FROM `test`.`changetalbe` where HZ="+temp;
你原來那句話里temp后面也多一個(gè)空格。連接變量要用+號(hào)的。不能寫在語句內(nèi)部,好像那是C#的語法。