Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

SQL "column does not exist" Hatası Nasıl Çözülür?

sql-column-does-not-exist-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. “column does not exist” hatası ne anlama gelir?
  2. Hata mesajından şema ve sütun kontrolüne nasıl ilerlenir?
  3. Alias, SELECT takma adı ve JOIN kapsamı nasıl ayrılır?
  4. Alt sorgularda dış ve iç sütun kapsamı nasıl denetlenir?
  5. Reserved word, harf duyarlılığı ve tırnak kullanımı neden lehçeye bağlıdır?
  6. Beş maddelik hızlı kontrol listesiyle teşhisi tamamlayın
  7. Sık Sorulan Sorular

Kısa cevap: SQL "column does not exist" hatası, veri tabanının sorguda yazdığın sütun adını ilgili sorgu bloğunda görünür olan tablo, görünüm veya takma ad içinde bulamadığını gösterir. İlk olarak gerçek şemayı, FROM ve JOIN bölümündeki tabloyu, sütun adının yazımını ve kullandığın alias’ı kontrol etmelisin.

“column does not exist” hatası ne anlama gelir?

Bu hata, sütunun değerinden değil, sütun adının çözümlenememesinden kaynaklanır. Örneğin aşağıdaki sorguda email sütunu mevcutsa ancak ilgili kaydın değeri boşsa sonuçta NULL görürsün:

SELECT email
FROM customers;

Buna karşılık sütunun gerçek adı email_address olduğu hâlde email yazarsan veri tabanı sütunun hangi nesneye ait olduğunu bulamaz ve "column does not exist" benzeri bir hata üretir. Yani sorun, satırdaki değerin boş olması değil; sorgunun istediği adın mevcut sorgu kapsamında bulunmamasıdır.

İlk teşhiste şu dört noktayı sırayla karşılaştır: Hata mesajında geçen sütun adını karakter karakter incele, sorguda gerçekten doğru tablo veya görünümün kullanıldığını doğrula, tabloya ait şemayı kontrol et ve alias kullanıyorsan sütun başvurularını bu alias’a göre yaz. Benzer görünen tablo adları, çoğul-tekil farkları ve bir alt çizgi karakterinin eksikliği bu hatayı sıkça tetikler.

Hata mesajından şema ve sütun kontrolüne nasıl ilerlenir?

Hata mesajından şema ve sütun kontrolüne nasıl ilerlenir?

Önce hatadaki adı doğrudan tablo tanımıyla karşılaştır. Örneğin users tablosunda user_name bulunuyor, fakat sorguda username yazılıyorsa sorun bir yazım farkıdır. Tabloyu da doğrula: Sorgu yanlışlıkla user_profiles tablosuna bağlanmış olabilir. Sütun temel tabloda bulunmasına rağmen kullanılan görünümün dışarı açtığı sütunlar arasında yer almıyorsa, görünüm üzerinden yapılan sorguda yine bulunamaz.

Şemayı ve sütun listesini kullandığın veri tabanının arayüzünden inceleyebilirsin. Alternatif olarak, sistem destekliyorsa INFORMATION_SCHEMA.COLUMNS üzerinden benzer bir keşif sorgusu kullanılabilir:

SELECT table_schema, table_name, column_name
FROM information_schema.columns
WHERE table_schema = 'public'
  AND table_name = 'customers'
  AND column_name = 'email';

Bu sorgunun tablo adları, şema alanları, yetki görünürlüğü ve sözdizimi veri tabanına göre değişebilir; bazı sistemlerde ürünün kendi sistem kataloğu tercih edilir. Resmî belgelerde INFORMATION_SCHEMA veya sistem kataloglarıyla tablo ve görünüm sütunlarının incelenebildiği, ancak yalnızca kullanıcının erişebildiği nesnelerin görünebileceği belirtilir. Şema ve sorgu teşhisiyle ilgili uygulamalı veri tabanı yazıları da bu kontrol alışkanlığını geliştirmene yardımcı olabilir.

Alias, SELECT takma adı ve JOIN kapsamı nasıl ayrılır?

Tablo alias’ı, FROM içinde tanımlanan tabloya verilen geçici addır. FROM customers AS c yazıldığında bu sorgu kapsamında tabloya customers yerine c ile erişilir. SELECT içinde üretilen alias ise sonuç sütununu adlandırır; aynı sorgunun WHERE bölümünde genellikle henüz görünür değildir. Aşağıdaki kapsam modeli PostgreSQL belgelerindeki davranış esas alınarak gösterilmiştir.

-- Hatalı
SELECT c.name, o.order_number
FROM customers AS c
JOIN orders AS o
  ON customers.id = o.customer_id;

-- Düzeltilmiş
SELECT c.name, o.order_number
FROM customers AS c
JOIN orders AS o
  ON c.id = o.customer_id;

İlk sorguda customers özgün adı yerine c alias’ı kullanıldığı için JOIN koşulundaki customers.id hatalıdır. Örneğin customers içinde 1 numaralı Ada ve 2 numaralı Bora, orders içinde de bu müşterilere bağlı S-1001 ve S-1002 siparişleri varsa düzeltilmiş sorgu, müşteri adı ve sipariş numarasını Ada: S-1001 ve Bora: S-1002 biçiminde döndürür.

Aynı karışıklık hesaplanan sütunlarda da görülür. price * quantity AS total ifadesi total adında bir sonuç sütunu üretir; fakat bu alias aynı sorgunun WHERE koşulunda doğrudan kullanılamaz. İfadeyi yeniden yazabilir veya hesabı dış sorguya taşıyabilirsin.

-- Hatalı
SELECT price * quantity AS total
FROM order_items
WHERE total > 100;

-- Düzeltilmiş
SELECT price * quantity AS total
FROM order_items
WHERE price * quantity > 100;
SELECT *
FROM (
  SELECT price * quantity AS total
  FROM order_items
) AS q
WHERE q.total > 100;

Her iki düzeltmede de yalnızca hesaplanan total değeri 100’ün üzerinde olan satırlar sonuç kümesine alınır.

Alt sorgularda dış ve iç sütun kapsamı nasıl denetlenir?

Alt sorgularda dış ve iç sütun kapsamı nasıl denetlenir?

EXISTS içindeki alt sorgu, dış sorguda tanımlanan c alias’ına başvurabilir. Buna karşılık alt sorguda tanımlanan o alias’ı dış sorguda kendiliğinden görünmez. Ayrıca o tanımlandığında, iç sorguda özgün orders adı yerine o kullanılmalıdır.

-- Hatalı
SELECT c.customer_id
FROM customers AS c
WHERE EXISTS (
  SELECT 1
  FROM orders AS o
  WHERE c.customer_id = o.customer_id
    AND orders.status = 'paid'
);

-- Düzeltilmiş
SELECT c.customer_id
FROM customers AS c
WHERE EXISTS (
  SELECT 1
  FROM orders AS o
  WHERE c.customer_id = o.customer_id
    AND o.status = 'paid'
);

Örneğin 1 ve 3 numaralı müşterilerin en az birer paid siparişi, 2 numaralı müşterinin ise yalnızca başka durumdaki siparişleri varsa düzeltilmiş sorgu 1 ve 3 değerlerini döndürür. EXISTS için alt sorgunun bir satır bulması yeterlidir; dış sorgudan gelen c.customer_id ise korelasyonlu dış referanstır.

FROM içindeki alt sorgu, dış sorguya geçici bir tablo gibi görünür. Ancak dış sorgu yalnızca alt sorgunun SELECT listesinde dışarı aktarılan sütunları kullanabilir. PostgreSQL belgeleri derived table için alias kullanımını ve alt sorgu çıktısının sanal tablo olarak ele alınmasını açıklar.

-- q.status dışarı aktarılmadı
SELECT q.customer_id, q.status
FROM (
  SELECT customer_id
  FROM orders
) AS q;

-- q.status dışarı aktarıldı
SELECT q.customer_id, q.status
FROM (
  SELECT customer_id, status
  FROM orders
) AS q;
  • Dış referans: Alt sorgu içinden okunabilen c.customer_id.
  • İç referans: Yalnızca alt sorguda tanımlı olan o.status.
  • Alt sorgu çıktısı: Dış sorgunun görebileceği ve q ile erişebileceği sütunlar.

Reserved word, harf duyarlılığı ve tırnak kullanımı neden lehçeye bağlıdır?

Sütun adı tabloda gerçekten bulunsa bile veri tabanı, sorgudaki ifadeyi aynı ad olarak yorumlamıyorsa column does not exist hatası alabilirsin. Bunun nedeni ayrılmış kelime kullanımı, büyük-küçük harf farkı veya yanlış tanımlayıcı sınırlayıcısı olabilir.

order gibi adlar bazı veri tabanlarında özel anlam taşıyabilir; ancak bunu bütün sistemler için geçerli bir kural kabul etme. Kullandığın veri tabanının ayrılmış kelimeler ve anahtar sözcükler listesinden sütun adını kontrol et. PostgreSQL, MySQL ve SQL Server bu listeleri ve tanımlayıcı kurallarını aynı şekilde uygulamaz.

-- PostgreSQL: çift tırnaklı tanımlayıcı
SELECT "order" FROM sales;

-- MySQL: ters tırnaklı tanımlayıcı
SELECT `order` FROM sales;

-- SQL Server: köşeli parantezli tanımlayıcı
SELECT [order] FROM sales;

Bu sınırlayıcılar birbirinin genel amaçlı alternatifi değildir. Örneğin PostgreSQL, tırnaklanmamış adları küçük harfe dönüştürürken çift tırnak içindeki adın harf biçimini korur. MySQL’de tanımlayıcılar için ters tırnak kullanılır; çift tırnağın anlamı SQL modu gibi ayarlara göre değişebilir. SQL Server’da köşeli parantezler tanımlayıcılar için kullanılabilir; çift tırnak davranışı ise QUOTED_IDENTIFIER ayarına bağlıdır.

Tek tırnak ise sütun adı yazmak için değil, metin değeri yazmak için kullanılır. Bu nedenle SELECT 'order' FROM sales ifadesi, sütunu çağırmak yerine sabit bir metin döndürebilir. Yeni şema tasarlarken anahtar sözcüklerle çakışmayan ve tutarlı adlar seç; mevcut şemada ise sütun adını veri tabanının kabul ettiği harf ve tırnak biçimiyle birebir kullan.

Beş maddelik hızlı kontrol listesiyle teşhisi tamamlayın

Rastgele tırnak veya alias değişiklikleri yapmak yerine hatayı beş ayrı sınıfa ayırarak ilerle:

  1. Yazımı karşılaştır: Hata mesajındaki sütun adını sorgudaki ifadeyle birebir karşılaştır; alt çizgi, boşluk, çoğul ek ve benzer karakterleri kontrol et. Doğruysa ikinci adıma geç; farklıysa yazımı gerçek sütun adına göre düzelt.
  2. Şemayı doğrula: FROM ve JOIN bölümündeki doğru şema, tablo veya görünümü ve bu nesnenin gerçek sütun listesini kontrol et. Doğru nesneyi gösteriyorsa üçüncü adıma geç; göstermiyorsa tablo adını ya da şema nitelemesini düzelt.
  3. Alias’ları eşleştir: Her tablo alias’ını tanımlandığı adla karşılaştır ve sütun referanslarını buna göre yaz. Eşleşiyorsa dördüncü adıma geç; eşleşmiyorsa eski tablo adını veya yanlış alias’ı sorgudan çıkar.
  4. Kapsamı denetle: SELECT alias’ının, JOIN koşulunun ve alt sorgu çıktısının kullanıldığı sorgu katmanında gerçekten görünür olup olmadığını kontrol et. Görünürse beşinci adıma geç; görünmüyorsa ifadeyi doğru katmana taşı veya alt sorgudan açıkça dışarı aktar. SELECT alias’larının WHERE içinde kullanılamaması bu kapsam farkına örnektir.
  5. Lehçeyi doğrula ve küçült: Ayrılmış kelime, harf duyarlılığı ve tırnak davranışını kullandığın veri tabanının resmî belgelerinden kontrol et. Sorguyu yalnızca ilgili tablo ve sütunları içeren küçük bir örneğe indir; çalışırsa JOIN, koşul ve alt sorgu parçalarını tek tek geri ekle. Çalışmıyorsa son eklediğin adlandırma veya sözdizimi kuralını düzelt.

Bu yaklaşım, sorgu çözümündeki adım adım düşünme becerisini geliştirmek için algoritmik düşünme içerikli bilgi testleri ile de desteklenebilir.

Sık Sorulan Sorular

Sütun tabloda gerçekten bulunduğu hâlde neden “column does not exist” hatası alınır?

Sorgu yanlış şema, tablo veya görünümü kullanıyor olabilir; ayrıca alias, harf duyarlılığı, tırnak biçimi ya da alt sorgu kapsamı sütunun çözümlenmesini engelleyebilir.

SELECT içinde verdiğim alias’ı WHERE koşulunda neden kullanamıyorum?

SELECT alias’ı çıktı sütununa sorgu bloğunun ilerleyen aşamasında verilir; WHERE koşulu bu değer oluşturulmadan önce çalıştığı için alias yerine gerçek ifadeyi yazman veya sorguyu bir alt sorguya taşıman gerekir.

JOIN yazarken tablo adını mı yoksa tanımlanan alias’ı mı kullanmalıyım?

Tabloya alias verdiysen aynı sorgu bloğunda tablo ve sütun referanslarını bu alias ile kullanmalısın; alias vermediysen tablo adını kullanabilirsin. Alias ile tablo adını karıştırmak sütun bulunamadı hatasına yol açabilir.

Alt sorguda dış sorgunun sütunlarına nasıl erişilir?

Dış tabloya bir alias verip alt sorguda bu alias’ı nitelikli biçimde kullanabilirsin; örneğin dış sorgudaki o.id ifadesi korelasyonlu alt sorguda erişilebilir. İç sorgunun kendi tablolarındaki aynı adlarla karışıklık yaşamamak için alias kullanmak daha güvenlidir.

Tırnak ve büyük-küçük harf kullanımı “column does not exist” hatasını nasıl etkiler?

Yanlış tırnak türü sütun adını metin değeri gibi yorumlatabilir; tırnaklı tanımlayıcılar da bazı sistemlerde harf biçimine duyarlı hâle gelir. Bu nedenle sütun adını, kullanılan veri tabanının tanımlayıcı kurallarına uygun biçimde yazmalısın.

Doğru teşhis, hatayı tek bir yazım problemi olarak değil; ad, şema, alias, kapsam ve lehçe başlıklarıyla ayrı ayrı incelemekle başlar.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara