首頁 > 軟體

淺析Mysql和Oracle分頁的區別

2022-12-09 14:04:05

MySQL使用limit進行分頁

select * from stu limit m,n; // m=(pageIndex-1)*pageSize,n=pageSize
-- 返回總條,查詢表新增欄位sql_calc_found_rows
select sql_calc_found_rows a.* from AAA a limit m,n
-- found_rows單獨查詢總條數
select found_rows total;
  • 第一個引數m表示起始行,第二個參數列示取多少行;
  • pageIndex表示頁索引,即查詢第幾頁的資料(從1開始),pageSize表示頁大小,即一頁最多顯示多少行記錄;
  • m= (2-1)*10+1=11,n=10,limit 11,10,表示從第11行開始取記錄行(包含第11行),共取10行,也表示查詢第2頁的資料,這一頁最多顯示10行記錄。

Oracle使用rownum進行分頁

select * from(
  select rownum rn,a.*,count(*) over() total from table_name a where rownum <= x 
  -- 結束行,x=pageIndex*pageSize
)
where rn >= y; -- 起始行,y=(pageIndex-1)*pageSize+1
-- 返回總條數
select count(*) over() total from AAA
  • >= y,<= x表示從第y行(起始行)~x行(結束行) 。
  • rownum只能比較小於,不能比較大於,因為rownum是先查詢後排序的,例如你的條件為rownum>1,當查詢到第一條資料,rownum為1,則不符合條件。第2、3…類似,一直不符合條件,所以一直沒有返回結果。所以查詢的時候需要設定別名,然後查詢完成之後再通過呼叫別名進行大於的判斷。

Mysql與Oracle級聯查詢

  1. start with: 指定起始節點的條件
  2. connect by: 指定父子行的條件關係
  3. prior: 查詢父行的限定符,格式: prior column1 = column2 or column1 = prior column2 and ...
  4. nocycle: 若資料表中存在迴圈行,那麼不新增此關鍵字會報錯,新增關鍵字後,便不會報錯,但迴圈的兩行只會顯示其中的第一條
  5. 迴圈行: 該行只有一個子行,而且子行又是該行的祖先行
  6. connect_by_iscycle: 前置條件:在使用了nocycle之後才能使用此關鍵字,用於表示是否是迴圈行,0表示否,1 表示是
  7. connect_by_isleaf: 是否是葉子節點,0表示否,1 表示是
  8. level: level偽列,表示層級,值越小層級越高,level=1為層級最高節點
-- connect by: 指定父子行的條件關係
-- start with: 指定起始節點的條件
select c.bc_id,c.bc_name from org_busicorp c 
connect by prior c.bc_pid = c.bc_id
start with c.bc_id = '001';

Mysql省市區級聯查詢

-- 二三級查詢
select c1.bc_id,c1.bc_name from org_busicorp c1 where c1.bc_pid = '00'
union
select c2.bc_id,c2.bc_name from org_busicorp c2 
left join org_busicorp c1 on c1.bc_id = c2.bc_pid
where c1.bc_pid = '00'
-- 包含當前id
union
select c3.bc_id,c3.bc_name from org_busicorp c3 where c3.bc_id = '00'

Mysql遞迴函數

SELECT
	ID.LEVEL,
	DATA.* 
FROM
	(
	SELECT
		@ids AS _ids,
		( SELECT @ids := GROUP_CONCAT( id ) FROM 表名 WHERE FIND_IN_SET( 父級 id欄位, @ids ) ) AS cids,
		@l := @l + 1 AS LEVEL 
	FROM
		表名,
		( SELECT @ids := '條件id', @l := 0 ) b 
	WHERE
		@ids IS NOT NULL 
	) ID,
	表名 DATA 
WHERE
	FIND_IN_SET( DATA.id, ID._ids ) 
ORDER BY
	LEVEL,
	id

Mysql與Oracle插入資料存在修改不存在新增

Mysql插入資料存在修改、不存在新增

insert into `subject`(subjectId,subjectName) 
values('7','離散') 
on duplicate key update subjectName='離散數學';

Oracle插入資料存在修改、不存在新增

merge into 目標表 a
using 源表 b
on(a.條件欄位1=b.條件欄位1 and a.條件欄位2=b.條件欄位2 ……)  
when matched then update set a.欄位=b.欄位 --目標表別稱a和源表別稱b都不要省略
when  not matched then insert (a.欄位1,a.欄位2……)values(b.欄位1,b.欄位2……) --目標表別稱a可省略,源表別稱b不可省略

源表b可能是一張表結構不同於a的表,有可能是一張構建相同表結構的臨時表,也有可能是我們自己組起來的資料

merge into student a
using (select '7' as id from dual) s
on (a.id = s.id)
when matched then
  update set a.student_name = '小明二號'
when not matched then
  insert (id, student_name, fk_class) values ('7', '小明', '2')

到此這篇關於淺析Mysql和Oracle分頁的區別的文章就介紹到這了,更多相關Mysql和Oracle分頁內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com