SQL Group By Kullanımı ve Örnekleri

SQL Group By Kullanımı ve Örnekleri
SQL

SQL Group By Kullanımı ve Örnekleri

GROUP BY ifadesi, veri tabanında bulunan tablolarımızı belirli ölçütlere göre gruplandırmak istediğimiz zaman kullanacağımız yapılara gruplandırma diyebiliriz. Birçok kullanım alanı vardır. Örneğin meslek isminde bir tablomuz olduğunu düşünelim. Bu tablomuz üzerinden GROUP BY ifadesi ile x mesleğinin maksimum ve minimum maaşlarını öğrenebilme ya da mesleğe göre puanlarını görebilme gibi avantajları sağlar.

GROUP BY ifadesi Syntax (Söz dizimi),

SELECT colum_name(s), FROM table_name 
GROUP BY column_name(s)
ORDER BY column_name(s);

Not: “ORDER BY” ifadesini sorgularımızda A-Z (ASC ) sıralamak ya da Z-A (DESC) sıralamak için kullanıyoruz. Kitaplarda ya da makalelerde ASC, artan düzeyde sıralama yapar. DESC, azalan düzeyde sıralama yapar. Şeklinde de ifade edilebilir.

İlk olarak “Jobs” isminde bir tablo oluşturalım;

CREATE TABLE jobs
(
Job_id INT PRIMARY KEY,
Job_Name Varchar(30),
Job_Book Varchar(30),
Salary Money,
Points INT
)

“Jobs” isimli tablomuza aşağıdaki gibi kayıtlarımızı ekleyelim;

INSERT INTO jobs([Job_id], [Job_Name], [Job_Book], [Salary], [Points])
VALUES(1001, 'Öğretmen', 'Öğretmen Olmak', 33000, 1400)

INSERT INTO jobs([Job_id], [Job_Name], [Job_Book], [Salary], [Points])
VALUES(1002, 'Mühendis', 'Dünyayı Değiştiren Beş Denklem', 48000, 8000)

INSERT INTO jobs([Job_id], [Job_Name], [Job_Book], [Salary], [Points])
VALUES(1003, 'Yazılım Uzmanı', 'Veri Stratejisi', 18000, 2800)

INSERT INTO jobs([Job_id], [Job_Name], [Job_Book], [Salary], [Points])
VALUES(1004, 'Doktor', 'Tus', 55000, 3400)

INSERT INTO jobs([Job_id], [Job_Name], [Job_Book], [Salary], [Points])
VALUES(1005, 'Sporcu', 'Sorularla Spor', 22000, 3650)

INSERT INTO jobs([Job_id], [Job_Name], [Job_Book], [Salary], [Points])
VALUES(1006, 'Öğretmen', 'Okulsuz Toplum', 30000, 1200)

INSERT INTO jobs([Job_id], [Job_Name], [Job_Book], [Salary], [Points])
VALUES(1007, 'Mühendis', 'Deprem Mühendisliği', 45000, 6500)

INSERT INTO jobs([Job_id], [Job_Name], [Job_Book], [Salary], [Points])
VALUES(1008, 'Yazılım Uzmanı', 'Yapay Zekâ Uygulama Rehberi', 16000, 1750)

INSERT INTO jobs([Job_id], [Job_Name], [Job_Book], [Salary], [Points])
VALUES(1009, 'Doktor', 'Sinir Sistemleri', 44000, 2600)

INSERT INTO jobs([Job_id], [Job_Name], [Job_Book], [Salary], [Points])
VALUES(1010, 'Sporcu', 'İspat', 18000, 1800)

Şimdi konuyu daha iyi özümseyebilmek için örnekler üzerinden gidelim;

Örnekler

1) İlk örneğimizde meslekleri en büyük maaşlarına göre gruplayalım.

SELECT Job_Name, MAX(Salary) AS  'En Büyük Maaş' FROM jobs
GROUP BY Job_Name
ORDER BY Job_Name ASC

Çıktımız aşağıdaki gibi olacaktır;

Not: Eğer ORDER BY ifadesini DESC ile çalıştırmış olsaydık çıktımız aşağıdaki gibi olacaktı.

2) Bu örneğimizde meslekleri en küçük maaşlarına göre gruplayalım.

SELECT Job_Name, MIN(Salary) AS ' En Düşük Maaş' FROM jobs
GROUP BY Job_Name
ORDER BY Job_Name ASC

Çıktımız aşağıdaki gibi olacaktır;

3) Bu örneğimizde meslekleri kitap adetlerine göre gruplayalım.

SELECT Job_Name, COUNT(*) AS 'Kitap Adedi' FROM jobs 
GROUP BY Job_Name
ORDER BY Job_Name ASC

Çıktımız aşağıdaki gibi olacaktır;

4) Bu örneğimizde meslekleri aldıkları puanların toplamına göre gruplayalım

SELECT Job_Name, SUM(Points) AS 'Puanlar Toplamı' FROM jobs 
GROUP BY Job_Name
ORDER BY Job_Name ASC

Çıktımız aşağıdaki gibi olacaktır;

HAVING

HAVING ifadesi, veri tabanımızda sadece GROUP BY ifadesi ile birlikte kullanılabilir. Aslında HAVING ifadesinin işlevi WHERE ifadesine çok benziyor. Ancak kümeleme fonksiyonları ile WHERE ifadesi birlikte kullanılamadığından HAVING ifadesine ihtiyaç duyulmuştur. Yazdığımız sorgularda dönen değere koşul verdiğimiz durumlarda kullanılırız.

HAVING ifadesi Syntax (Söz dizimi),

SELECT column_name(s)
FROM table_name
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);

HAVING BY ÖRNEK

1) Bu örneğimizde meslekleri aldıkları puanlara göre gruplayıp, puanı 2000 den büyük olanları getiren sorgumuzu yazalım.

SELECT Job_Name, SUM(Points) AS 'Maaş' FROM jobs
GROUP BY Job_Name
HAVING SUM(Points) >5000
ORDER BY Job_Name

Çıktımız aşağıdaki gibi olacaktır;