SQL ile Veri Temizleme: Boşluk, Yazım Tutarsızlığı ve Tip Hataları
Beceri rehberi

SQL ile Veri Temizleme: Boşluk, Yazım Tutarsızlığı ve Tip Hataları

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 7 dk okuma

SQL'de TRIM, CAST, NULLIF ve CASE ile boşlukları, tutarsız yazımları, tip dönüşümlerini ve eksik değerleri temizlemeyi güvenli bir akışla öğrenin.

Veri temizleme neden SQL'de yapılır?

Ham veri nadiren analize hazır gelir. Formdan, dosyadan ya da farklı sistemlerden gelen kayıtlarda fazladan boşluklar, büyük küçük harf tutarsızlıkları, metin olarak saklanan sayılar ve tarihler, aynı müşterinin farklı yazımları ve eksik değerler bulunur. Bu sorunlar temizlenmeden yapılan analiz, yanlış toplamlar, kaçan birleştirmeler ve tekrarlı müşteriler üretir.

SQL'de temizlik yapmanın avantajı, işlemin veriye yakın, tekrarlanabilir ve belgelenebilir olmasıdır. Aynı temizleme sorgusu her gün yeni gelen veriye uygulanabilir; Excel'deki elle düzeltme ise bir sonraki dosyada baştan yapılır. Kaynağa dokunmadan temiz bir görünüm (VIEW) ya da ayrı bir temiz tablo üretmek, orijinal veriyi korur.

Temizleme sırası şudur: önce sorunu ölç (kaç kayıt, hangi alan), sonra düzeltmeyi bir SELECT olarak yaz ve sonucu gözle kontrol et, en sonda güncelleme ya da yeni tablo yazımını yap. Kaynak veri üzerinde doğrudan UPDATE yapmak, yedeksiz ve doğrulamasız yapıldığında geri dönüşsüz hasar bırakır.

Boşluk ve harf tutarsızlıklarını temizlemek

En yaygın sorun, görünmeyen boşluklardır: "Ankara" ile "Ankara " aynı görünür ama eşit değildir. Bu yüzden gruplamada ayrı değerler olarak çıkar ve JOIN'de eşleşmez. Çözüm TRIM ile baştaki ve sondaki boşlukları kırpmaktır:

SELECT TRIM(sehir) AS sehir_temiz FROM customers;

Bazı veritabanlarında TRIM yalnızca boşluk karakterini keser; sekme ya da satır sonu karakterlerini kesmez. SQL Server'da LTRIM ve RTRIM ayrı çalışır ve yalnızca normal boşluğu siler. Dosyadan ya da web'den gelen verilerde kırılmaz boşluk karakteri de sık görülür; bunu REPLACE ile kendi karakter koduyla ayrıca temizlemek gerekir. Kod ve fonksiyon adları ürüne göre değiştiği için kendi sisteminizin belgesine bakın.

Harf tutarsızlığı için tek bir biçime getirme yapılır: UPPER, LOWER ya da ilk harfi büyütme. Türkçe veride dikkat gerekir: noktalı ve noktasız i harfleri, büyük küçük harf dönüşümünde veritabanının harmanlama (collation) ayarına bağlı olarak beklenmedik sonuç verebilir. "İSTANBUL" ile "istanbul" eşleşmiyorsa sorun sıklıkla harmanlama ayarındadır, veri değil.

Birleşik temizleme kalıbı: LOWER(TRIM(eposta)). E-posta, kullanıcı adı ve kod sütunlarında bu kalıp, eşleştirme ve tekilleştirme için sağlam bir anahtar üretir.

Tutarsız yazımları standartlaştırmak

Aynı değerin farklı yazımları, gruplamada parçalanmaya yol açar: "İstanbul", "istanbul", "Istanbul", "İST". Düzeltmeyi yapmak için REPLACE ya da CASE kullanılır. Birkaç değişken varsa CASE okunaklı olur:

SELECT CASE WHEN LOWER(TRIM(sehir)) IN ('istanbul', 'ist') THEN 'İstanbul' WHEN LOWER(TRIM(sehir)) = 'ankara' THEN 'Ankara' ELSE TRIM(sehir) END AS sehir_standart FROM customers;

Değişken sayısı fazlaysa kodun içine gömmek yerine eşleme tablosu kurulur: bir sütunda ham yazım, diğerinde standart karşılık. Ham tablo bu tabloyla birleştirilir; yeni bir yazım çıktığında sorgu değil, eşleme tablosu güncellenir. Bu yaklaşım hem bakımı kolaylaştırır hem iş birimi tarafından denetlenebilir.

Aranacak değerleri bulmak için tekil değerleri sayın: SELECT sehir, COUNT(*) FROM customers GROUP BY sehir ORDER BY sehir. Alfabetik sıra, benzer yazımları yan yana getirir ve standartlaştırılacak grupları gösterir. Metin fonksiyonlarının tamamı için SQL metin fonksiyonları sayfası bu aşamada kullanışlıdır.

Karmaşık yazım hatalarında (örneğin ad soyad benzerliği) SQL tek başına yetmeyebilir; bulanık eşleştirme için veritabanının özel eklentileri ya da dış araçlar gerekir. Kuralı kesin olmayan eşleşmeleri otomatik birleştirmek yerine incelemeye aday olarak işaretlemek daha güvenlidir.

Tip dönüşümü: metni sayıya ve tarihe çevirmek

Dosyadan içe aktarılan veride sayı ve tarihler sıklıkla metin sütununda gelir. Metin olarak saklanan bir sayıyla toplama, sıralama ve karşılaştırma yanlış çalışır: metin sıralamasında çok basamaklı bir sayı, tek basamaklı bir sayıdan önce gelebilir. Çözüm, CAST ile doğru tipe dönüştürmektir:

SELECT CAST(tutar_metin AS DECIMAL) AS tutar FROM ham_satislar;

Gerçek dosyalarda bazı satırlar dönüştürülemeyen değer içerir: boş metin, "yok", "-", para birimi simgesi, binlik ayracı. CAST böyle bir değerde sorguyu hatayla durdurur. SQL Server'da TRY_CAST ve TRY_CONVERT hata yerine NULL döndürür; PostgreSQL ve MySQL'de hata önleme için önce bir koşulla geçerli satırları ayırmak ya da metni temizleyip dönüştürmek gerekir. Dönüşemeyen satırları NULL yapmak sorunu gizler; bu satırları ayrı bir sorguyla listeleyip kaynağını incelemek temizliğin parçasıdır.

Ondalık ayracı ve binlik ayracı farkları, Türkçe veride sık görülen bir tuzaktır: virgülle yazılmış ondalık sayı bazı sistemlerde sayıya çevrilemez. Dönüşümden önce REPLACE ile ayraçları sisteminizin beklediği biçime getirin.

Tarihlerde aynı sorun yazım biçimidir: gün ay yıl sırası mı, ay gün yıl sırası mı? Belirsiz tarih metnini dönüştürmeden önce biçimi veri sahibine doğrulatın; yanlış varsayım sessizce yanlış tarih üretir. Tarih işlemlerinin ayrıntısı için SQL tarih fonksiyonları sayfası ilgilidir.

Eksik değerleri ele almak

Eksik veri farklı biçimlerde görünür: NULL, boş metin ve "bilinmiyor", "yok", "-" gibi yer tutucu metinler. Bunlar farklı davranır ve analizde farklı etkilenir. NULL, toplulaştırmalarda yok sayılır; boş metin ise bir değerdir ve sayıma girer. Önce hangisinin bulunduğunu saptayın.

NULLIF ile yer tutucu metni gerçek NULL'a çevirmek tutarlı bir ilk adımdır:

SELECT NULLIF(TRIM(telefon), '') AS telefon_temiz FROM customers;

Boş metin NULL olur; böylece bütün eksik değerler tek biçimde temsil edilir. Sonra NULL'ın ne yapılacağına karar verilir: olduğu gibi bırakmak, varsayılan değerle doldurmak (COALESCE) ya da satırı elemek. Doldurma yalnızca iş anlamı açıksa yapılmalıdır: eksik tutarı sıfır saymak toplamı etkilemez ama ortalamayı çarpıtır; eksik tarihe bugünün tarihini yazmak ise kayıt zamanını bozar.

Eksikliğin ölçüsünü almak için koşullu sayım kullanılır: COUNT(*) toplam satırı, COUNT(sutun) ise dolu değerleri sayar; aradaki fark eksik sayısını verir. Her sütun için bu karşılaştırma, veri kalitesi özeti sunar. NULL yönetiminin ayrıntıları için SQL NULL değerleri sayfası ilgilidir.

Tekrarlı kayıtlar ve geçerlilik kontrolü

Temizliğin bir diğer adımı yinelenen kayıtları bulmaktır. Aynı e-posta ya da kimlikle birden çok satır varsa, hangisinin korunacağına karar verilmelidir. Bu iş genellikle ROW_NUMBER ile bölümlenip numaralandırılarak yapılır; ayrıntı için tekrar eden kayıtlar sayfası ve ROW_NUMBER sayfası kullanılır. Önce LOWER(TRIM(eposta)) gibi bir temiz anahtar üretilmesi, yinelenenleri doğru yakalar; çünkü ham e-postalar aynı kişiyi farklı yazmış olabilir.

Değer geçerlilik kontrolleri de temizliğe dahildir: negatif olmaması gereken tutar, gelecekte olamayacak doğum tarihi, biçimi bozuk e-posta ya da telefon. Bu kontroller CASE ile işaretlenip bir "hatalı" sütunu üretilir ve kaç kaydın etkilendiği sayılır. Geçersiz kayıtları silmek yerine ayrı bir tabloya taşımak ya da bayrak ile işaretlemek, kaynağı korur.

Tablo tasarımında kısıtlar (CHECK, UNIQUE) temizliğin kalıcı çözümüdür: sorunlu veri girişini baştan engeller. Temizlik sorgusu mevcut kirliliği giderir, kısıt ise tekrarını önler.

Güvenli temizleme akışı ve sık yapılan hatalar

Temizlik yaparken izlenecek güvenli akış:

  • Önce kaç kaydın ve hangi alanların etkileneceğini SELECT ile ölçün
  • Düzeltmeyi bir SELECT olarak yazıp önce ve sonra değerlerini yan yana inceleyin
  • Kaynağı yedekleyin ya da temizliği yeni bir tabloda, VIEW olarak yapın
  • Güncelleme gerekiyorsa transaction içinde çalıştırın ve etkilenen satır sayısını kontrol edin
  • Temizlik sorgusunu saklayın; aynı kurallar yeni veriye de uygulanır

Sık yapılan hatalar:

  • Doğrulamadan UPDATE çalıştırmak ve geri dönüş yolu bırakmamak
  • Hataları sessizce NULL yapıp sorunu gizlemek
  • Harmanlama ve harf dönüşümü sorunlarını fark etmemek
  • Tüm sorunları tek sorguda çözmeye çalışıp okunmaz kod üretmek; aşamalı CTE ile adım adım ilerlemek daha izlenebilirdir
  • Temizlenmiş sütunu ham sütunla aynı adla yazıp kaynağı kaybetmek

Güvenli güncelleme için SQL UPDATE ve DELETE sayfası, transaction için SQL transaction yönetimi sayfası ilgilidir.

Mindset programlarında bu beceri nerede çalışılır?

Veri temizleme; veri analisti, raporlama uzmanı ve veri mühendisinin işinin önemli kısmıdır. Mindset'in SQL ile İleri Veri Dönüşümü ve Modelleme programı pencere fonksiyonları, ortak tablo ifadeleri, boyut modelleme desenleri, olgu tabloları, artımlı dönüşüm ve birleştirme gibi dönüşüm odaklı başlıkları içerir. SQL ile Veri Sorgulama (İleri) programı ise alt sorgu, görünüm ve ileri vaka çalışmalarıyla temizleme sorgularının üzerine kurulduğu araçları sunar.

Programlar, SQL'in temelini bilen ve veriyi analize hazırlama sorumluluğu olan ekipler için uygundur. Kurumsal ekiplerde farklı sistemlerden gelen müşteri ya da sipariş verisini birleştirmeye çalışan çalışanlar, kendi kirli veri örnekleri üzerinden çalışabilir. Kapsam ayrıntısı program sayfalarında yer alır.

İlgili Mindset programı

SQL ile İleri Veri Dönüşümü ve Modelleme

Sık sorulanlar

Sık sorulan sorular

SQL'de boşlukları nasıl temizlerim?

TRIM fonksiyonu baştaki ve sondaki boşlukları keser. Bazı veritabanlarında yalnızca normal boşluğu temizlediği için sekme, satır sonu ve kırılmaz boşluk karakterleri için REPLACE gerekir. E-posta gibi anahtar sütunlarda LOWER(TRIM(sutun)) kalıbı tutarlı bir temiz değer üretir.

Metin olarak saklanan sayıyı nasıl sayıya çeviririm?

CAST ile hedef tipe çevirirsiniz. Ancak sütunda dönüştürülemeyen bir değer varsa sorgu hatayla durabilir. SQL Server'da TRY_CAST hata yerine NULL döndürür. Her durumda dönüşemeyen satırları ayrıca listeleyip kaynağını inceleyin; NULL yapıp geçmek sorunu gizler.

Boş metin ile NULL arasındaki fark nedir?

NULL bilinmeyen ya da yok değeri temsil eder ve toplulaştırmalarda yok sayılır. Boş metin ise uzunluğu sıfır olan gerçek bir değerdir ve sayıma girer. NULLIF(TRIM(sutun), '') ifadesi boş metni NULL'a çevirerek eksik değerleri tek biçime getirir.

Tutarsız yazılmış şehir adlarını nasıl birleştiririm?

Önce GROUP BY ile tekil değerleri listeleyin; alfabetik sıra benzer yazımları yan yana getirir. Az sayıda değişim için CASE yazın, çok sayıda değişim için ham yazım ve standart karşılığı içeren bir eşleme tablosu kurup birleştirin. Eşleme tablosu bakım ve denetim açısından daha kolaydır.

Veri temizliğini doğrudan UPDATE ile yapmak güvenli mi?

Önlem almadan değil. Kaynağı yedeklemeden, SELECT ile doğrulamadan ve transaction içinde çalıştırmadan yapılan UPDATE geri dönüşsüz hasar bırakabilir. Daha güvenli yol temiz sonucu ayrı bir tabloda ya da VIEW olarak üretmek, kaynağı olduğu gibi korumaktır.

SQL ile Veri Temizleme: Boşluk, Tip, Tutarsız Kayıt