MySQL ile aşina olanlar bilirler ki LIMIT deyimi ile belirli aralıktaki kayıtlar seçilebilir. Böylece, mesela 51. kayıttan itibaren 5 kayıt listeleme gibi işlemler basit bir şekilde gerçekleştirilebilir. Ancak bu işlemi MSSQL üzerinde yapmak, MySQL’de olduğu gibi basit değildir.
MySQL’den bu kadar bahsettikten sonra MySQL üzerinde LIMIT kullanımı şu komut ile gerçekleştirilebilir:
1 | SELECT * FROM personel LIMIT 51,5 |
Yukarıdaki komut sayesinde 51. kayıttan başlayarak 5 kayıt listelenecektir. Eğer MSSQL’de CURSOR kullanmak zor geliyorsa aşağıdaki yöntemlerle aynı sonuca ulaşılabilir:
ROW_NUMBER() Fonksiyonu ile Gösterilecek Kayıtları Limitleme
ROW_NUMBER() fonksiyonu, OVER (ORDER BY alan) ifadesi ile birlikte kullanılır ve gösterilen her bir kayda sırayla bir numara verir. Bu yöntemi yapmak için, öncelikle sıra numarası verilmiş SELECT sorgusu kullanılır.
1 2 | SELECT *, ROW_NUMBER() OVER (ORDER BY ad) AS sira_numarasi FROM personel |
Elde edilen sonuçlardan yola çıkılarak bir sanal tablo ifade edilirse;
1 2 | (SELECT *,ROW_NUMBER() OVER (ORDER BY ad) AS sira_numarasi FROM personel) AS sanal_tablo |
Ardından, sanki sanal_tablo isminde bir tablo varmış gibi, sıra numarası 51 ve 55 arasında olan kayıtlar BETWEEN ifadesi ile belirtilerek listelenir. (51. kayıttan başlayarak 5 adet kayıt alınacağından dolayı gösterilecek ilk kayıt 51, son kayıt 55 olacaktır. SQL sorgusu, bu nüans göze alınarak yazılmalıdır.)
1 2 3 4 | SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY ad) AS sira_numarasi FROM personel ) AS sanal_tablo WHERE sira_numarasi BETWEEN 51 AND 55 |
EXCEPT İfadesi ile İki Tablonun Farkını Alarak Limitleme
Kümelerde fark işleminin aynısının SQL Server üzerinde uygulanmasıyla 51 ve 55. kayıtlar arasındaki kayıtların listelenmesi mümkündür. Bunun için öncelikle ilk 55 kayıt listelenir, bu kayıtlardan ilk 50 kayıt EXCEPT ifadesi kullanılarak çıkarılır. Geriye 51-55 aralığındaki kayıtlar kalacaktır.
1 2 3 | SELECT TOP 55 * FROM personel EXCEPT SELECT TOP 50 * FROM personel |
OFFSET … FETCH NEXT … ROWS ONLY İfadesi ile Limitleme
MySQL’deki LIMIT kullanımına en benzer örneği en sona sakladım. Burada ORDER BY ifadesi zorunlu bir ifadedir ve sonuçların hangi alana göre sıralanacağı mutlaka belirtilmelidir. OFFSET deyimi ile kaç kaydın atlanacağı, FETCH NEXT … ROWS ONLY ile de ardından gelen kaç adet kaydın listeleneceği ifade edilmektedir. Bu yönüyle de MySQL-LIMIT deyiminden ayrılmaktadır. Dolayısıyla 51. kayıttan başlayarak 5 adet kaydı listelemek için aşağıdaki sorgu kullanılır:
1 2 3 4 | SELECT * FROM personel ORDER BY ad OFFSET 50 ROWS FETCH NEXT 5 ROWS ONLY |
Dikkat edilirse 51. kayıttan başlanması gerektiği halde OFFSET 50 ROWS şeklinde bir kullanım gerçekleştirdik. OFFSET ifadesi, görmezden gelinecek kayıt sayısını ifade ettiğinden ulaşılmak istenen kayıttan önceki kayıt sayısını nitelemek için 50 yazılmıştır.