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.