mysql中給查詢結果新增序號列
生成一個欄位(非表中欄位)用以記錄排序 【類比為oracle資料庫中的rownum】
MySQL中一個表(表名:stuscore)
欄位有:id(主鍵)、stuid(學號)、sname(學生姓名)、subject(課程名稱)、score(分數)
列出數學成績排名 (要求顯示欄位:排名,姓名 , 課程名稱, 分數 , 學號)
用於排名的欄位,查詢時此處將其用 pm表示
select (@i:[email protected]+1)pm,s.* from stuscore s,(select @i:=0)t where s.subject='數學'
order by score desc;
思想:事先定義一個變數,通過變數的遞加以及虛擬表的聯查達到生成序列號的目的。
select * from table1,table2 不加任何條件時,是把兩個表的資料笛卡爾積之後顯示,
如上sql中的 t 這張表 其實就是 一條 i=0 的資料
mysql儲存過程中,定義變數有兩種方式:
1、使用set或select直接賦值,變數名以 @開頭
賦值符號:使用set 時可以用 “=“或者“:=” 但是使用select賦值時必須使用“:=”賦值
例如: [email protected]=1;
可以在一個會話的任何地方宣告,作用域是整個會話,稱為會話變數。
mysql總變數不用事先宣告,在用的時候直接用@變數名 使用即可
【先行記錄】
2、以 DECLARE 關鍵字宣告的變數,只能在儲存過程中使用,稱為儲存過程變數,例如:
DECLARE var1 INT DEFAULT 0;
主要用在儲存過程中,或者是給儲存傳引數中
兩者的區別是:
在呼叫儲存過程時,以DECLARE宣告的變數都會被初始化為 NULL。而會話變數(即@開頭的變數)則
不會被再初始化,在一個會話內,只須初始化一次,之後在會話內都是對上一次計算的結果,就相當於在
是這個會話內的全域性變數。
在儲存過程中,使用動態語句,預處理時,動態內容必須賦給一個會話變數。
例:
set @v_sql= sqltext;
PREPARE stmt FROM @v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;