SELECT ile Tablodan Satır Okuma
SQLite veritabanına soracağınız her soru SELECT ile başlar. Anlamı şu: şu tablodan, şu koşullara uyan satırların şu sütunlarını bana ver. Bu yazıda ilk iki parçaya odaklanıyoruz: sütunlar ve tablo. Filtreleme kısmı bir sonraki dokümanda.
İşte yazılabilecek en sade sorgu:
SELECT * "tüm sütunlar" anlamına gelir. FROM products ise hangi tablodan veri çekeceğimizi söyler. Sonuç olarak her kayıt için bir satır, dört sütunuyla birlikte gelir. Noktalı virgül de ifadeyi sonlandırır.
Kalıbın tamamı şu kadar basit: SELECT <sütunlar> FROM <tablo>;.
Belirli Sütunları Seçmek
* keşif yaparken işe yarar. Ama gerçek projelerde neredeyse her zaman ihtiyacın olan sütunları tek tek belirtmek istersiniz:
İstediğiniz sırayla iki sütun geri gelir. SELECT listesindeki sıra, sonucun sırasını belirler — tablodaki sütun sırasıyla eşleşmek zorunda değil.
Peki neden SELECT * yerine bunu tercih edelim? İki sebep var. Birincisi, ağ üzerinden (ya da dosyadan) daha az veri akar; bu, tablolar genişledikçe ciddi fark yaratır. İkincisi, biri bir ay sonra tabloya yeni bir sütun eklediğinde sorgun bozulmadan çalışmaya devam eder. SELECT * sessiz sedasız daha fazla sütun döndürmeye başlar ve satırları konuma göre açan uygulama kodunu kırabilir.
SELECT Sadece Veri Çekmez, Hesaplama da Yapar
SELECT listesindeki ifadeler illa ham sütun adları olmak zorunda değil. Aritmetik işlemler, fonksiyon çağrıları, string birleştirme, sabit değerler — yani herhangi bir ifade olabilir. SQLite bu ifadeyi her satır için ayrı ayrı değerlendirir.
Aslında dördüncü sütun tabloda yok — SQLite onu satır satır hesaplayıp önümüze koydu. Aynı şeyi metin fonksiyonlarıyla, tarihlerle, koşullu ifadelerle, ne isterseniz onunla yapabilirsiniz. SELECT listesi sadece veri çekmek için değil, veriyi şekillendirmek için de bir alan.
Hatta FROM olmadan da SELECT yazabilirsiniz; SQLite'ı bir hesap makinesi gibi kullanmış olursunuz:
Tek satır, üç sütun. Bir ifadenin ne yaptığını gerçek sorguya yerleştirmeden önce denemek için birebir.
AS ile sütunlara takma ad verme
Bir sütun hesapladığınızda, SQLite ona varsayılan bir isim atar — çoğunlukla ifadenin kendisini, yani price * stock gibi bir şeyi kullanır. Hem çirkin hem de güvenilmez bir isimlendirme. Sütuna AS ile düzgün bir takma ad verin:
Takma ad, sonuç kümesinde sütunun ismi olur. Bu, çıktıyı okurken okunabilirlik açısından önemlidir; sütun adıyla değer çeken uygulama kodunda ise çok daha kritiktir (row[1] yerine row["inventory_value"] yazabilmek gibi).
AS anahtar kelimesi aslında zorunlu değil — price * stock inventory_value şeklinde de aynı sonucu alırsınız — ama yine de açıkça yazın. Hem niyetiniz net olur, hem de eksik virgülü takma ad sanan okuyucuların kafası karışmaz.
Tabloya da Takma Ad Vermek
Tablonun kendisine de kısa bir takma ad atayabilirsiniz. Tek tabloyla çalışırken pek bir faydası yok, ama JOIN kullanmaya başladığınız anda bu alışkanlık kendini fazlasıyla gösterir:
p artık products yerine geçen bir takma ad. p.name şeklindeki noktalı yazım, sütunun hangi tablodan geldiğini açıkça gösterir. Tek tablo varken bu sadece gürültü gibi görünür; ama üç tabloyu join ettiğinizde sorguyu okunur tutan tek şey budur.
Sonuçta Sabit Değerler ve Literaller Kullanmak
Gerçek sütunları sabit değerlerle birlikte kullanabilirsiniz. Satırları etiketlemek ya da yer tutucu bir değer eklemek istediğinizde işe yarar:
Her satır aynı 'USD' ve 1 değerini alır. Bu desen, birden fazla sorgunun sonuçlarını UNION ile birleştirirken kaynakları ayırt etmek için bir işaret sütununa ihtiyaç duyduğunda sıkça karşına çıkar.
NULL Hakkında Kısa Bir Not
Bazı sütunlar boş kalır — ya hiç değer girilmemiştir ya da sütunun varsayılan bir değeri yoktur. SQLite, "değer yok" durumunu NULL ile temsil eder. NULL ise SELECT sonuçlarında, kullandığınız araca göre ya boş bir alan olarak ya da düz NULL yazısı şeklinde görünür.
İkinci satıra bakın. price değeri NULL ve price * 2 de NULL çıkıyor — NULL içeren her aritmetik işlem NULL üretir. Bu, SQL sonuçlarında kafa karışıklığının en yaygın sebeplerinden biridir ve ileride bu konuya ayrı bir sayfa ayıracağız. Şimdilik şunu aklınızda tutun: NULL, ifadelerin içinde âdeta bulaşıcıdır.
Akılda Kalması Gerekenler
- Her sorgunun temel kalıbı şudur:
SELECT <sütunlar> FROM <tablo>;. - Gerçek kodda sütunları tek tek yazın;
SELECT *daha çok keşif amaçlı kullanılır. SELECTlistesine yalnızca sütun adı değil, herhangi bir ifade de koyabilirsiniz.- Hesaplanmış sütunlara ve takma adlı tablolara düzgün isimler vermek için
ASkullanın. NULLaritmetik işlemlerde yayılır — sonuçlar tuhaf göründüğünde bunu hatırlayın.
Sırada: WHERE ile Filtreleme
Şu ana kadar yazdığımız her sorgu, tablodaki tüm satırları döndürdü. WHERE ifadesi tam burada devreye giriyor: fiyata göre, isme göre, tarihe göre ya da doğru/yanlış sonucu üreten herhangi bir ifadeye göre satırları daraltmanızı sağlıyor. Bir sonraki yazının konusu bu olacak.
Sıkça Sorulan Sorular
SQLite'ta SELECT ifadesinin temel söz dizimi nedir?
SELECT <sütunlar> FROM <tablo>; şeklindedir. Sütun kısmına virgülle ayrılmış bir liste yazabilirsiniz (SELECT name, email FROM users), tüm sütunlar için * koyabilirsiniz veya price * quantity gibi bir ifade kullanabilirsiniz. FROM ifadesi okunacak tabloyu belirtir, noktalı virgül de cümleyi bitirir.
SQLite'ta SELECT * kullanmalı mıyım?
CLI'da bir tabloda ne var ne yok hızlıca bakmak için gayet uygun. Ama uygulama kodunda gerçekten ihtiyacınız olan sütunları tek tek yazın. SELECT *, kodunuzu mevcut şemaya sıkı sıkıya bağlar — yarın bir sütun eklediğinizde bütün sorgular sessizce daha fazla veri döndürür ve satırları sıraya göre açan kodunuz patlayabilir.
SELECT sonuçlarında bir sütunu nasıl yeniden adlandırırım?
AS ile sütuna ya da ifadeye takma ad verebilirsiniz: SELECT price * quantity AS total FROM orders. Verdiğiniz takma ad, sonuç kümesindeki sütunun adı olur; bu hem okunabilirlik açısından hem de sonuçları sütun adıyla okuyan kodlar için önemlidir. AS anahtar sözcüğü teknik olarak isteğe bağlı ama netlik için yazmaya devam etmenizi öneririm.