SQL Sorgularında Yanlış Kullanımlar

Serdar A.
3 min readApr 18, 2024

--

Merhabalar;

For English : https://medium.com/@lastjavabuilder/common-mistakes-in-sql-queries-2c453ef7a8ce

Bu yazımda SQL sorgularımızda en çok karşılaşılan hatalar ve buna yönelik çözümlerle ilgili öneriler sunacağım

  1. Sorgularda NULL karşılaştırma hataları

Sorgularda WHERE kısmında nullParam = NULL şeklinde karşılaştırmalar yazılır. Bu sorgunun sonucu olarak FALSE döner ve sorgu sonucunun yanlış çalışmasına sebep olur.Çünkü NULL açıkçası “unknow” manasına geliyor. İki tane bilinmeyen şeyin aynı olduğunu bilemeyiz ve haliyle karşılaştıramayız.

Çözüm :

Sorgularda WHERE kısmında param IS NULL veya param IS NOT NULL kullanmak.

2. Count(expression) fonksiyon kullanımı

Select sorgularında count() fonksiyonun null value değerleri yoksayar default olarak.

Çözüm :

Bunun yerine count(*) şeklinde kullanılmalıdır.

Sorqu örneği

SELECT COUNT(MyField) AS count_column ,COUNT(*) AS count_all FROM my_table

Result :

3. Spesifik kelimelerin (rezerve word) column adı olarak kullanılması

Select from FROM TableName

şeklinde sorgularda from kelimesi ayrılmış (rezerved) kelimedir. Böyle durumlarda hata alırsınız.

Çözüm :

SELECT `from` FROM TableName

veya

SELECT TableName.from FROM TableName

veya

select [from] from TableName

şeklinde kullanılmalıdır.

4. Yanlış JOIN Tipleri kullanımı

Bazen sorgularda A tablosu ile B tablosunu INNER olarak JOIN Type kullanıldığında örnek olarak sonuç gelmeyebilir veya A tablosundaki tüm verileri istediğimizi varsayalım INNER Join Type dan dolayı istediğimiz sonucu alamayız.

5. Between ifadesinin yanlış kullanımı

Örnek olarak column değeri 2020–05–01 20:25:19 olsun aşağıdaki gibi bir sorgu yazdığımızda herhangi bir sonuç dönmeyecektir.

SELECT * FROM TableName WHERE my_date  BETWEEN '2020-05-01' AND '2020-05-01'

Bu sorgu aslında;

SELECT * FROM TableName
WHERE my_date BETWEEN '2020-05-01 00:00:00+00000' AND '2020-05-01 00:00:00+00000'

şeklinde yorumlanır.

Çözüm :

SELECT *
FROM TableName
WHERE cast(my_date _at as date) BETWEEN '2020-05-01' AND '2020-05-01'

veya

SELECT *
FROM TableName
WHERE my_date >= '2020-05-01' AND my_date < '2020-05-02'

şeklinde kullanılabilir.

6. Where ifadesinin Group By ifadesinden sonra kullanımı

Gruplanmış veri kümelerinde where kullanıldığında hatalı sonuçlar üretir

Çözüm :

  • Where : Kayıtları filtrelemek için kullanılır.
SELECT S_Name, Age FROM Student 
WHERE Age >=18
  • Having : Gruplanmış kayıtların filtelenmesi için kullanılır.
SELECT Age, COUNT(Roll_No) AS No_of_Students 
FROM Student GROUP BY Age
HAVING COUNT(Roll_No) > 1

Farkları

7. Ortak column name kullanımına bağlı sorgulama hataları

Birden fazla tabloda aynı isimde column isimleri var ise where kısmında veya select kısmında birbirlerinin yerine kullanımı sorgu sonucu hatalarına sebep olur.

Çözüm :

Tablo isimleri için alias kullanılmalıdır.

Select A.name as A_name, B.col1, C.name as C_name 
from TableA A, TableB B, TableC C
WHERE
A.id = C.id
B.col2 = C.col2

8. DISTINCT ifadesinin yanlış kullanımı

DISTINCT ifadeleri gereksiz kullanımı olursa sorgunun çalışma süresini artırır ve performans kaybına sebep olur.

Sorgular analiz edilerek gereksiz DISTINCT ifadeleri sorgulardan kaldırılmalıdır.

9. Sub sorguların doğru kullanılmaması

Bazen sub query ler gerekli olsa da bazen performans problemlerine sebep olabilir. Sorguları analiz ederek çözümler bulunmalı.

Select A.col1,A.col2,
(Select max(B.col3) from TableB as B WHERE A.col4 = B.col4 ) AS maxValue
From TableA as A

Çözüm :

Sorguları optimize etmek için sub query deki sorguları JOIN Type ile veya başka tekniklerle daha performanslı hale getirilebilir.

10. Normalizasyon hataları

  • Aynı tabloda yinelenen colonlar kaldırılmalıdır. Fazlalık colonlar kaldırılmalıdır.
  • İlgili veri kümeleri ayrı ayrı gruplanmalı ve tablo oluşturulmalıdır
  • Gerekise Bir ilgi kümesindeki ortak ilgili veri setleri için ayrı bir tablo oluşturulabilir
  • Her tablo için primary key tanımlanması
  • İkincil tablolar için ilgili tablolarda referance key oluşturulmalıdır

Okuduğunuz için teşekkür ederim.

--

--

Serdar A.
Serdar A.

Written by Serdar A.

Senior Software Developer & Architect at Havelsan Github: https://github.com/serdaralkancode #Java & #Spring & #BigData & #React & #Microservice

No responses yet