SQL’de Tablolardan Satır Seçme Rehberi: SELECT İfadesinin Derinlemesine İncelenmesi
Giriş: Veri Dünyasının Kapısını Açan SELECT
Veritabanları, modern yazılım uygulamalarının ve iş zekası sistemlerinin temelini oluşturur. Bu veritabanları içerisinde depolanan bilgilere erişmek, analiz etmek ve manipüle etmek için kullanılan dil ise Yapısal Sorgu Dili (Structured Query Language) veya kısaca SQL’dir. SQL, veritabanı yönetim sistemleriyle (DBMS) etkileşim kurmak için bir standarttır ve veri uzmanları, geliştiriciler ve analistler için vazgeçilmez bir araçtır.
SQL’in en temel ve en sık kullanılan komutu, veritabanındaki tablolardan bilgi çekmek için kullanılan SELECT ifadesidir. SELECT ifadesi olmadan bir veritabanından anlamlı bir şekilde veri almak imkansızdır. Bu makale, SELECT ifadesinin temel kullanımlarından başlayarak, ileri düzey özelliklerine, performans ipuçlarına ve en iyi uygulamalara kadar geniş bir yelpazede derinlemesine bir rehber sunmayı amaçlamaktadır. Amacımız, SQL’de SELECT komutunu kullanarak veritabanınızdan istediğiniz veriyi en verimli ve doğru şekilde nasıl çekeceğinizi adım adım öğretmektir.
Temel SELECT İfadesi: Veri Çekmenin İlk Adımı
SELECT ifadesinin en basit formu, bir tablodan belirli sütunları veya tüm sütunları çekmek için kullanılır. Temel yapısı şu şekildedir:
SELECT sütun1, sütun2, ...
FROM tablo_adı;
Burada sütun1, sütun2, … çekmek istediğiniz sütunların adlarıdır. Eğer bir tablodaki tüm sütunları çekmek istiyorsanız, sütun adları yerine bir yıldız (*) kullanabilirsiniz.
Tüm Sütunları Seçme: Hızlı Bir Bakış
Bir tablodaki tüm sütunları hızlıca görmek istediğinizde SELECT * ifadesi oldukça kullanışlıdır.
Örnek:
Müşteriler adında bir tablonuz olduğunu ve bu tablodaki tüm bilgileri görmek istediğinizi varsayalım:
SELECT *
FROM Müşteriler;
Bu sorgu, Müşteriler tablosundaki her satır ve her sütundaki tüm veriyi döndürecektir. Geliştirme aşamasında veya tablo yapısını anlamak için pratik olsa da, üretim ortamında performansı olumsuz etkileyebileceği durumlar vardır.
Belirli Sütunları Seçme: İhtiyacınız Olanı Alın
Genellikle bir tablodaki tüm sütunlara ihtiyacınız olmaz. Yalnızca belirli bilgilere odaklanmak, hem ağ trafiğini azaltır hem de sorgunun daha hızlı çalışmasını sağlar. Bu, aynı zamanda kod okunabilirliğini de artırır.
Örnek:
Müşteriler tablosundan sadece Ad, Soyad ve Eposta sütunlarını çekmek istediğinizde:
SELECT Ad, Soyad, Eposta
FROM Müşteriler;
Bu sorgu, Müşteriler tablosundaki her müşteri için yalnızca belirtilen üç sütundaki veriyi döndürür. Bu yöntem, özellikle çok sayıda sütunu olan geniş tablolarla çalışırken performansı ve kaynak kullanımını optimize etmek için en iyi uygulamadır.
Satırları Filtreleme: WHERE Yan Tümcesi ile Hedefe Ulaşın
Çoğu zaman, bir tablodaki tüm satırlara değil, belirli kriterlere uyan satırlara ihtiyacımız olur. İşte bu noktada WHERE yan tümcesi devreye girer. WHERE yan tümcesi, FROM ifadesinden sonra gelir ve döndürülecek satırları filtrelemek için bir veya daha fazla koşul belirtmenizi sağlar.
Genel Yapı:
SELECT sütun1, sütun2, ...
FROM tablo_adı
WHERE koşul;
koşul, TRUE (doğru) veya FALSE (yanlış) olarak değerlendirilebilen bir ifadedir. Sadece TRUE olarak değerlendirilen satırlar sonuç kümesine dahil edilir.
Karşılaştırma Operatörleri: Veriyi Kriterlere Göre Sınıflandırma
WHERE yan tümcesinde en sık kullanılanlar karşılaştırma operatörleridir:
* = (Eşittir): Belirli bir değere eşit olan satırları seçer.
Örnek: SELECT * FROM Ürünler WHERE Fiyat = 25.00;
* != veya <> (Eşit Değildir): Belirli bir değere eşit olmayan satırları seçer.
Örnek: SELECT * FROM Çalışanlar WHERE DepartmanID != 3;
* > (Büyüktür): Belirli bir değerden büyük olan satırları seçer.
Örnek: SELECT * FROM Siparişler WHERE ToplamTutar > 100.00;
* < (Küçüktür): Belirli bir değerden küçük olan satırları seçer.
Örnek: SELECT * FROM Öğrenciler WHERE Yaş < 18;
* >= (Büyük veya Eşittir): Belirli bir değere büyük veya eşit olan satırları seçer.
Örnek: SELECT * FROM Stok WHERE Miktar >= 50;
* <= (Küçük veya Eşittir): Belirli bir değere küçük veya eşit olan satırları seçer.
Örnek: SELECT * FROM Tarihler WHERE Tarih <= '2023-01-01';
Mantıksal Operatörler: Birden Fazla Koşulu Birleştirme
Birden fazla filtreleme koşulunu birleştirmek için mantıksal operatörler kullanılır:
* AND: Tüm koşulların TRUE olması durumunda satırı döndürür.
Örnek: SELECT Ad, Soyad FROM Müşteriler WHERE Şehir = 'Ankara' AND Yaş > 30;
* OR: Koşullardan herhangi birinin TRUE olması durumunda satırı döndürür.
Örnek: SELECT ÜrünAdı FROM Ürünler WHERE Kategori = 'Elektronik' OR Fiyat < 50.00;
* NOT: Bir koşulun sonucunu tersine çevirir (yani TRUE ise FALSE, FALSE ise TRUE yapar).
Örnek: SELECT * FROM Çalışanlar WHERE NOT DepartmanID = 1; (DepartmanID'si 1 olmayan çalışanlar)
Mantıksal operatörler karmaşık koşullar oluşturmak için parantezlerle birleştirilebilir. Parantezler, operatörlerin değerlendirilme sırasını belirler.
Örnek:
SELECT * FROM Siparişler WHERE (Şehir = 'İstanbul' OR Şehir = 'İzmir') AND ToplamTutar > 200;
Bu sorgu, İstanbul veya İzmir'den gelen ve toplam tutarı 200'den büyük olan siparişleri getirir.
Özel Filtreleme Operatörleri: Daha Esnek Sorgular
SQL, WHERE yan tümcesinde kullanılabilecek daha özel operatörler de sunar.
LIKE Operatörü: Desen Eşleştirme ile Arama
LIKE operatörü, metin verilerinde belirli bir deseni aramak için kullanılır. İki joker karakterle birlikte kullanılır:
* % (Yüzde işareti): Sıfır veya daha fazla karakteri temsil eder.
* _ (Alt çizgi): Tek bir karakteri temsil eder.
Örnekler:
* SELECT Ad FROM Müşteriler WHERE Ad LIKE 'A%'; (Adı 'A' ile başlayan müşteriler)
* SELECT Ad FROM Müşteriler WHERE Ad LIKE '%an%'; (Adında 'an' geçen müşteriler)
* SELECT Ad FROM Müşteriler WHERE Ad LIKE '_li%'; (İkinci harfi 'l', üçüncü harfi 'i' olan müşteriler)
* SELECT Ad FROM Müşteriler WHERE Ad NOT LIKE 'M%'; (Adı 'M' ile başlamayan müşteriler)
IN Operatörü: Belirli Değerler Kümesinde Arama
IN operatörü, bir sütunun belirli bir değer listesinde olup olmadığını kontrol eder. Birden fazla OR koşulu yazmaktan daha temiz bir yoldur.
Örnekler:
SELECT FROM Ürünler WHERE Kategori IN ('Elektronik', 'Giyim', 'Ev Aletleri');
SELECT FROM Siparişler WHERE MüşteriID NOT IN (101, 105, 110);
BETWEEN Operatörü: Aralık Bazlı Filtreleme
BETWEEN operatörü, bir değerin belirli bir aralıkta (dahil) olup olmadığını kontrol eder. Sayısal değerler, tarihler veya metinler için kullanılabilir.
Örnekler:
SELECT FROM Ürünler WHERE Fiyat BETWEEN 50.00 AND 150.00; (50 ile 150 arası, 50 ve 150 dahil)
SELECT FROM Siparişler WHERE SiparişTarihi BETWEEN '2023-01-01' AND '2023-03-31';
SELECT FROM Çalışanlar WHERE Soyad BETWEEN 'A' AND 'Czzzz'; (Soyadı 'A' ile 'C' arasında olanlar)
IS NULL / IS NOT NULL: Eksik Veriyle Çalışma
NULL değeri, bir sütunda veri olmadığını veya bilinmediğini belirtir. NULL değerleri diğer değerlerle karşılaştırılamaz (örneğin, Sütun = NULL yanlış sonuç verir). Bunun yerine IS NULL veya IS NOT NULL kullanılır.
Örnekler:
SELECT FROM Müşteriler WHERE Eposta IS NULL; (E-posta adresi olmayan müşteriler)
SELECT FROM Ürünler WHERE Açıklama IS NOT NULL; (Açıklaması olan ürünler)
Sıralama: ORDER BY Yan Tümcesi ile Veriye Düzen Verme
SELECT ifadesiyle çekilen veriler, varsayılan olarak veritabanı yönetim sisteminin (DBMS) verileri fiziksel olarak depoladığı sıraya göre veya belirli bir indeksin sırasına göre dönebilir. Ancak genellikle veriyi belirli bir sütuna göre sıralanmış olarak görmek isteriz. ORDER BY yan tümcesi bu iş için kullanılır.
Genel Yapı:
SELECT sütun1, sütun2, ...
FROM tablo_adı
WHERE koşul
ORDER BY sütun_adı [ASC|DESC], sütun_adı2 [ASC|DESC], ...;
* ASC (Ascending - Artan): Varsayılan sıralama düzenidir, belirtilmese de otomatik olarak uygulanır. Küçükten büyüğe veya A'dan Z'ye sıralar.
* DESC (Descending - Azalan): Büyükten küçüğe veya Z'den A'ya sıralar.
Örnekler:
* SELECT Ad, Soyad, Yaş FROM Müşteriler ORDER BY Yaş DESC; (Yaşa göre azalan sırada)
* SELECT ÜrünAdı, Fiyat FROM Ürünler ORDER BY Fiyat ASC, ÜrünAdı ASC; (Önce fiyata göre artan, fiyatlar eşitse ürün adına göre artan sırada)
Veriyi Gruplama: GROUP BY Yan Tümcesi ve Toplama Fonksiyonları
Veritabanlarından sadece ham veri çekmek yerine, genellikle özet bilgilere ihtiyaç duyarız. Örneğin, her bir departmandaki çalışan sayısını veya her bir kategorideki ürünlerin ortalama fiyatını bilmek isteyebiliriz. GROUP BY yan tümcesi, satırları bir veya daha fazla sütunun değerlerine göre gruplandırır ve bu gruplar üzerinde toplama (aggregate) fonksiyonları çalıştırmamızı sağlar.
Genel Yapı:
SELECT sütun1, toplama_fonksiyonu(sütun2)
FROM tablo_adı
WHERE koşul
GROUP BY sütun1;
GROUP BY ifadesinde yer alan sütunlar, SELECT listesinde de yer almalıdır (toplama fonksiyonları içinde kullanılmayanlar).
Toplama Fonksiyonları: Veriden Özet Bilgi Çıkarma
GROUP BY ile birlikte kullanılan en yaygın toplama fonksiyonları şunlardır:
COUNT(): Bir gruptaki satır sayısını sayar. COUNT() tüm satırları, COUNT(sütun_adı) ise NULL olmayan değerleri sayar.
Örnek: SELECT Kategori, COUNT(ÜrünID) AS ÜrünSayısı FROM Ürünler GROUP BY Kategori;
* SUM(): Bir gruptaki sayısal bir sütunun toplamını hesaplar.
Örnek: SELECT MüşteriID, SUM(ToplamTutar) AS ToplamSiparişTutarı FROM Siparişler GROUP BY MüşteriID;
* AVG(): Bir gruptaki sayısal bir sütunun ortalamasını hesaplar.
Örnek: SELECT Departman, AVG(Maaş) AS OrtalamaMaaş FROM Çalışanlar GROUP BY Departman;
* MIN(): Bir gruptaki en küçük değeri bulur.
Örnek: SELECT Kategori, MIN(Fiyat) AS EnDüşükFiyat FROM Ürünler GROUP BY Kategori;
* MAX(): Bir gruptaki en büyük değeri bulur.
Örnek: SELECT Kategori, MAX(Fiyat) AS EnYüksekFiyat FROM Ürünler GROUP BY Kategori;
Gruplanmış Veriyi Filtreleme: HAVING Yan Tümcesi
WHERE yan tümcesi, GROUP BY işlemi yapılmadan önce tek tek satırları filtrelerken, HAVING yan tümcesi GROUP BY işleminden sonra, yani gruplar oluşturulduktan sonra grupları filtrelemek için kullanılır. HAVING genellikle toplama fonksiyonlarının sonuçlarına dayalı koşullar içerir.
Genel Yapı:
SELECT sütun1, toplama_fonksiyonu(sütun2)
FROM tablo_adı
WHERE koşul
GROUP BY sütun1
HAVING grup_koşulu;
Örnek:
SELECT Kategori, COUNT(ÜrünID) AS ÜrünSayısı FROM Ürünler GROUP BY Kategori HAVING COUNT(ÜrünID) > 10;
Bu sorgu, sadece 10'dan fazla ürünü olan kategorileri ve bu kategorilerdeki ürün sayısını döndürür.
Sonuçları Sınırlama: Büyük Veri Kümeleriyle Çalışırken
Bazen bir sorgunun döndüreceği satır sayısını sınırlamak isteyebiliriz. Bu, özellikle büyük veri kümeleriyle çalışırken veya sayfalama (pagination) uygulamalarında faydalıdır. Farklı veritabanı sistemleri bu işlevsellik için farklı anahtar kelimeler kullanır.
* LIMIT (MySQL, PostgreSQL, SQLite): Belirtilen sayıda satırı döndürür. OFFSET ile birlikte kullanılarak belirli bir noktadan itibaren satırları atlayıp sonraki satırları almayı sağlar.
Örnek:
SELECT * FROM Ürünler ORDER BY Fiyat DESC LIMIT 10; (En pahalı 10 ürünü getirir)
SELECT * FROM Müşteriler ORDER BY MüşteriID LIMIT 10 OFFSET 20; (21. satırdan başlayarak 10 müşteri getirir - 3. sayfa)
* TOP (SQL Server): SELECT ifadesinden hemen sonra kullanılarak döndürülecek satır sayısını sınırlar.
Örnek:
SELECT TOP 10 * FROM Ürünler ORDER BY Fiyat DESC; (En pahalı 10 ürünü getirir)
SELECT TOP 50 PERCENT * FROM Ürünler; (Toplam ürünlerin %50'sini getirir)
Tekrar Eden Satırları Kaldırma: DISTINCT Anahtar Kelimesi
Bazen bir sütunda veya sütun kombinasyonunda yinelenen değerler olabilir ve biz sadece benzersiz değerleri görmek isteyebiliriz. DISTINCT anahtar kelimesi, SELECT ifadesiyle birlikte kullanıldığında, sonuç kümesindeki yinelenen satırları kaldırır ve sadece benzersiz olanları döndürür.
Genel Yapı:
SELECT DISTINCT sütun1, sütun2, ...
FROM tablo_adı;
Örnekler:
* SELECT DISTINCT Şehir FROM Müşteriler; (Müşterilerin bulunduğu tüm benzersiz şehirleri listeler)
* SELECT DISTINCT Kategori, TedarikçiID FROM Ürünler; (Benzersiz kategori ve tedarikçi kombinasyonlarını listeler)
Sütunlara ve Tablolara Takma Ad Verme: Sorguları Anlaşılır Kılma
Sorguları daha okunabilir hale getirmek, karmaşık ifadelerin veya fonksiyonların çıktısına anlamlı isimler vermek ve birden fazla tabloyu birleştirirken sütun çakışmalarını önlemek için takma adlar (alias) kullanılır. AS anahtar kelimesi ile takma adlar atanır, ancak AS çoğu durumda isteğe bağlıdır.
Sütunlara Takma Ad Verme (Column Aliasing)
SELECT listesindeki bir sütuna veya bir ifadenin sonucuna geçici bir isim vermek için kullanılır.
Örnekler:
* SELECT Ad AS MüşteriAdı, Soyad AS MüşteriSoyadı FROM Müşteriler;
* SELECT COUNT(ÜrünID) AS ToplamÜrünSayısı FROM Ürünler;
SELECT (Fiyat Miktar) AS ToplamTutar FROM SiparişDetayları;
Tablolara Takma Ad Verme (Table Aliasing)
Özellikle JOIN işlemleri sırasında tablo isimleri uzun olduğunda veya aynı tabloyu birden fazla kez kullandığınızda (self-join) tablo takma adları çok faydalıdır.
Örnek:
SELECT m.Ad, m.Soyad FROM Müşteriler AS m WHERE m.Şehir = 'Ankara';
Burada Müşteriler tablosuna m takma adı verilmiştir.
Birden Fazla Tablodan Veri Seçme: JOIN İşlemleri
Veritabanları genellikle ilişkiseldir, yani veriler farklı tablolar arasında ilişkilendirilmiş şekilde depolanır. Örneğin, müşteri bilgileri bir tabloda, sipariş bilgileri başka bir tabloda olabilir. Bu tabloları birleştirerek anlamlı veriler elde etmek için JOIN işlemleri kullanılır. JOIN işlemi, iki veya daha fazla tablodaki satırları, aralarındaki ortak bir sütun (ilişki) üzerinden birleştirir.
Genel Yapı:
SELECT sütunlar
FROM tablo1
JOIN_TİPİ tablo2 ON tablo1.ortak_sütun = tablo2.ortak_sütun;
INNER JOIN: Ortak Kayıtları Birleştirme
INNER JOIN, her iki tabloda da eşleşen kayıtlara sahip satırları döndürür. Eşleşme olmayan satırlar sonuç kümesine dahil edilmez.
Örnek:
SELECT Müşteriler.Ad, Siparişler.SiparişTarihi FROM Müşteriler INNER JOIN Siparişler ON Müşteriler.MüşteriID = Siparişler.MüşteriID;
Bu sorgu, sadece sipariş vermiş müşterilerin adlarını ve sipariş tarihlerini getirir.
LEFT JOIN (LEFT OUTER JOIN): Sol Tablodaki Tüm Kayıtlar
LEFT JOIN, sol tablodaki tüm satırları ve sağ tablodaki eşleşen satırları döndürür. Sağ tabloda eşleşen bir kayıt yoksa, sağ tablonun sütunları için NULL değerleri döndürülür.
Örnek:
SELECT Müşteriler.Ad, Siparişler.SiparişTarihi FROM Müşteriler LEFT JOIN Siparişler ON Müşteriler.MüşteriID = Siparişler.MüşteriID;
Bu sorgu, tüm müşterileri (sipariş vermiş olsun veya olmasın) ve eğer varsa sipariş tarihlerini getirir. Siparişi olmayan müşteriler için SiparişTarihi sütunu NULL olacaktır.
RIGHT JOIN (RIGHT OUTER JOIN): Sağ Tablodaki Tüm Kayıtlar
RIGHT JOIN, LEFT JOIN'in tam tersidir. Sağ tablodaki tüm satırları ve sol tablodaki eşleşen satırları döndürür. Sol tabloda eşleşen bir kayıt yoksa, sol tablonun sütunları için NULL değerleri döndürülür.
Örnek:
SELECT Müşteriler.Ad, Siparişler.SiparişTarihi FROM Müşteriler RIGHT JOIN Siparişler ON Müşteriler.MüşteriID = Siparişler.MüşteriID;
Bu sorgu, tüm siparişleri (müşterisi olsun veya olmasın) ve eğer varsa müşterinin adını getirir. Müşterisi silinmiş veya olmayan bir sipariş için Müşteriler.Ad sütunu NULL olacaktır.
FULL JOIN (FULL OUTER JOIN): Her İki Tablodaki Tüm Kayıtlar
FULL JOIN, hem sol hem de sağ tablodaki tüm satırları döndürür. Eşleşme olmayan yerlerde ilgili tablonun sütunları için NULL değerleri döndürülür.
Örnek:
SELECT Müşteriler.Ad, Siparişler.SiparişTarihi FROM Müşteriler FULL OUTER JOIN Siparişler ON Müşteriler.MüşteriID = Siparişler.MüşteriID;
Bu sorgu, tüm müşterileri ve tüm siparişleri getirir. Müşterisi olmayan siparişler veya siparişi olmayan müşteriler için ilgili sütunlar NULL olacaktır.
CROSS JOIN ve SELF JOIN: Özel Birleştirme Senaryoları
* CROSS JOIN: Her iki tablonun satırlarının tüm olası kombinasyonlarını (Kartezyen çarpım) döndürür. Nadiren kullanılır ve genellikle dikkatli olunması gerekir çünkü çok büyük sonuç kümeleri üretebilir.
* SELF JOIN: Bir tabloyu kendi kendine birleştirmektir. Genellikle aynı tablo içinde ilişkili satırları bulmak için kullanılır. Örneğin, aynı departmanda çalışan iki çalışanı bulmak gibi.
Alt Sorgular (Subqueries): Sorgu İçinde Sorgu
Alt sorgu (subquery veya inner query), başka bir SQL sorgusu içine yerleştirilmiş bir sorgudur. Alt sorgular, ana sorgunun bir parçası olarak çalışır ve genellikle ana sorgunun kullanacağı bir değer kümesi veya tek bir değer döndürür. Alt sorgular SELECT, INSERT, UPDATE ve DELETE ifadelerinin yanı sıra WHERE, HAVING ve FROM yan tümcelerinde kullanılabilir.
Örnekler:
* WHERE yan tümcesinde: Belirli bir ortalamanın üzerinde fiyatı olan ürünleri bulma.
SELECT ÜrünAdı, Fiyat FROM Ürünler WHERE Fiyat > (SELECT AVG(Fiyat) FROM Ürünler);
* IN operatörü ile: Belirli bir departmanda çalışan müşterilerin siparişlerini bulma.
SELECT * FROM Siparişler WHERE MüşteriID IN (SELECT MüşteriID FROM Müşteriler WHERE Departman = 'Satış');
* SELECT listesinde (skaler alt sorgu): Her ürün için o ürünün kategorisindeki ortalama fiyatı getirme.
SELECT ÜrünAdı, Fiyat, (SELECT AVG(Fiyat) FROM Ürünler AS U2 WHERE U2.Kategori = U1.Kategori) AS KategoriOrtalamaFiyat FROM Ürünler AS U1;
İleri Düzey SELECT Konuları: Veri İşlemede Yeni Boyutlar
SQL, SELECT ifadesinin gücünü daha da artıran gelişmiş özellikler sunar.
Pencere Fonksiyonları (Window Functions)
Pencere fonksiyonları, bir sorgunun sonuç kümesindeki ilgili satırların bir "penceresi" üzerinde hesaplamalar yapmanızı sağlar. ROW_NUMBER(), RANK(), LAG(), LEAD(), NTILE() gibi fonksiyonlar, sıralama, derecelendirme, hareketli ortalamalar veya belirli bir gruptaki önceki/sonraki satırları almak için kullanılır.
Örnek (ROW_NUMBER()):
SELECT ÜrünAdı, Kategori, Fiyat, ROW_NUMBER() OVER (PARTITION BY Kategori ORDER BY Fiyat DESC) AS Sıra FROM Ürünler;
Bu sorgu, her kategori içinde ürünleri fiyatlarına göre sıralar ve her ürüne bir sıra numarası verir.
Ortak Tablo İfadeleri (CTE'ler - Common Table Expressions)
WITH anahtar kelimesiyle tanımlanan CTE'ler, karmaşık sorguları daha küçük, okunabilir ve yönetilebilir parçalara ayırmanın bir yoludur. Bir CTE, bir sorgunun yürütülmesi sırasında geçici olarak var olan ve diğer sorgular tarafından başvurulabilen adlandırılmış bir geçici sonuç kümesidir.
Örnek:
WITH YüksekFiyatlıÜrünler AS (
SELECT ÜrünAdı, Fiyat
FROM Ürünler
WHERE Fiyat > 100
)
SELECT * FROM YüksekFiyatlıÜrünler ORDER BY Fiyat DESC;
Küme Operatörleri (Set Operators): UNION
Küme operatörleri, iki veya daha fazla SELECT ifadesinin sonuç kümelerini birleştirmek için kullanılır. En yaygın olanı UNION'dır.
* UNION: İki veya daha fazla SELECT ifadesinin sonuçlarını birleştirir ve yinelenen satırları kaldırır. SELECT listesindeki sütun sayıları ve veri tipleri aynı olmalıdır.
* UNION ALL: UNION ile aynıdır ancak yinelenen satırları kaldırmaz.
Örnek:
SELECT Ad, Soyad, 'Müşteri' AS Tip FROM Müşteriler
UNION
SELECT Ad, Soyad, 'Çalışan' AS Tip FROM Çalışanlar;
Bu sorgu, müşteri ve çalışan listelerini tek bir sonuç kümesinde birleştirir.
Performans İpuçları ve En İyi Uygulamalar
SELECT sorgularının performansını optimize etmek, büyük ölçekli uygulamalar ve veri analizi için hayati öneme sahiptir.
* İndeks Kullanımı: WHERE yan tümcesinde sıkça kullanılan sütunlara, JOIN koşullarında kullanılan sütunlara ve ORDER BY veya GROUP BY ifadelerindeki sütunlara indeksler eklemek sorgu performansını önemli ölçüde artırır.
SELECT Yerine Belirli Sütunları Seçmek: Gereksiz yere tüm sütunları çekmekten kaçının. Yalnızca ihtiyacınız olan sütunları seçmek, hem ağ trafiğini azaltır hem de veritabanının daha az veri okumasını sağlar.
* WHERE Yan Tümcesini Optimize Etmek: Mümkünse, WHERE koşullarını en kısıtlayıcı olandan başlayarak yazın. Fonksiyonları WHERE yan tümcesinde sütun üzerinde kullanmaktan kaçının (örneğin, WHERE YEAR(Tarih) = 2023 yerine WHERE Tarih BETWEEN '2023-01-01' AND '2023-12-31').
* JOIN'leri Doğru Kullanmak: Gereksiz JOIN'lerden kaçının. INNER JOIN genellikle en performanslıdır. LEFT JOIN veya RIGHT JOIN kullanırken, null değerlerin işlenmesi performansı etkileyebilir.
* Alt Sorguları Dikkatli Kullanmak: Bazı durumlarda alt sorgular yerine JOIN işlemleri daha performanslı olabilir. İç içe çok fazla alt sorgudan kaçının.
* LIMIT/TOP Kullanımı: Sadece ihtiyacınız olan kadar veri çekmek, özellikle sayfalama yaparken veya sadece ilk N sonucu görmek istediğinizde performansı artırır.
* Sorgu Planlarını İncelemek: Veritabanı yönetim sistemlerinin sunduğu sorgu planı (execution plan) araçlarını kullanarak sorgularınızın nasıl çalıştığını anlayın ve darboğazları tespit edin.
Sonuç: SELECT Ustalığına Giden Yol
SELECT ifadesi, SQL'in kalbidir ve veritabanı etkileşimlerinin temelini oluşturur. Bu makalede, temel SELECT kullanımından başlayarak, satırları filtreleme (WHERE), sıralama (ORDER BY), gruplama (GROUP BY, HAVING), sonuçları sınırlama (LIMIT/TOP), benzersiz değerleri alma (DISTINCT), takma adlar (AS) ve en önemlisi birden fazla tabloyu birleştirme (JOIN) gibi kritik konuları ele aldık. Ayrıca alt sorgular, pencere fonksiyonları ve CTE'ler gibi ileri düzey konulara da değindik ve performans optimizasyonu için önemli ipuçları sunduk.
SQL'de SELECT komutunda ustalaşmak, veritabanlarından anlamlı bilgiler çıkarmak, raporlar oluşturmak ve karmaşık veri analizi görevlerini yerine getirmek için vazgeçilmezdir. Bu rehber, size bu yolculukta sağlam bir temel sağlamayı amaçlamaktadır. Unutmayın ki SQL öğrenmenin en iyi yolu pratik yapmaktır. Farklı senaryolar üzerinde sorgular yazarak, farklı tablolarla çalışarak ve veritabanı yönetim sisteminizin dokümantasyonunu inceleyerek bilginizi pekiştirebilirsiniz. Veri dünyasının kapılarını SELECT ile aralayın ve keşfetmeye başlayın!
