查询 oracle_关于oracle和mysql数据库的查询问题
近期在寫mysql數據庫報表時,需要給查詢排序后的數據增加一列序號,用來統計查詢數據的排名,在這里遇到一個視圖和排序沖突的問題。
Part 1
在oracle數據庫中可以直接給查詢語句增加一列ROWNUM, ROWNUM是對結果集加的一個偽列,即先查到結果集之后再加上去的一個列 (強調:先要有結果集)。簡單的說 rownum 是對符合條件結果的序列號,它總是從1開始排起。
比如sql如下
select rownum,t.* from table t;
但是以上sql如果不增加排序,這個數據沒有問題,一旦增加排序,序列號就會錯亂。
select rownum,t.* from table t order by t.stamp
? 第一種解決辦法:增加一個子查詢
select? rownum,a.*? from (select t.* from table t order by t.stamp)? a
? 第二種解決辦法:使用row_number()函數
select row_number() over (order by t.stamp) rn,t.*? from table t
原理:會先對stamp進行排序,排序完后,再給每條數據進行編號。
row_number() over()函數是一個強大的分組排序函數,在使用 row_number() over()函數時候,over()里頭的分組以及排序的執行晚于 where 、group by、? order by 的執行。
Part 2
但在使用mysql數據庫時,這些函數和辦法都無法使用,mysql數據庫給查詢增加一個序列就需要用到參數,最簡單的辦法如以下sql:
SELECT @rownum:=@rownum+1 AS 序號, t.* FROM? table t,(SELECT @rownum:=0) r?
設定一個參數為0,使每行增加1,作為第一列的序列號。
還可以使用以下幾種寫法
① select (@rowNO := @rowNo+1) AS rowno,a.* from (SELECT * FROM t_user) a,(select @rowNO :=0) b ;
②set @rn=0; select @rn:=@rn+1 as rn, m.* from (select * from t_user? )m; -- 連續執行兩個語句
③ select (@rowNO := @rowNo+1) AS 序號,a.* from? t_user a,(select @rowNO :=0) b
注意:@rownum的寫法不唯一,但一定有@,等于號寫法一定是:=(冒號等于)
這種方式的查詢存在的問題是語句中存在參數和子查詢,在需要建立視圖時會出現報錯,mysql不允許視圖語句中有參數和子查詢語句。會出現報錯:
1351 - View's SELECT contains a variable or parameter
在需要排序增加排名并建立查詢視圖的情況下,可以使用以下這種辦法:
SELECT (SELECT COUNT(*)+1 FROM table? b WHERE b.排序字段 > a.排序字段) AS row_num, a.* FROM ?table ?AS a;
上面的sql語句可以達到在mysql數據庫中建立視圖的要求,但由于是通過比對字段大小來達成目的,如果排序字段這一列列數據中存在相同的值則會出現兩個排名相同的行。
總結
以上是生活随笔為你收集整理的查询 oracle_关于oracle和mysql数据库的查询问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像数据流识别圆形_人工智能大赛视觉处理
- 下一篇: mysql linux 客户端_MySQ