İçeriğe geç
Educora
Başlangıç14 dk5 / 22

ORDER BY ve LIMIT: sıralama ve sınırlama

Sonucu bir ya da birkaç sütuna göre sırala, ilk N satırı seç, sonuçları sayfalara böl ve farklı VTYS'lerin bunu nasıl yaptığını öğren.

Kendini test et
Bu derste öğreneceklerin
  • ORDER BY ile artan ve azalan sıralama yapmak
  • LIMIT ve OFFSET ile ilk N satırı ve sayfaları seçmek
  • NULL değerlerin ve ulusal harflerin sıralanmasındaki incelikleri bilmek
  • SQL Server'daki TOP ve standart FETCH yazımını tanımak

“En yüksek puanı alan beş öğrenci”, “en ucuz ürünler”, “arama sonuçlarının 2. sayfası”: bunların hepsi aynı iki adımdan oluşur. Önce satırlar sıralanır, sonra gerektiği kadarı alınır. SQL'de bu işi ORDER BY ve LIMIT yapar.

ORDER BY: sıralama

ORDER BY sorgunun sonuna yazılır. Varsayılan sıralama artandır (ASC: küçükten büyüğe, A'dan Z'ye). Azalan sıra için sütundan sonra DESC yazılır. Unutma: ORDER BY olmadan VTYS satırları istediği sırayla döndürebilir.

SQL
SELECT name, price
FROM products
ORDER BY price DESC;
▸ Beklenen çıktı
name | price
Laptop | 1450
Smartphone | 899.99
Monitor | 310
Headphones | 120.5
Backpack | 55
Chess set | 42
Desk lamp | 34.99
Water bottle | 12
Pen set | 7.9
Notebook | 3.2

Birden fazla sütuna göre de sıralayabilirsin. İkinci sütun yalnızca birinci sütundaki değerler eşit olduğunda devreye girer; tıpkı sözlükte sözcüklerin önce ilk, sonra ikinci harfe göre dizilmesi gibi. Aşağıda öğrenciler yaşa göre azalan, aynı yaştakiler ise ada göre artan sırada dizilmiştir. Her sütunun kendi yönü vardır.

SQL
SELECT first_name, age, grade
FROM students
ORDER BY age DESC, first_name ASC;
▸ Beklenen çıktı
first_name | age | grade
Elvin | 17 | 11
Fidan | 17 | 11
Tural | 17 | 11
Murad | 16 | 10
Rəşad | 16 | 10
Səbinə | 16 | 10
Aysel | 15 | 9
Kamran | 15 | 9
Nigar | 15 | 9
Günay | 14 | 8
Leyla | 14 | 8
Orxan | 14 | 8

LIMIT ve OFFSET: ilk N satır ve sayfalar

LIMIT n, sonucun yalnızca ilk n satırını bırakır. ORDER BY ile birlikte bir “ilk N” sorgusu olur. Aşağıda depodaki değeri en yüksek üç ürünü buluyoruz; sıralama doğrudan stock_value takma adına göredir.

SQL
SELECT name, price, stock,
       price * stock AS stock_value
FROM products
ORDER BY stock_value DESC
LIMIT 3;
▸ Beklenen çıktı
name | price | stock | stock_value
Smartphone | 899.99 | 15 | 13499.85
Laptop | 1450 | 8 | 11600
Headphones | 120.5 | 40 | 4820
SQL
SELECT student_id, course_id, score
FROM enrollments
ORDER BY score DESC
LIMIT 5;
▸ Beklenen çıktı
student_id | course_id | score
6 | 6 | 99
11 | 1 | 97
3 | 2 | 95
11 | 3 | 94
5 | 5 | 93
En yüksek beş puan.

OFFSET m önce m satırı atlar. Web sitelerinde sayfalama böyle yapılır: her sayfada n satır varsa k. sayfa için LIMIT n OFFSET (k − 1) · n yazılır. Sayfa başına üç ürün varsa 2. sayfada en ucuz 4., 5. ve 6. ürünler görünür.

SQL
-- page 2, three products per page
SELECT name, price
FROM products
ORDER BY price
LIMIT 3 OFFSET 3;
▸ Beklenen çıktı
name | price
Desk lamp | 34.99
Chess set | 42
Backpack | 55

NULL ve ulusal harfler

Sıralamada NULL nereye düşer? SQLite, MySQL ve SQL Server'da artan sıralamada NULL değerler başta, PostgreSQL'de ise sonda yer alır. SQLite ve PostgreSQL yeri kendin seçmene izin verir: NULLS FIRST ya da NULLS LAST.

SQL
SELECT first_name, email
FROM students
ORDER BY email, id
LIMIT 4;
▸ Beklenen çıktı
first_name | email
Elvin | NULL
Tural | NULL
Aysel | aysel@example.com
Fidan | fidan@example.com
SQL
SELECT first_name, email
FROM students
ORDER BY email NULLS LAST, id
LIMIT 4;
▸ Beklenen çıktı
first_name | email
Aysel | aysel@example.com
Fidan | fidan@example.com
Günay | gunay@example.com
Kamran | kamran@example.com
SQL
SELECT first_name, last_name
FROM students
ORDER BY last_name;
▸ Beklenen çıktı
first_name | last_name
Günay | Abbasova
Orxan | Babayev
Fidan | Cəfərova
Leyla | Hüseynova
Kamran | Həsənov
Rəşad | Kərimov
Aysel | Məmmədova
Səbinə | Nəsirova
Elvin | Quliyev
Nigar | Rzayeva
Tural | İsmayılov
Murad | Əliyev

Sonucun sonuna bak: İsmayılov ve ters e (schwa) harfiyle başlayan soyadı Rzayeva soyadından sonra gelmiş, oysa Azerbaycan alfabesinde bu iki harf çok daha öndedir. Bunun nedeni, SQLite'ın varsayılan olarak harfleri karakter kodlarına göre karşılaştırmasıdır; özel harflerin kodları ise A–Z harflerininkinden büyüktür.

Lehçeler: LIMIT, TOP ve FETCH

LIMIT SQLite, MySQL ve PostgreSQL'de çalışır. SQL Server'da ise sütunlardan önce TOP n yazılır. SQL standardında OFFSET ... FETCH yazımı vardır; bunu PostgreSQL ve SQL Server (2012 sürümünden beri) anlar. Aşağıdaki iki sorgu SQLite'ta çalışmaz, ama bir LIMIT 3 sorgusuyla aynı sonucu verir.

SQL
-- SQL Server
SELECT TOP 3 name, price
FROM products
ORDER BY price DESC;

-- SQL standard: PostgreSQL, SQL Server 2012+
SELECT name, price
FROM products
ORDER BY price DESC
OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;
Beklenen çıktı
name | price
Laptop | 1450
Smartphone | 899.99
Monitor | 310
SQLite'ta aynı sonucu ORDER BY price DESC LIMIT 3 verir.
Alıştırma

En ucuz 3 ürünün adını ve fiyatını göster; en ucuzu ilk sırada olsun.

Alıştırma · SQL
SELECT name, price
FROM products;
▸ Beklenen çıktı
name | price
Notebook | 3.2
Pen set | 7.9
Water bottle | 12
Alıştırma

Bir çevrim içi mağaza ürünleri en pahalıdan en ucuza doğru, sayfa başına 4 ürün olacak şekilde listeliyor. İkinci sayfadaki ürünlerin adını ve fiyatını göster.

Alıştırma · SQL
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 4;
▸ Beklenen çıktı
name | price
Backpack | 55
Chess set | 42
Desk lamp | 34.99
Water bottle | 12

Önemli noktalar

  • ORDER BY sonucu sıralar: ASC artan (varsayılan), DESC azalan.
  • Birkaç sütuna göre sıralamada sonraki sütun yalnızca öncekiler eşit olduğunda devreye girer.
  • LIMIT n OFFSET m, m satırı atlayıp n satır alır; sayfalama böyle yapılır.
  • LIMIT komutunu her zaman ORDER BY ile birlikte kullan; yoksa sonuç rastgele olur.
  • SQL Server'da LIMIT yerine TOP n, standartta ise OFFSET ... FETCH kullanılır.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
ORDER BY price hangi yönde sıralar?