İçeriğe geç

Menü

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

SQL "You have an error in your SQL syntax" Hatası Nasıl Çözülür?

sql-you-have-an-error-in-your-sql-syntax-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. Hata mesajı ne söylüyor ve near bölümü nasıl okunur?
  2. Yedi adımda sözdizimi hatası kontrol listesi
  3. Bozuk bir SELECT sorgusunu aşama aşama düzeltmek
  4. INSERT ve JOIN sorgularında sık görülen sözdizimi hataları
  5. Uygulama kodunda sorguyu birleştirerek kuruyorsan önce yazdır
  6. Hata yapmak öğrenmenin parçası: bir sonraki adım

MySQL'de you have an error in your SQL syntax hatası, sorgunun sözdizimi kurallarına göre ayrıştırılamadığını gösterir. Çözüme mesajdaki near bölümünden başla: MySQL'in takıldığı noktayı gösterir ve asıl hata çoğu zaman bu noktanın hemen öncesindedir. Ardından sorguyu satırlara ve parçalara ayırıp tek tek çalıştırarak hatayı daralt. Bu yazıda mesajı okumayı, yedi adımlık bir kontrol listesini ve örnek bir düzeltmeyi göreceksin; hata yapmak SQL öğrenirken olağan bir adımdır.

Hata mesajı ne söylüyor ve near bölümü nasıl okunur?

Mesajın genel biçimi şöyledir. Ayrıntılı ifade sürüme ve kullandığın istemciye göre küçük farklar gösterebilir:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '...' at line N

Buradaki 1064 hata kodudur, 42000 ise sözdizimi ve erişim hatalarında görülen SQLSTATE değeridir. Mesaj üç parçadan oluşur:

  • Kılavuza bakma uyarısı: Doğru sözdizimi MySQL sürümüne göre değişebildiği için mesaj, kullandığın sürümle eşleşen MySQL Reference Manual sayfasına bakmanı söyler.
  • near sonrasındaki tırnak içi metin: Ayrıştırıcının takıldığı noktadan başlayıp sorgunun devamını gösterir.
  • at line sonrasındaki sayı: Takılma noktasının bulunduğu satırdır. Çok satırlı bir sorguda numara, sorgunun kendi ilk satırı 1 sayılarak hesaplanır; dosyandaki ya da editördeki satır numarasıyla aynı olmayabilir.

near metnini okuma örneği

Aşağıdaki sorguda SELECT listesinin sonunda fazladan bir virgül var:

SELECT ad, soyad, FROM ogrenciler;

MySQL şu mesajı verir:

ERROR 1064 (42000): You have an error in your SQL syntax; ... near 'FROM ogrenciler' at line 1

Ayrıştırıcı virgülden sonra bir sütun adı bekledi ve FROM ile karşılaştı; takıldığı yer burasıdır. Hata ise FROM'dan hemen önceki virgüldür. Yani near metni "suç mahalli" değil, "ayrıştırıcının durduğu yer" bilgisidir. Eksik virgül ya da kapanmayan tırnak gibi hataların izi çoğu zaman bu noktanın bir adım gerisindedir.

Bir de near '' durumu vardır; tırnakların içi boştur. Bu, sorgunun ayrıştırıcı hâlâ bir parça beklerken bittiği anlamına gelir. Örneğin SELECT * FROM ogrenciler WHERE sorgusunda koşul eksiktir. Böyle bir durumda sorgunun sonuna bak: eksik bir koşul, kapanmamış bir parantez ya da tırnak olabilir.

Yedi adımda sözdizimi hatası kontrol listesi

Yedi adımda sözdizimi hatası kontrol listesi

Aşağıdaki liste, hatayı en ucuz kontrolden en ayrıntılı kontrole doğru daraltmak için kurgulandı. Altıncı adımda ayrılmış sözcüklerin güncel listesi için MySQL dokümantasyonundaki Keywords and Reserved Words bölümüne bakabilirsin; liste sürümden sürüme değiştiği için buraya kopyalanmadı.

  1. near bölümünü ve satır numarasını oku. Hatayı gösterilen noktanın hemen öncesinde ara.
  2. Sorguyu biçimlendir. SELECT, FROM, WHERE, ORDER BY gibi anahtar sözcüklerde yeni satıra geç. Gerekirse sorguyu parçalara ayırıp her parçayı ayrı çalıştır.
  3. Virgülleri kontrol et. SELECT listesinde eksik virgül, FROM'dan önce fazladan virgül ve INSERT değer listesindeki virgülleri incele.
  4. Tırnakları kontrol et. Metin değerleri tek tırnak içinde olmalı, her tırnak kapanmalı. Değerin içindeki kesme işaretine dikkat et; ad gerekiyorsa ters tırnak kullanılır.
  5. Parantezleri say. Her açılan parantezin bir kapanışı olmalı.
  6. Sütun ya da tablo adının ayrılmış sözcük olup olmadığına bak. DESC ya da GROUP gibi sözcükler ad olarak kullanılırsa ters tırnak içine almak ya da adı değiştirmek gerekir.
  7. Komut sırasını ve JOIN yapısını kontrol et. Sıra SELECT, FROM, JOIN ... ON, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT biçimindedir. Her JOIN'in bir ON koşulu olup olmadığına bak.

Sıranın bir mantığı var. Önce near gibi hatanın yerini bedavaya daraltan bilgiyi kullanırsın. Sonra biçimlendirme sorguyu gözle okunur hâle getirir. Virgül, tırnak ve parantez en sık yapılan ve en kolay yakalanan yüzeysel hatalardır. Anlam bilgisi isteyen ayrılmış sözcük ve sıra kontrolü sona kalır. Her adım arama alanını küçültür; bu, büyük bir problemi parçalara bölüp adım adım ilerleme becerisinin küçük bir örneğidir. Bu beceriyi bir programlama diline bağlı kalmadan ölçmek istersen ücretsiz Algoritmik Düşünme Testi ile kendini deneyebilirsin.

Bozuk bir SELECT sorgusunu aşama aşama düzeltmek

Örnekte urunler(id, ad, desc, fiyat) tablosu var. desc sütunu ürün açıklamasını tutuyor. Tabloda dört satır bulunuyor: 1 Kalem (Mavi tükenmez kalem, 12.50), 2 Defter (96 yaprak çizgili defter, 45.00), 3 Silgi (Beyaz yumuşak silgi, 8.00) ve 4 Çanta (Su geçirmez sırt çantası, 350.00). Amaç, fiyatı 10'dan büyük ürünleri fiyata göre sıralamak.

Başlangıç sorgusu tek satırda şöyle: SELECT id, ad desc, fiyat FROM urunler ORDER BY fiyat WHERE fiyat > 10; Hataları görünür kılmak için aynı sorguyu satır satır yazalım:

SELECT id,
       ad desc,
       fiyat
FROM urunler
ORDER BY fiyat
WHERE fiyat > 10;

Üç sorun var. ad ile desc arasında virgül yok, desc ayrılmış bir sözcük (MySQL'de sıralamadaki DESC anahtar sözcüğü) ve WHERE, ORDER BY'dan sonra yazılmış. MySQL ayrıştırıcısı soldan sağa okur ve ilk tıkandığı yerde durur. Bu yüzden hataları tek seferde değil sırayla görürsün. Bir düzeltme sonrası yeni hata çıkması sorgunun kötüleştiği anlamına gelmez, ilerlediğini gösterir.

AşamaSorgu (ya da değişiklik)Beklenen sonuç
0SELECT id, ad desc, fiyat FROM urunler ORDER BY fiyat WHERE fiyat > 10;Hata 1064. Örnek near metni: desc, fiyat FROM urunler ...
1Eksik virgül eklendi: SELECT id, ad, desc, fiyat ...Yine 1064. Virgül ile desc yan yana olduğu için near metni aynı noktayı gösterir.
2desc ters tırnak içine alındı: `desc`SELECT listesi geçilir. Hata 1064, near metni örnek olarak WHERE fiyat > 10; biçiminde görünür.
3WHERE fiyat > 10, ORDER BY'dan önceye taşındıSorgu çalışır ve üç satır döner.

Near metinleri örnektir. MySQL'in gösterdiği parça sürüme, istemciye ve sorguya göre farklı görünebilir. Sabit bir metni aramak yerine her aşamada işaretlenen noktadan hemen önceki sözcüğe bak. Ters tırnak yerine sütunu aciklama diye yeniden adlandırmak da olur. Ayrılmış sözcük listesi sürüme göre değiştiği için bu, uzun vadede daha sağlam bir alışkanlık.

SELECT id, ad, `desc`, fiyat
FROM urunler
WHERE fiyat > 10
ORDER BY fiyat;

id | ad     | desc                     | fiyat
1  | Kalem  | Mavi tükenmez kalem      | 12.50
2  | Defter | 96 yaprak çizgili defter | 45.00
4  | Çanta  | Su geçirmez sırt çantası | 350.00

Silgi 8.00 olduğu için filtreye takılır. Kalan üç satır fiyata göre küçükten büyüğe sıralanır.

INSERT ve JOIN sorgularında sık görülen sözdizimi hataları

INSERT ve JOIN sorgularında sık görülen sözdizimi hataları

Bu bölümde musteriler(id, ad, sehir) ve siparisler(id, musteri_id, tutar) tabloları kullanılıyor. İlk örnek INSERT. Hatalı sürümde bir virgül eksik ve parantez kapanmıyor:

INSERT INTO musteriler (id, ad, sehir) VALUES (1 'Ayşe', 'İzmir'), (2, 'Mehmet', 'Ankara';

Her değeri ayrı satıra yazınca iki sorun da kolayca fark edilir:

INSERT INTO musteriler (id, ad, sehir)
VALUES
  (1, 'Ayşe', 'İzmir'),
  (2, 'Mehmet', 'Ankara');

Beklenen sonuç: iki satır eklendi bilgisi. Metin değerleri tek tırnak içinde yazılır. Değerin içinde de tek tırnak varsa tırnağı çiftlemelisin: 'O''Brien'.

Sütun sayısıyla değer sayısı uyuşmadığında hata türü değişir. VALUES (3, 'Elif') yazarsan MySQL 1064 yerine 1136 hata kodunu ve "Column count doesn't match value count at row 1" mesajını döndürür. Bu bir sözdizimi hatası değil, sayı uyuşmazlığıdır. Mesajın ifadesi sürüme göre küçük farklar gösterebilir. Çözüm, sütun listesi ile değer listesini aynı sayıya getirmektir.

İkinci örnek JOIN. Hatalı sürümde ON koşulu WHERE'den sonra yazılmış:

SELECT m.ad, s.tutar
FROM musteriler m
LEFT JOIN siparisler s
WHERE s.tutar > 100
ON m.id = s.musteri_id;

Düzeltilmiş hâlde her JOIN ... ON çifti ayrı satırda ve ON, WHERE'den önce:

SELECT m.ad, s.tutar
FROM musteriler m
LEFT JOIN siparisler s
  ON m.id = s.musteri_id
WHERE s.tutar > 100;

Siparişler tablosunda (1, 1, 150.00), (2, 1, 60.00) ve (3, 2, 220.00) satırları varsa sonuç Ayşe 150.00 ve Mehmet 220.00 olur. MySQL belgelerine göre JOIN, CROSS JOIN ve INNER JOIN eş anlamlıdır. Bu yüzden ON yazmayı unutursan düz JOIN hata vermeyip tüm satır çiftlerini üretebilir. LEFT JOIN ise ON ya da USING ister, eksikse sözdizimi hatası alırsın.

Takma adlar da tutarlı olmalı. FROM musteriler m yazdıktan sonra musteriler.ad kullanırsan MySQL 1064 değil 1054 (bilinmeyen sütun) hatası verir. Takma ad tanımladıysan sorgunun her yerinde onu kullan.

Uygulama kodunda sorguyu birleştirerek kuruyorsan önce yazdır

Sorguyu Python gibi bir dilde metin birleştirerek kuruyorsan, MySQL'e giden sorgu senin yazdığın şablonla aynı olmayabilir. Hata mesajındaki near bölümü, şablonun değil uygulamanın ürettiği sorgunun parçasını gösterir. Bu yüzden önce sorguyu çalıştırmadan yazdır.

Aşağıdaki örnekte kullanıcı adı f-string ile sorguya ekleniyor. Ad değerinde kesme işareti var:

kullanici = "O'Brien"
sorgu = f"SELECT * FROM kullanicilar WHERE ad = '{kullanici}'"
print(sorgu)

Beklenen çıktı:

SELECT * FROM kullanicilar WHERE ad = 'O'Brien'

Çıktıya dikkatle bak. Değerin içindeki tek tırnak, metin sabitini 'O' noktasında kapatıyor. Geriye kalan Brien' parçası MySQL için anlamsız bir sözcük ve açık kalmış bir tırnaktır. Sorguyu bu hâliyle çalıştırdığında hata mesajının near kısmında genellikle Brien ile başlayan bir parça görürsün. Kodda her şey doğru görünse de sorun, çalışma anında oluşan metindedir.

Yazdırılan sorguyu istemcide elle dene

Yazdırdığın sorguyu kopyala, MySQL komut satırı istemcisine ya da kullandığın bir veritabanı aracına yapıştır ve orada çalıştır. Aynı hatayı orada da alıyorsan sorun uygulama kodunda değil, sorgu metnindedir. Bundan sonra yazının önceki bölümlerindeki kontrol listesini bu elle denenen sorgu üzerinde uygulayabilirsin. Elle denemede sorgu çalışıyor ama uygulamada çalışmıyorsa, farkı iki metni yan yana koyarak ara. Eksik boşluk, fazladan tırnak ve boş gelen bir değişken bu karşılaştırmada çabuk fark edilir.

Parametreli sorgu daha sağlam bir alternatif olabilir

Değerleri metne kendin yapıştırmak yerine yer tutucu kullanan parametreli sorgular, tırnak hatalarını ve SQL enjeksiyonu riskini azaltmana destek olabilir. Bu yöntemde sorgu şablonu ile değerler ayrı gönderilir ve sürücü kütüphanesi değeri kendi kuralına göre uygun biçimde kaçışlar. Örneğin MySQL Connector/Python'ın resmî dokümantasyonu, değişkenleri %s ya da %(ad)s biçiminde belirtmeni anlatır. Başka sürücülerde yer tutucu biçimi farklı olabilir; kullandığın kütüphanenin dokümantasyonuna bakmak gerekir.

kullanici = "O'Brien"
cursor.execute(
    "SELECT * FROM kullanicilar WHERE ad = %s",
    (kullanici,)
)

Burada cursor, açık bir veritabanı bağlantısından alınmış imleçtir. Tek değerli demetin sonundaki virgül önemlidir: virgül olmadan parantez demet oluşturmaz, yalnızca değeri sarar. Bu sorgu için tırnak hatası beklemezsin, çünkü kesme işaretini sürücü değerin bir parçası olarak ele alır. Parametreli sorgu tablo adı, sütun adı ya da ORDER BY yönü gibi sorgunun yapısal parçalarını değiştirmez; bu kısımlar için kabul edilebilir değerleri kendi kodunda önceden belirlenmiş bir listeyle sınırlamak gerekir.

Hata yapmak öğrenmenin parçası: bir sonraki adım

Sözdizimi hatası, sorgunun yazım kurallarıyla ilgilidir; verinin yanlış olduğunu ya da mantığın hatalı kurulduğunu söylemez. Hata mesajını okuyup ilgili yeri bulmak ve sorguyu parçalara bölüp tek tek denemek, başka hata mesajlarında da işine yarayan genel bir beceridir. Bu beceri SQL'e özgü değildir.

Küçük bir alışkanlık deneyebilirsin: Her hata aldığında üç sütunlu bir not dosyası tut. Sütunlar hatalı sorgu, sebep ve düzeltme olsun. Birkaç hafta sonra kendi sık yaptığın hataların listesi çıkar ve yeni sorgu yazarken kontrol listen hazır olur. Programlama ve hata ayıklama üzerine başka yazılar okumak istersen Berk Akademi blogundaki yazılara göz atabilirsin.

Hata mesajı bir engel değil, sorgunun neresine bakman gerektiğini söyleyen bir ipucudur. Mesajı oku, sorguyu böl, düzelt ve notunu al.

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