MySQL Örneklerle LİMİT & OFSET
⚡ Akıllı Özet
MKS MySQL LIMIT anahtar kelimesi, bir sorgunun döndüreceği satır sayısını sınırlandırırken, OFFSET değeri sonucun hangi satırdan başlayacağına karar verir. Birlikte, sonuç kümelerini küçük tutar, sayfaların hızlı yüklenmesini sağlar ve kayıt kayıt sayfalama işlemini destekler.

LIMIT anahtar kelimesi nedir? MySQL?
MKS LİMİT `<sup>` anahtar kelimesi, sorgu sonucunda döndürülen satır sayısını sınırlandırır. SELECT, UPDATE ve DELETE ifadeleriyle kullanılabilir, bu nedenle bir sorgunun okuduğu satırları ve bir yazma işleminin etkilediği satırları sınırlandırır.
LIMIT anahtar kelimesinin sözdizimi aşağıdaki gibidir.
SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;
İŞTE
- “SELECT {alan ad(lar)ı | *} TabloAdından(lar)ından” olduğunu SELECT ifadesi sorgumuzda döndürmek istediğimiz alanları içerir.
- “[NEREDE koşulu]” İsteğe bağlıdır, ancak belirtildiğinde sonuç kümesi üzerinde bir filtre belirtir. WHERE yan tümcesi LIMIT'ten önce uygulanır, bu nedenle filtreleme önce gerçekleşir ve sınır, kalanlara uygulanır.
- “SINIR N” anahtar kelimedir ve N N, 0'dan başlayarak herhangi bir sayı olabilir. Sınır olarak 0 koymak hiçbir kayıt döndürmez. 5 gibi bir sayı koymak beş kayıt döndürür. Tabloda N'den daha az kayıt varsa, tüm kayıtlar döndürülür ve hata verilmez.
Sözdizimi kısa, ancak örneklerden önce var olma nedenini belirtmekte fayda var.
LIMIT anahtar kelimesini neden kullanmalıyız?
Diyelim ki biz geliştiriyoruz...ping Myflixdb üzerinde çalışan bir uygulama geliştiriyoruz. Sistem tasarımcıları, yavaş yükleme sürelerini önlemek için bir sayfada görüntülenen kayıt sayısını 20 ile sınırlamamızı istediler. Bu gereksinimi karşılayan bir sistemi nasıl uygulayabiliriz?
LIMIT anahtar kelimesi tam olarak bu durumu ele alıyor. Her üye satırını uygulamaya çekip çoğunu atmak yerine, sorgu sayfa başına 20 kayıt döndürüyor ve veritabanı işi yapıyor. Bunun üç faydası var.
- Daha hızlı yanıt: Diskten okunan veri miktarı ve ağ üzerinden iletilen veri miktarı azalır.
- Daha düşük bellek kullanımı: Uygulama, tablonun tamamını değil, yalnızca bir sayfadaki satırları tutar.
- Safer şöyle yazıyor: bir GÜNCELLEME veya bir SINIR SİL Bu ifade, bir hatanın kaç satırı etkileyebileceğini sınırlandırır.
MySQL LIMIT Sorgu Örnekleri
Aşağıdaki örnekler myflixdb veritabanının members tablosuna karşı çalıştırılmıştır. İlk örnek iki satır döndürür ve başka hiçbir şey döndürmez.
SELECT * FROM members LIMIT 2;
| Üye numarası | tam_ adlar | cinsiyet | doğum_tarihi | kayıt_tarihi | fiziksel adres | posta adresi | iletişim numarası | E-posta | kredi_kartı_numarası |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Kadın | 21-07-1980 | NULL | 4. Sokak Parsel No:XNUMX | Özel Çanta | +0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | Kadın | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
Yukarıdaki sonuçtan da görüldüğü gibi, yalnızca iki üye geri döndü.
Veritabanından on (10) üyeden oluşan bir liste alınıyor
Diyelim ki Myflix veritabanından ilk 10 kayıtlı üyenin listesini istiyoruz. Aşağıdaki kod bu listeyi istiyor.
SELECT * FROM members LIMIT 10;
Komut dosyasını çalıştırmak aşağıdaki sonucu verir.
| Üye numarası | tam_ adlar | cinsiyet | doğum_tarihi | kayıt_tarihi | fiziksel adres | posta adresi | iletişim numarası | E-posta | kredi_kartı_numarası |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Kadın | 21-07-1980 | NULL | 4. Sokak Parsel No:XNUMX | Özel Çanta | +0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | Kadın | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | Erkek | 12-07-1989 | NULL | 3. Sokak 34 | NULL | 12345 | rm@tstreet.com | NULL |
| 4 | Gloria Williams | Kadın | 14-02-1984 | NULL | 2. Sokak 23 | NULL | NULL | NULL | NULL |
| 5 | Leonard Hofstadter | Erkek | NULL | NULL | Ağaç tepesi | NULL | 845738767 | NULL | NULL |
| 6 | Sheldon Cooper | Erkek | NULL | NULL | Ağaç tepesi | NULL | 976736763 | NULL | NULL |
| 7 | Rajesh Koothrappali | Erkek | NULL | NULL | Ağaç tepesi | NULL | 938867763 | NULL | NULL |
| 8 | Leslie Winkle | Erkek | 14-02-1984 | NULL | Ağaç tepesi | NULL | 987636553 | NULL | NULL |
| 9 | Howard Wolowitz | Erkek | 24-08-1981 | NULL | Güney Parkı | PO Box 4563 | 987786553 | lwolowitz[at]email.me | NULL |
LIMIT yan tümcesindeki N değeri tablodaki kayıt sayısından büyük olduğu için yalnızca 9 üye döndürüldü. Açıkça 9 satır istemek de aynı sonuç kümesini üretir.
SELECT * FROM members LIMIT 9;
💡 İpucu: LIMIT, sunucunun ürettiği herhangi bir sıradan satırları seçer. Bir tane ekleyin. TARAFINDAN SİPARİŞ Bu madde, satırların kimliğinin önemli olduğu durumlarda kullanılır; aksi takdirde "ilk 10 üye" ifadesinin aynı dokuz kişiyi iki kez ifade edeceği garanti edilemez.
Satır sayısını sınırlamak özelliğin ilk yarısını oluşturuyor. Pencerenin nereden başlayacağını seçmek ise ikinci yarısını.
LIMIT sorgusunda OFFSET değerinin kullanılması
MKS OFFSET `value` parametresi çoğunlukla `LIMIT` anahtar kelimesiyle birlikte kullanılır. Sunucunun veri almaya hangi satırdan başlayacağını belirtir, böylece o noktadan önceki satırlar atlanır.
Tablonun ortasından başlayarak sınırlı sayıda üye istediğimizi varsayalım. Aşağıdaki kod, ikinci satırdan başlayarak sonucu iki kayıtla sınırlandırır.
SELECT * FROM `members` LIMIT 1, 2;
Bunu şu şekilde uygulamak: MySQL Tezgâh myflixdb'ye karşı yapılan sorgulama aşağıdaki sonucu vermektedir.
| Üye numarası | tam_ adlar | cinsiyet | doğum_tarihi | kayıt_tarihi | fiziksel adres | posta adresi | iletişim numarası | E-posta | kredi_kartı_numarası |
|---|---|---|---|---|---|---|---|---|---|
| 2 | Janet Smith Jones | Kadın | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | Erkek | 12-07-1989 | NULL | 3. Sokak 34 | NULL | 12345 | rm@tstreet.com | NULL |
Şunu da belirtmek gerekir ki, burada OFSET = 1Dolayısıyla 2. satır döndürülen ilk satırdır ve SINIR = 2Bu nedenle sadece 2 kayıt geri döndü.
İki argümanlı biçimde, önce ofset, sonra satır sayısı yazılır; bu da yanlışlıkla tersine çevrilmesine yol açabilir. MySQL Ayrıca belirsizliği ortadan kaldıran açık bir biçimi de kabul eder ve yeni kodlarda tercih edilmesi gereken biçim budur.
SELECT * FROM `members` LIMIT 2 OFFSET 1;
Her iki ifade de aynı iki satırı döndürür. Ofset anlaşıldığında, her listeleme ekranının dayandığı sayfalama düzeni doğrudan ortaya çıkar.
LIMIT ve OFFSET kullanarak sorgu sonuçlarını sayfalara nasıl bölebilirsiniz?
Sayfalama, büyük bir sonuç kümesini numaralandırılmış sayfalara böler ve LIMIT ile OFFSET birlikte bu işlemi gerçekleştiren mekanizmadır. Her sayfa isteğini iki değer yönlendirir: bir ekranda kaç kaydın görüneceğini belirten sayfa boyutu ve kullanıcının talep ettiği sayfa numarası.
Ofset, tek bir formülle bunlardan türetilir.
-- OFFSET = page_size * (page_number - 1) SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 0; -- page 1
Sayfa 2 aynı sınırı korur ve ofseti bir sayfa boyutu kadar ileriye kaydırır.
SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 20; -- page 2
Sayfalandırılmış bir listeyi doğru ve hızlı bir şekilde oluşturmanın üç kuralı vardır.
- Her zaman sırala: ORDER BY kullanılmadan yapılan sayfalandırılmış bir sorgu, aynı kaydı iki farklı sayfada gösterebilir ve diğerini tamamen gizleyebilir, çünkü sunucu çağrılar arasında satır sırasını değiştirmekte serbesttir.
- Benzersiz bir sütuna göre sırala: Sıralama sütunundaki eşitlikler, eşitlik durumundaki satırların sırasını belirsiz bırakır. Birincil anahtara göre sıralama yapmak veya onu eşitlik bozucu olarak eklemek bu sorunu ortadan kaldırır.
- Derinlemesine inceleyin: 100000 kuvvetlik ofset MySQL Yüz bin satırı okuyup attıktan sonra sonraki yirmi satırı döndürmek. Yanıt süresi sayfa sayısıyla birlikte artar.
Çok derin sayfalama için, anahtar kümesi sayfalama, ofseti tamamen ortadan kaldırır. Atlanacak satırları saymak yerine, sorgu önceki sayfadaki son anahtarı hatırlar ve ondan sonraki satırları ister.
SELECT membership_number, full_names FROM members WHERE membership_number > 20 -- last id from the previous page ORDER BY membership_number ASC LIMIT 20;
Bu form, indeksin önündeki satırları dolaşmak yerine doğrudan başlangıç anahtarına atlaması nedeniyle her derinlikte hızlı kalır. Dezavantajı ise sayfaların sırayla dolaştırılması gerektiğidir, bu nedenle atlama işlemi yapılmalıdır.ping 500. sayfaya doğrudan ulaşmak artık mümkün değil.
SINIR içinde MySQL TOP ve FETCH'e karşı
LIMIT her SQL lehçesinde bulunmaz ve bu durum, bir sorgunun veritabanı motorları arasında taşınması gerektiğinde önem kazanır. MySQL, PostgreSQL, ve SQLite LIMIT anahtar kelimesini paylaşın. SQL Server, TOP kullanır ve Oracle Standart FETCH FIRST ifadesini kullanır. Aşağıdaki tablo üçünü karşılaştırmaktadır.
| fıkra | Motor | Örnek E-posta | Satırları atlar |
|---|---|---|---|
| SINIR … OFSET | MySQL, PostgreSQL, SQLite | SELECT * FROM members LIMIT 20 OFFSET 40; | Evet, OFFSET ile. |
| ÜST | SQL Server | ÜYELERDEN EN İYİ 20'Yİ SEÇİN *; | Hayır, OFFSET … FETCH gereklidir. |
| İLK GET | OracleDb2, standart SQL | SELECT * FROM members FETCH FIRST 20 ROWS ONLY; | Evet, OFFSET … ROWS ile. |
Her durumda davranış aynıdır: satır sayısını sınırlandırın ve isteğe bağlı olarak önce belirli sayıda satırı atlayın. Sadece yazım değişir. Bu nedenle, birden fazla arama motorunda çalışması gereken bir sorgu, satır sınırlama maddesini kod tabanına dağıtmak yerine izole etmelidir.
