distinct() Fonksiyonu Nedir, Ne İşe Yarar ve Nasıl Kullanılır?

"distinct() Fonksiyonu Nedir, Ne İşe Yarar ve Nasıl Kullanılır?"

 

Veritabanlarında çalışırken, bazen bir sütun içerisinde tekrar eden verilerden kurtulup sadece benzersiz kayıtları çekmemiz gerekebilir. Bu gibi durumlarda, SQL'de ve bazı programlama dillerinin veritabanı sorgu yapılarında yer alan distinct() fonksiyonu devreye girer. PHP’nin popüler framework’ü Laravel'de de distinct() fonksiyonu veri sorgularını optimize etmek ve tekrarlanan kayıtları filtrelemek için sıkça kullanılır.

Bu makalede, distinct() fonksiyonunun ne olduğu, ne işe yaradığı ve nasıl kullanılacağı hakkında ayrıntılı bilgi verilecektir.


distinct() Fonksiyonu Nedir?

distinct(), veritabanından sorgu yaparken belirli bir sütunda tekrarlayan kayıtları ortadan kaldırarak yalnızca benzersiz (distinct) değerleri döndürmek için kullanılan bir fonksiyondur. Tekrarlanan veriler, örneğin kullanıcı adları, şehir adları veya herhangi bir kategori listesi gibi tekrarlanabilir veriler içeren sütunlar üzerinde çalışırken kullanışlıdır.

Bu fonksiyon genellikle SQL dilinde kullanıldığı gibi, birçok modern ORM (Object-Relational Mapping) sistemlerinde ve frameworklerde de yerleşik olarak bulunur. Laravel de bu fonksiyonu kullanabilmenizi sağlar.

SQL'deki Kullanımı:

SELECT DISTINCT column_name FROM table_name;

Laravel'deki Kullanımı:

Model::select('column_name')->distinct()->get();

distinct() Fonksiyonu Ne İşe Yarar?

  • Tekrarlayan Verileri Kaldırır: Bir veri tablosunda tekrarlayan veriler varsa, distinct() fonksiyonu bu verilerin yalnızca bir kez görünmesini sağlar.
  • Veritabanı Performansını İyileştirir: Veritabanından çekilen veri miktarını azaltarak daha hızlı ve daha verimli sorgular yazmanıza olanak tanır.
  • Analiz ve Raporlama Kolaylığı: Özellikle raporlama yaparken belirli bir veri kümesi üzerinde benzersiz değerleri almak ve tekrarlayanları filtrelemek için kullanılır.

distinct() Fonksiyonunun Kullanımı

distinct() fonksiyonunun farklı kullanım senaryolarını anlamak için birkaç örnek inceleyelim.

Örnek 1: SQL’de DISTINCT Kullanımı

Bir veri tablosunda "city" (şehir) sütunu üzerinden benzersiz şehir isimlerini çekmek istiyoruz. Eğer tekrarlanan şehir isimleri varsa, bunlar sadece bir kez gösterilecektir.

SELECT DISTINCT city FROM customers;

Bu sorgu, customers tablosundan sadece benzersiz şehir isimlerini döndürecektir.

Örnek 2: Laravel’de distinct() Kullanımı

Laravel'de distinct() fonksiyonu, sorgularda tekrar eden verileri filtrelemek için kullanılır. Örneğin, benzersiz şehir isimlerini almak için şu şekilde bir sorgu yapılabilir:

$distinctCities = DB::table('customers')
    ->select('city')
    ->distinct()
    ->get();

Bu kod, customers tablosundan benzersiz şehir isimlerini döndürür.

Örnek 3: Birden Fazla Sütunla Kullanımı

Bazen birden fazla sütun üzerinde benzersiz verileri çekmek gerekebilir. SQL dilinde ve Laravel’de bunu başarmak oldukça kolaydır. Örneğin, city ve state (eyalet) sütunlarının birleşimi üzerinden benzersiz sonuçlar çekmek için:

SQL:
SELECT DISTINCT city, state FROM customers;
Laravel:
$distinctCityState = DB::table('customers')
    ->select('city', 'state')
    ->distinct()
    ->get();

Bu sorgu, hem city hem de state sütunlarına bakarak her bir şehir-eyalet çiftini sadece bir kez döndürür.

Örnek 4: Eloquent ile Kullanımı

Laravel'in Eloquent ORM'i ile model bazında distinct() kullanımı da oldukça basittir. Örneğin, User modelinden benzersiz email adreslerini çekmek için şu şekilde bir sorgu yazabilirsiniz:

$distinctEmails = User::select('email')->distinct()->get();

Bu sorgu, users tablosundaki tüm email sütunundaki benzersiz kayıtları döndürecektir.


distinct() ile İlgili Dikkat Edilmesi Gerekenler

  • Sadece Değerleri Karşılaştırır: distinct() sadece belirli bir sütundaki değerlerin benzersiz olup olmadığını kontrol eder. Eğer birden fazla sütun için benzersiz sonuçlar almak istiyorsanız, birden fazla sütunu seçmelisiniz.

    Örneğin, sadece city sütununa distinct() uygularsanız, aynı şehirdeki farklı kişilerin bilgileri dışarıda bırakılabilir. Fakat, hem city hem de state sütunlarına distinct() uygularsanız, her bir şehir-eyalet çiftini benzersiz olarak döndürebilirsiniz.

  • Performans: distinct() kullanımı, büyük veri setlerinde doğru kullanıldığında performansı iyileştirebilir. Ancak yanlış veya gereksiz kullanıldığında sorguların performansını olumsuz etkileyebilir. Örneğin, gereksiz yere distinct() kullanmak veritabanı işlem yükünü artırabilir.

  • Gruplama ile Karışıklık: distinct() ile group by sorguları karıştırılmamalıdır. group by, belirli bir kritere göre verileri gruplar ve genellikle toplama işlemleri ile kullanılırken, distinct() sadece tekrarlanan verileri filtrelemek için kullanılır.


distinct() ve group by Karşılaştırması

distinct() ve group by her ikisi de benzersiz kayıtlar elde etmenizi sağlar. Ancak işlevsellik açısından farklıdırlar:

  • distinct(): Sadece benzersiz satırları döndürür.
  • group by: Belirli bir kritere göre verileri gruplar ve genellikle COUNT(), SUM(), AVG() gibi toplama fonksiyonlarıyla birlikte kullanılır.

Örnek: group by Kullanımı

$groupedData = DB::table('customers')
    ->select('city', DB::raw('COUNT(*) as total_customers'))
    ->groupBy('city')
    ->get();

Bu sorgu, her şehirde kaç müşterinin bulunduğunu hesaplar.


Gerçek Hayattan Bir Kullanım Örneği

Bir e-ticaret uygulamasında, kullanıcıların satın aldığı ürünlerin kategorilerine göre benzersiz bir liste çekmek isteyebilirsiniz. Örneğin, bir kullanıcı birden fazla kategoriden ürün almış olabilir, fakat her kategoriyi sadece bir kez göstermek isteyebilirsiniz.

$categories = DB::table('purchases')
    ->select('category')
    ->where('user_id', $userId)
    ->distinct()
    ->get();

Bu sorgu, belirli bir kullanıcının satın aldığı benzersiz kategorileri döndürecektir.

distinct() fonksiyonu, veritabanı sorgularında tekrarlayan verileri ortadan kaldırmak için oldukça faydalı bir araçtır. Özellikle büyük veri setlerinde benzersiz verileri elde etmek, raporlama ve analiz işlemlerinde bu fonksiyon sayesinde daha etkin sonuçlar elde edebilirsiniz. Laravel’de ve SQL’de bu fonksiyonun doğru ve verimli kullanımı, uygulamanızın performansını artırabilir.

Aykhan Gasimzade Aykhan Gasimzade verified icon
Full Stack Developer

Merhaba! Ben Aykhan, 1999 doğumlu bir Azerbaycanlıyım ve 2017 yılından bu yana programlamayla ilgileniyorum. Teknolojinin büyülü dünyası beni her zaman etkilemiştir ve bu merakımı kendi blogumda paylaşarak daha geniş bir kitleyle buluşturmayı amaçlıyorum.