ORDER BYile artan ve azalan sıralama yapmakLIMITveOFFSETile ilk N satırı ve sayfaları seçmekNULLdeğerlerin ve ulusal harflerin sıralanmasındaki incelikleri bilmek- SQL Server'daki
TOPve standartFETCHyazı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.
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.
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.
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
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
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.
-- 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.
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
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
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 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;name | price Laptop | 1450 Smartphone | 899.99 Monitor | 310
ORDER BY price DESC LIMIT 3 verir.En ucuz 3 ürünün adını ve fiyatını göster; en ucuzu ilk sırada olsun.
SELECT name, price
FROM products;▸ Beklenen çıktı
name | price Notebook | 3.2 Pen set | 7.9 Water bottle | 12
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.
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 BYsonucu sıralar:ASCartan (varsayılan),DESCazalan.- 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.LIMITkomutunu her zamanORDER BYile birlikte kullan; yoksa sonuç rastgele olur.- SQL Server'da
LIMITyerineTOP n, standartta iseOFFSET ... FETCHkullanılır.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
ORDER BY price hangi yönde sıralar?