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.

  • 🔢 Temel Davranış: LIMIT N en fazla N satır döndürür. N'den daha az satır içeren bir tablo, hatasız olarak tüm satırları döndürür.
  • 0️⃣ Sıfır Vaka: LIMIT 0 hiçbir satır döndürmez, bu da sütun meta verilerini incelemek için ucuz bir yöntem sağlar.
  • 📍 Ofset Sözdizimi: LIMIT 1, 2 bir satırı atlar ve iki satır döndürür, bu nedenle önce ofset, sonra satır sayısı yazılır.
  • 📄 Sayfalama Formülü: OFFSET, sayfa boyutunun sayfa numarasından bir çıkarılarak elde edilen değerle çarpılmasıyla bulunur ve sonuç kümesini numaralandırılmış sayfalara dönüştürür.
  • ↕️ Sipariş Bağımlılığı: SİPARİŞ TARİHİ olmadan, MySQL Her çalıştırmada farklı satırlar döndürebilir, bu nedenle LIMIT yalnızca açık bir sıralama ile deterministiktir.
  • ⚙️ Açıklamayı Destekleyen Bilgiler: LIMIT ayrıca UPDATE ve DELETE işlemlerinin etkilediği satır sayısını sınırlandırarak büyük bir tabloyu sınırsız yazma işlemlerinden korur.
  • ???? Performans Uyarısı: Büyük bir sapma, MySQL Atlanan her satırı okuyun ve atın, böylece derin sayfalar daha yavaş büyür.

MySQL SINIR ve OFSET

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.

  1. 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.
  2. 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.
  3. 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.

SSS

Evet. Her ikisi de aşağıdaki gibi düz bir satır sayısını kabul eder. SİL FROM members LIMIT 10. İki argümanlı offset biçimine burada izin verilmiyor, bu nedenle yalnızca etkilenen satır sayısı sınırlandırılabilir.

Ofset değeri sıfırdan başlar, bu nedenle OFSET 0 birinci satırdan, OFSET 1 ise ikinci satırdan başlar. Satır sayısı ise düz bir niceliktir ve normal bir sayı olarak okunur.

Aynı WHERE koşuluyla ancak LIMIT parametresi olmadan ayrı bir SELECT COUNT(*) sorgusu çalıştırın. Sayım, uygulamaya kaç sayfa olduğunu söylerken, sınırlı sorgu geçerli sayfa için satırları döndürür.

Genellikle evet. İstemcilerin içindeki yapay zeka asistanları, örneğin... MySQL Tezgâh OFFSET sorgusunu, son görülen anahtar üzerinde bir WHERE yan tümcesine dönüştürün. Yeniden yazma işlemine güvenmeden önce sıralama sütununun benzersiz ve indekslenmiş olduğunu doğrulayın.

Çünkü oluşturulan ifade genellikle ORDER BY ifadesini içermez. Açık bir sıralama olmadan, MySQL Satırları herhangi bir sırada döndürebilir, bu nedenle aynı LIMIT her çalıştırmada farklı bir örnek oluşturabilir. Sıralamayı kendiniz ekleyin.

Bu yazıyı şu şekilde özetleyin: