SELECT Sütunları için GROUP BY Kuralı
Toplulaştırılmamış her sütunun neden GROUP BY içinde yer alması gerektiğini ve yalnızca tam grup modunu öğrenin.
SELECT Sütunları için GROUP BY Kuralı, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.
Mülakatçılar Neden GROUP BY ile Başlar?
GROUP BY, mülakatlarda kıdemsiz geliştiricileri orta seviye geliştiricilerden ayıran konudur. En sık sınadıkları tek kural şudur: SELECT listenizdeki her sütun ya bir toplulaştırma işlevi içinde yer almalı ya da GROUP BY içinde listelenmelidir.
Bu kuralı ihlal ederseniz motor, birçok satır içeren bir grup için hangi değeri göstermesi gerektiğine karar veremez. Mülakatçılar, bir grubun gerçekte ne olduğunu anlayıp anlamadığınızı görmek için tam olarak bu hatayı yerleştirir.
Bir Grup Gerçekte Nedir?
GROUP BY, birçok satırı her tekil anahtar için bir satıra indirger. Gruplamadan sonra motorun elinde artık tek tek satırlar yoktur. Yalnızca her grup için tek bir özet satırı vardır.
- Grupladığınız sütunların her grup için tek ve belirli bir değeri vardır.
COUNT,SUMveAVGgibi toplulaştırmalar, birçok değeri tek bir değere indirger.- Diğer tüm ham sütunlar belirsizdir: birçok değerden hangisi gösterilmelidir?
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;Klasik Hata
Mülakatçıların görmeyi sevdiği hata şudur: department ile gruplama yaparken, toplulaştırılmamış ve GROUP BY içinde bulunmayan name sütununu da seçmek.
Her departmanda birçok çalışan bulunduğundan, her grupta birçok ad vardır. Motor bunlardan birini seçemez; bu nedenle standart SQL sorguyu reddeder.
-- ERROR: name is not in GROUP BY and not aggregated
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;Düzeltmenin İki Yolu
İki geçerli düzeltmeniz vardır ve mülakatçı ikisinin farklı sonuçlar ürettiğini bildiğinizi duymak ister:
- Sütunu GROUP BY içine ekleyin; gerçekten daha ayrıntılı bir gruplama istiyorsanız (departman ve ad başına bir satır).
- Mevcut her grup için tek bir değer istiyorsanız sütunu
MAX(name)veyaCOUNT(name)gibi bir toplulaştırmanın içine alın.
-- Finer grouping
SELECT department, name, COUNT(*) AS rows_for_person
FROM employees
GROUP BY department, name;MySQL'de ONLY_FULL_GROUP_BY
Yaygın bir tuzak: Eski MySQL, gruplandırılmamış sütunların seçilmesine izin veriyor ve gruptan rastgele bir değeri sessizce döndürüyordu. Bu durum, doğruymuş gibi görünen hatalı raporlar üretiyordu.
Güncel MySQL, varsayılan olarak ONLY_FULL_GROUP_BY özelliğini etkinleştirir ve standart kuralı zorunlu kılar. Postgres, SQL Server ve Oracle bu kuralı her zaman zorunlu kılmıştır. 'Sorgu eski sunucuda çalışıyordu ama şimdi bozuluyor' diye sorulursa, yanıt budur.
-- Legal under ONLY_FULL_GROUP_BY because every
-- selected column is grouped or aggregated
SELECT department, MAX(hire_date) AS latest_hire
FROM employees
GROUP BY department;İşlevsel Bağımlılık İstisnası
Mülakatçıların derinliğinizi sınamak için kullandığı bir incelik vardır. Bir tablonun birincil anahtarına göre gruplama yaparsanız, o tablonun diğer tüm sütunları anahtara işlevsel olarak bağımlıdır; dolayısıyla her grup için tam olarak tek bir değere sahiptir.
Postgres ve güncel MySQL, bu bağımlı sütunları listelemeden seçmenize izin verir. Gruplanan anahtar bunları benzersiz biçimde belirlediği için belirsizlik yoktur.
-- Legal: id is the PK, so name is determined by it
SELECT e.id, e.name, COUNT(o.id) AS orders
FROM employees e
LEFT JOIN orders o ON o.employee_id = e.id
GROUP BY e.id;Çözümlü Örnek: Bölgeye Göre Satışlar
Bölge başına toplam satışları raporlamanız gerektiğini varsayalım. Gruplama anahtarı region, ölçüm ise SUM(amount) olur. Geri kalan her şey toplulaştırılmalı veya çıkarılmalıdır.
Sonucun ne kadar temiz olduğuna dikkat edin: her bölge için bir satır ve her satırda tek bir toplam değer vardır. Her toplulaştırılmış raporun yapısı budur.
SELECT region,
SUM(amount) AS total_sales,
COUNT(*) AS num_orders,
AVG(amount) AS avg_order
FROM sales
GROUP BY region;Ayrıntıları ve Özeti Birlikte Kullanma
Aldatıcı bir istek: 'Her siparişin tutarını, bölgesinin toplamıyla yan yana gösterin.' Bunu doğrudan GROUP BY ile yapamazsınız; çünkü gruplama tek tek satırları yok eder.
Doğru yanıt bir pencere işlevi (SUM(amount) OVER (PARTITION BY region)) veya gruplanmış bir alt sorguya yeniden birleştirmedir. GROUP BY'ın burada yanlış araç olduğunu fark etmek, sorunun asıl amacıdır.
-- Detail rows kept, region total added per row
SELECT order_id, region, amount,
SUM(amount) OVER (PARTITION BY region) AS region_total
FROM sales;GROUP BY ve SELECT Takma Adları
SELECT içinde tanımlanan bir takma ada göre GROUP BY yapabilir misiniz? Bu, SQL lehçesine bağlıdır ve mülakatçıların özellikle incelediği tutarsızlık da budur.
- MySQL ve Postgres: SELECT takma adına göre gruplamaya izin verir.
- SQL Server ve Oracle: izin vermez; ifadenin tamamını tekrarlamanız gerekir.
Taşınabilir çözüm, ifadeyi GROUP BY içinde tekrarlamaktır; bu çözüm her yerde çalışır.
-- Portable: repeat the expression rather than the alias
SELECT EXTRACT(YEAR FROM order_date) AS yr, COUNT(*)
FROM sales
GROUP BY EXTRACT(YEAR FROM order_date);Tekillik İçin DISTINCT ve GROUP BY
Yalnızca tekil kombinasyonları istiyor ve herhangi bir toplulaştırma yapmıyorsanız, toplulaştırma içermeyen GROUP BY, DISTINCT gibi davranır. Mülakatçılar hangisinin daha açık olduğunu sorabilir.
Niyetinizi ifade etmek için DISTINCT kullanın ('benzersiz satırlar istiyorum'). GROUP BY kullanımını, toplulaştırma da hesapladığınız durumlara ayırın. Sonuç aynı olsa da okunabilirlik mesajı farklıdır.
-- These return the same rows
SELECT DISTINCT department, role FROM employees;
SELECT department, role FROM employees GROUP BY department, role;Mülakatta Bunu Nasıl Söylemelisiniz?
Bir GROUP BY sorusuyla karşılaştığınızda kuralı yüksek sesle açıklayın: 'Seçilen her sütun ya bir gruplama anahtarıdır ya da bir toplulaştırma işlevinin içine alınmıştır; çünkü gruplama, her anahtar için bir satır bırakır.'
Ardından gruplama anahtarınızı ve ölçümlerinizi belirtin; gruplandırılmamış hiçbir şeyin aradan sızmadığını doğrulayın. Bu yapılandırılmış yanıt, sorguyu yazmadan önce bile orta seviye yeterliliğe sahip olduğunuzu gösterir.
Hızlı Kontrol
Temel GROUP BY kuralını ne kadar kavradığınızı ölçün.
Özet
Kural: her SELECT sütunu bir gruplama anahtarı ya da toplulaştırma ifadesi olmalıdır. Neden: GROUP BY her anahtar için bir satır bıraktığından, gruplandırılmamış ham sütunlar belirsiz olur.
- İhlalleri, sütunu gruplandırarak veya toplulaştırarak düzeltin.
- MySQL'in eski davranışı rastgele değerler döndürüyordu;
ONLY_FULL_GROUP_BYstandardı zorunlu kılar. - Birincil anahtara dayalı işlevsel bağımlılık, yasal olan tek istisnadır.
- Ayrıntı satırlarını grup toplamlarının yanında tutmak için GROUP BY yerine pencere işlevlerini kullanın.
Sıkça Sorulan Sorular
“SELECT Sütunları için GROUP BY Kuralı” dersi ücretsiz mi?
Evet — “SELECT Sütunları için GROUP BY Kuralı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.
“SELECT Sütunları için GROUP BY Kuralı” dersinde ne öğreneceğim?
Toplulaştırılmamış her sütunun neden GROUP BY içinde yer alması gerektiğini ve yalnızca tam grup modunu öğrenin. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“SELECT Sütunları için GROUP BY Kuralı” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- SELECT Sütunları için GROUP BY Kuralı
- HAVING ve WHERE Karşılaştırması
- Birden Çok Sütun ve İfadeye Göre Gruplama
- Grupları Sayma ve Filtreleme