PostgreSQL Multiple SELECT Queries: Tek Sorguda Birden Fazla SELECT Kullanımı
PostgreSQL kullanırken bazen farklı tablolardan veya farklı filtreleme koşullarından gelen sonuçları tek bir sorguda görmek isteyebilirsiniz. Bu durumda multiple SELECT queries kullanarak birden fazla sorguyu tek bir sonuç setinde birleştirmek mümkündür.
Birden Fazla SELECT Sorgusunu Neden Birleştirmeliyiz?
SQL sorgularında bazen farklı tablolardan veri çekmek için birden fazla SELECT sorgusu yazmak gerekir. Bu sorguları ayrı ayrı çalıştırmak yerine tek bir sorguda toplamak birçok avantaj sağlar:
- Daha okunabilir ve düzenli SQL kodu
- Daha az sorgu çalıştırarak performans artışı
- Raporlama ve dashboard sistemlerinde tek sonuç üretme
- Backend uygulamalarında daha az veritabanı çağrısı
Örneğin aşağıdaki sorgu yalnızca tek bir tablo için kayıt sayısını döndürür:
SELECT COUNT(*) AS phoneNumbersToFetch
FROM phone_numbers_to_fetch;
Ancak çoğu zaman birden fazla tablodan gelen istatistikleri tek bir sonuç satırında görmek isteriz.
PostgreSQL'de Birden Fazla SELECT'i Tek Sorguda Kullanma
Aşağıdaki örnekte dört farklı SELECT sorgusunu tek bir SELECT içinde birleştiriyoruz. Bu yöntemde her sorgu bir subquery olarak kullanılır.
SELECT
phoneNumbersToFetch,
phoneNumbersFetched,
phoneNumbersAvailable,
phoneNumbersNotAvailable
FROM
(SELECT COUNT(*) AS phoneNumbersToFetch
FROM phone_numbers_to_fetch) AS a1,
(SELECT COUNT(*) AS phoneNumbersFetched
FROM phone_number_details) AS a2,
(SELECT COUNT(*) AS phoneNumbersAvailable
FROM phone_number_details
WHERE line_info != '-1') AS a3,
(SELECT COUNT(*) AS phoneNumbersNotAvailable
FROM phone_number_details
WHERE line_info = '-1') AS a4;
Bu sorgu çalıştırıldığında tüm sonuçlar tek satırda döner.
SQL Sorgusunun Açıklaması
Yukarıdaki sorguda her alt sorgu belirli bir istatistiği hesaplar:
-
phoneNumbersToFetch :
phone_numbers_to_fetchtablosundaki toplam kayıt sayısını döndürür. -
phoneNumbersFetched :
phone_number_detailstablosundaki tüm kayıtların sayısını getirir. -
phoneNumbersAvailable :
line_infodeğeri -1 olmayan kayıtları sayar. -
phoneNumbersNotAvailable :
line_info = -1olan kayıtları döndürür.
Alternatif Yöntem: Conditional Aggregation
Bazı durumlarda aynı tablo üzerinde farklı koşullar için conditional aggregation kullanmak daha performanslı olabilir.
SELECT
COUNT(*) AS phoneNumbersFetched,
COUNT(*) FILTER (WHERE line_info != '-1')
AS phoneNumbersAvailable,
COUNT(*) FILTER (WHERE line_info = '-1')
AS phoneNumbersNotAvailable
FROM phone_number_details;
Bu yöntem özellikle PostgreSQL'de daha performanslıdır çünkü aynı tablo sadece bir kez taranır.
Performans Açısından Dikkat Edilmesi Gerekenler
- Subquery sayısını gereksiz artırmamaya dikkat edin
- Büyük tablolarda index kullanımı performansı artırır
- Aynı tabloyu birden fazla kez taramak yerine aggregation kullanın
- Raporlama sorgularında materialized view tercih edilebilir
Sonuç
Bu yazıda PostgreSQL multiple SELECT queries kullanarak birden fazla SELECT sorgusunun tek bir sorguda nasıl birleştirileceğini öğrendik.
Subquery ve aggregation teknikleri sayesinde farklı tablolardan gelen verileri tek bir sonuç satırında toplamak mümkündür.
Bu yaklaşım özellikle dashboard raporları, analytics sistemleri ve backend API performansı için oldukça faydalıdır.