SQL Notları: ORDER BY ve GROUP BY Kullanımı

MySQL’de `ORDER BY` ve `GROUP BY` ifadeleri, sorgu sonuçlarını sıralamak ve gruplamak için kullanılır. Bu bölümde, bu ifadelerin farklı kullanım senaryolarını ve ipuçlarını inceleyeceğiz.

### 1. **ORDER BY ile Sıralama**

`ORDER BY` ifadesi, sorgu sonuçlarını belirli bir sütuna göre sıralamak için kullanılır. Varsayılan olarak artan sırada (ASC) sıralama yapar, ancak azalan sırada (DESC) sıralama da yapılabilir.

**Örnek Kullanım:**
“`sql
SELECT * FROM employees 
ORDER BY lastname ASC, firstname ASC;
“`

Bu sorgu, `employees` tablosundaki kayıtları önce `lastname` sütununa göre artan sırada, ardından `firstname` sütununa göre artan sırada sıralar.

**NULL Değerler:**
– `NULL` değerler, sıralama işleminde varsayılan olarak en başa gelir. Eğer `NULL` değerlerin en sonda olmasını istiyorsanız, aşağıdaki gibi bir sorgu kullanabilirsiniz:
“`sql
SELECT * FROM employees 
ORDER BY lastname IS NULL, lastname ASC;
“`

### 2. **GROUP BY ile Gruplama**

`GROUP BY` ifadesi, sorgu sonuçlarını belirli bir sütuna veya sütunlara göre gruplamak için kullanılır. Genellikle `COUNT`, `SUM`, `AVG`, `MIN`, `MAX` gibi agregasyon fonksiyonları ile birlikte kullanılır.

**Örnek Kullanım:**
“`sql
SELECT department, COUNT(*) AS employee_count 
FROM employees 
GROUP BY department;
“`

Bu sorgu, `employees` tablosundaki çalışanları `department` sütununa göre gruplar ve her departmandaki çalışan sayısını döner.

### 3. **HAVING ile Gruplama Sonrası Filtreleme**

`HAVING` ifadesi, `GROUP BY` ile gruplanmış sonuçlar üzerinde filtreleme yapmak için kullanılır. `WHERE` ifadesi gibi çalışır, ancak `WHERE` ifadesi gruplama öncesi filtreleme yaparken, `HAVING` gruplama sonrası filtreleme yapar.

**Örnek Kullanım:**
“`sql
SELECT department, AVG(salary) AS avg_salary 
FROM employees 
GROUP BY department 
HAVING AVG(salary) > 5000;
“`

Bu sorgu, `employees` tablosundaki çalışanları `department` sütununa göre gruplar ve ortalama maaşı 5000’den büyük olan departmanları döner.

### 4. **GROUP_CONCAT ile Gruplanmış Verileri Birleştirme**

`GROUP_CONCAT` fonksiyonu, gruplanmış verileri birleştirerek tek bir string olarak döner. Bu, özellikle gruplanmış verileri daha okunabilir hale getirmek için kullanışlıdır.

**Örnek Kullanım:**
“`sql
SELECT department, GROUP_CONCAT(lastname ORDER BY lastname ASC SEPARATOR ‘, ‘) AS employees 
FROM employees 
GROUP BY department;
“`

Bu sorgu, `employees` tablosundaki çalışanları `department` sütununa göre gruplar ve her departmandaki çalışanların soyadlarını birleştirerek döner.

### 5. **Aggregasyon Fonksiyonları ile Gruplama**

`GROUP BY` ifadesi, genellikle agregasyon fonksiyonları ile birlikte kullanılır. İşte bazı yaygın agregasyon fonksiyonları:

– **COUNT:** Belirli bir sütundaki satır sayısını döner.
– **SUM:** Belirli bir sütundaki değerlerin toplamını döner.
– **AVG:** Belirli bir sütundaki değerlerin ortalamasını döner.
– **MIN:** Belirli bir sütundaki en küçük değeri döner.
– **MAX:** Belirli bir sütundaki en büyük değeri döner.

**Örnek Kullanım:**
“`sql
SELECT department, 
      COUNT(*) AS employee_count, 
      AVG(salary) AS avg_salary, 
      MIN(salary) AS min_salary, 
      MAX(salary) AS max_salary 
FROM employees 
GROUP BY department;
“`

Bu sorgu, `employees` tablosundaki çalışanları `department` sütununa göre gruplar ve her departmandaki çalışan sayısını, ortalama maaşı, en düşük ve en yüksek maaşı döner.

### 6. **ONLY_FULL_GROUP_BY Hatası ve Çözümleri**

MySQL 5.7 ve sonraki sürümlerde, `ONLY_FULL_GROUP_BY` modu varsayılan olarak etkinleştirilmiştir. Bu mod, `GROUP BY` sorgularında seçilen sütunların ya `GROUP BY` ifadesinde belirtilmesini ya da bir agregasyon fonksiyonu içinde kullanılmasını gerektirir. Aksi takdirde, `Error 1055` hatası alınır.

**Örnek Hata:**
“`sql
SELECT department, lastname 
FROM employees 
GROUP BY department;
“`

Bu sorgu, `ONLY_FULL_GROUP_BY` modu etkin olduğunda hata verecektir çünkü `lastname` sütunu ne `GROUP BY` ifadesinde belirtilmiştir ne de bir agregasyon fonksiyonu içinde kullanılmıştır.

**Çözüm:**
“`sql
SELECT department, GROUP_CONCAT(lastname) AS employees 
FROM employees 
GROUP BY department;
“`

Bu sorgu, `lastname` sütununu `GROUP_CONCAT` fonksiyonu içinde kullanarak hatayı önler.

Bu bilgilerle, MySQL’de `ORDER BY` ve `GROUP BY` ifadelerinin farklı kullanım senaryolarını ve ipuçlarını daha iyi anlayabilirsiniz.