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
- 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.