Kurs
SQL sorguları yazarken genellikle belirli bir sırayı izleriz. (SQL’in içten dışa doğru yazıldığı bilinir.) Ancak SQL motorları, sorguları derlerken yazım sırasından farklı olan belirli bir çalıştırma sırasını takip eder. SQL çalıştırma sırasını anlamak; sorgu optimizasyonunda ustalaşmak, sorgu doğruluğunu ve performansını artırmak ve karmaşık sorunları ayıklamak için önemlidir, birazdan göreceğiniz gibi.
Başlarken, DataCamp’in Introduction to SQL kursunu ve sorgularla veriyi nasıl çıkaracağınızı öğrenmek için SQL Fundamentals beceri yolunu öneririm. SQL Basics Cheat Sheet, veriyi filtreleme ve özetlemeye yönelik yaygın SQL işlevleri için yararlı bir başvuru olacaktır.
SQL Çalıştırma Sırası Nedir?
SQL çalıştırma sırası, sorgudaki farklı deyimlerin hangi sırayla değerlendirildiğini ifade eder. Bunu anlamaya değer; çünkü çalıştırma sırası genellikle SQL sorgularını yazdığımız sıradan farklıdır. En basit örneği ele alırsak, SELECT * FROM database ifadesinde önce SELECT değerlendirilir diye düşünebilirsiniz, ancak aslında çalıştırma sırası FROM deyimiyle başlar.
İşte SQL çalıştırma sırası. Bir sonraki bölümde adımları ayrıntılı olarak ele alacağız.
- FROM/JOIN: Verinin alınacağı tabloları belirtir.
- WHERE: Gruplamadan önce koşulu sağlayan satırları filtreler.
- GROUP BY: Aynı özelliği paylaşan satırları gruplar.
- HAVING: Gruplama sonrasında, koşullara göre grupları filtreler.
- SELECT: Alınacak veya hesaplanacak sütunları belirtir.
- DISTINCT: Sonuç kümesindeki yinelenen satırları kaldırır.
- ORDER BY: Sonuç kümesini belirtilen sütunlara göre sıralar.
- LIMIT: Döndürülecek azami satır sayısını belirtir.
- OFFSET: Satır döndürmeye başlamadan önce kaç satır atlanacağını belirtir.
Aşağıdaki sorguda, önce hangilerinin değerlendirildiğini göstermek için yorumlar ekledim.
-- #6+7 SELECT DISTINCT department_id
-- #1 FROM employees
-- #2 JOIN orders ON customers.customer_id = orders.customer_id
-- #3 WHERE salary > 3000
-- #4 GROUP BY department
-- #5 HAVING AVG(salary) > 5000
-- #8 ORDER BY department
-- #9 LIMIT 10 OFFSET 5
-- #10 OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;
Ayrıca yardımcı olabilir diye bir akrostiş oluşturdum: For Work Goals and Hurdles Search DataCamp's Organized Learning Opportunities.
SQL Sorgusu Çalıştırma Aşamaları
Yazdığımız çoğu SQL sorgusu SELECT ifadesiyle başlasa da, mantıksal çalıştırma sırası FROM deyimiyle başlar. Burada, çalıştırma sırasını göstermek için sorgular yazacağım. Ancak bu sorguların eksik olduğunu ve derlenmeyeceğini unutmayın.
FROM deyimi
SQL sorguları çalıştırma sürecine FROM deyimiyle başlar. Bu genellikle ilk aşamadır; çünkü veritabanı veri kaynaklarını/tabloları belirler. Birden çok tablo söz konusuysa, SQL sorgusu veri kaynağı olarak belirtilen tabloları birleştirmek için JOIN koşulunu da değerlendirir.
Aşağıdaki eksik sorgu, önce FROM deyimiyle customers tablosundan ve JOIN deyimiyle orders tablosundan veri seçerdi.
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id;
WHERE deyimi
WHERE deyimi, belirli koşullara göre satırları filtrelemek için FROM ve JOIN deyimlerinden sonra çalıştırılır. SELECT içinde tanımlanan takma adlara, WHERE deyimi SELECT’ten önce işlendiği için, WHERE içinde doğrudan başvurulamayacağını not etmek önemlidir.
Aşağıdaki sorgu, bonus’u 5000’den büyük olan çalışan kayıtlarını filtrelemek için WHERE deyimini kullanır.
FROM employees
JOIN departments ON employees.employee_id = departments.department_id
WHERE salary * 0.1 > 5000;
GROUP BY deyimi
Satırları filtreledikten sonra, SQL belirtilen sütunlara göre sonuçları gruplamak için GROUP BY deyimini çalıştırır. Bu adım genellikle COUNT(), SUM() ve AVG() gibi toplu (aggregate) işlevlerle, belirtilen sütunlar üzerinde hesaplama yapmak için kullanılır.
Aşağıdaki sorgu önce salary değeri 3.000’den büyük olan çalışanları süzer, ardından department’a göre gruplar ve her grup için ortalama maaşı hesaplar.
FROM employees e
JOIN departments d ON e.employee_id = d.department_id
WHERE e.salary > 3000
GROUP BY e.name, d.department_name;
HAVING deyimi
HAVING deyimi, WHERE ile benzerdir; ancak GROUP BY işleminden sonra gruplanmış veriyi filtrelemek için kullanılır. Aşağıdaki sorguda SQL, employees kayıtlarını department’a göre gruplar, her grup için ortalama maaşı hesaplar ve ardından ortalama maaşı 5.000’in altında veya eşit olan grupları eler.
FROM employees
JOIN departments ON employees.employee_id = departments.department_id
WHERE salary > 3000
GROUP BY department_name
HAVING AVG(salary) > 5000;
SELECT deyimi
SELECT deyimi, önceki adımlar yürütüldükten sonra döndürülecek sütunların veya ifadelerin belirlendiği yerdir. SELECT içinde aritmetik işlemler, takma adlar ve toplu işlevler uygulayabilirsiniz.
Aşağıdaki sorgu, employees tablosundan name ve salary * 0.1 olarak hesaplanan bonus değerini almak için SELECT deyimini kullanır.
SELECT name, salary * 0.1 AS bonus
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY name
HAVING AVG(salary) > 5000;
DISTINCT deyimi
Bir sorguda DISTINCT deyimi, SELECT deyiminden sonra değerlendirilir. DISTINCT, benzersiz satırlar döndürdüğü için tablodaki yinelenen kayıtları kaldırmada önemlidir. Aşağıdaki sorgu, yinelenenleri eleyerek her benzersiz department_id’yi döndürür.
SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;
ORDER BY deyimi
ORDER BY deyimi, belirli sütun veya ifadelere göre sonuç kümesini sıralar. WHERE deyiminden farklı olarak, ORDER BY SELECT deyiminde tanımlanan sütun takma adlarını kullanabilir.
Aşağıdaki sorgu, bonus sütununu azalan düzende sıralar. bonus’un SELECT deyiminde bir ifadenin takma adı olarak tanımlandığına dikkat edin.
SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY bonus DESC;
LIMIT/OFFSET deyimi
LIMIT ve OFFSET deyimleri genellikle bir SQL sorgusunda döndürülecek satır sayısını kısıtlamak için en son çalıştırılır. LIMIT döndürülecek azami satır sayısını, OFFSET ise satırları döndürmeye başlamadan önce kaç satırın atlanacağını belirtir.
Aşağıdaki sorgu çalışanların adlarını ve maaşlarını alır, salary’ye göre azalan şekilde sıralar ve ilk 5 satırı atlayıp çıktıyı 10 sonuçla sınırlar.
SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY bonus DESC
LIMIT 10 OFFSET 5;
-- OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY --SQL SERVER / ORACLE
LIMIT ve OFFSET deyimleri MySQL ve PostgreSQL veritabanlarında desteklenir. SQL Server ve Oracle için, bir sorgudan döndürülecek satır sayısını kısıtlamak üzere OFFSET, ROWS FETCH ve ROWS ONLY kullanırsınız.
Veri sayfalamayı ve OFFSET ile LIMIT deyimlerine veritabanına özgü desteği öğrenmek için SQL OFFSET Nasıl Kullanılır adlı eğitimimize göz atın.
SQL Çalıştırma Sırası ve Yazım Sırası
SQL bildirime dayalı bir dildir; bu da çalıştırma sırasının yazım sırasından farklı olduğu anlamına gelir. Yani, bir görevin nasıl yapılacağını belirtmek yerine ne istediğinizi beyan edersiniz ve veritabanı motoru bunu başarmanın en iyi yoluna karar verir. Bu yöntem, yürütme için adım adım yönergeleri açıkça yazdığınız Python veya Java gibi buyurgan (imperative) programlama dillerinden farklıdır.
SQL çalıştırma sırasını anlamak, sorguları nasıl kurduğunuza bakışınızı değiştirir. Örneğin, SELECT deyiminde oluşturduğunuz bir takma ada göre satırları filtrelemek için şöyle bir sorgu yazdığınızı düşünün:
SELECT price * 0.9 AS discounted_price
FROM products
WHERE discounted_price > 100;
İlk bakışta mantıklı görünür, ancak hata verecektir. Neden? Çünkü SQL’in çalıştırma sırasına göre WHERE, SELECT’ten önce değerlendirilir. Bunu düzeltmek için alt sorgu veya HAVING kullanmanız gerekir:
SELECT price * 0.9 AS discounted_price
FROM products
HAVING discounted_price > 100;
WHERE ve HAVING hakkında daha fazla bilgi için şu eğitimimizi okuyun: SQL’de WHERE ve HAVING Arasındaki Fark.
Yaygın Hatalar ve En İyi Uygulamalar
Sorgu çalıştırma sırası yazım sırasından etkilenmese de, akışı anlamak yaygın hatalardan kaçınmak ve sorgu performansını artırmak için kritik önemdedir. Aşağıdaki hatalar doğrudan SQL’in çalıştırma sırasını yanlış anlamakla bağlantılıdır:
Yaygın hatalar
Aşağıdakiler, sorgu performansınızı engelleyebilecek yaygın hatalardır.
-
WHERE Deyiminde Sütun Takma Adlarını Kullanmak:
WHEREdeyimiSELECT’ten önce çalıştırıldığı için,WHEREiçinde takma ad kullanmaya çalışmak hataya yol açar. SQL’inWHERE’iSELECT’ten önce değerlendirdiğini bilmek, takma ada güvenmek yerine tam ifadeyi tekrarlamanız gerektiğini öğretir. -
Satır Filtreleme İçin WHERE Yerine HAVING Kullanmak:
HAVINGdeyimi,GROUP BY’dan sonra çalıştırılır ve toplu veriyi filtrelemek için tasarlanmıştır. Toplu olmayan veriyi filtreliyorsanız, bu koşul WHERE deyiminde olmalıdır. WHERE ve HAVING arasındaki çalıştırma sırası farkını bilmek, her koşulun nereye konması gerektiğini belirlemenize yardımcı olur. -
GROUP BY Olmadan SELECT İçinde Toplu İşlevleri Yanlış Kullanmak:
GROUP BY,HAVINGveyaSELECT’ten önce çalıştırıldığı için, verinizi toplu işlev uygulamadan önce gruplamamak yanlış sonuçlara veya hatalara yol açar. Çalıştırma sırasını anlamak, bu iki deyimin neden birlikte gitmesi gerektiğini netleştirir. -
ORDER BY İçinde Takma Adları Doğru Kullanmamak:
WHEREdeyiminden farklı olarakORDER BYSELECT’ten sonra değerlendirilir. Bu, sıralama içinSELECT’te oluşturulan takma adları kullanmanıza olanak tanır; takma adların ne zaman kullanılabilir olduğunu bilerek kafa karışıklığını önlersiniz.
En iyi uygulamalar
Sorgularınızın beklendiği gibi çalışması için aşağıdaki en iyi uygulamaları göz önünde bulundurun.
-
WHERE ile Erken Filtreleyin:
WHEREdeyimiGROUP BYveJOIN’dan önce çalıştığı için, filtreleri erken uygulamak sonraki deyimlerin işleyeceği satır sayısını azaltır ve performansı iyileştirir. Toplu olmayan veriyi mümkün olduğunca erken filtreleyerek, gruplanması veya birleştirilmesi gereken veriyi sınırlarsınız ve işlem süresinden tasarruf edersiniz. -
Birleştirmelerden Önce Ön-Toplama Yapın:
FROMveJOIN’in ilk çalıştırılan deyimler olduğunu bildiğinizde, alt sorgular veya ortak tablo ifadeleri (CTE) ile veriyi önceden toplamak, birleştirme sürecinden önce veri kümesini küçültmenizi sağlar. Bu, birleştirme sırasında daha az satırın işlenmesini temin eder. -
ORDER BY’ı Dizinlerle Optimize Edin:
ORDER BYdeyimi son adımlardan biri olduğundan, sıralanan sütunların dizinlenmiş olmasını sağlamak, veritabanının sıralama işlemlerini daha verimli yapmasına yardımcı olarak sorgu performansını hızlandırır. -
Üretimde SELECT * Kullanımından Kaçının:
SELECTdeyimi, filtreleme, gruplama ve toplamanın ardından çalıştırılır; bu nedenle yalnızca gereken sütunları belirtmek, getirilen veri miktarını azaltarak gereksiz yükü düşürür.
Sonuç
SQL çalıştırma sırasını anlamak, verimli, doğru ve optimize edilmiş sorgular yazmak için önemlidir. SQL’de sorgu çalıştırmanın mantıksal sırasını tartıştık ve bunu yazım sırasıyla karşılaştırdık. Mantıksal çalıştırma sırasını daha iyi kavramak için farklı sorgular yazmayı pratik etmenizi öneririm. Bu kavramı ustalıkla öğrenmek, SQL sorgularını sorun gidermede ve optimize etmede yeteneğinizi büyük ölçüde geliştirecektir.
SQL becerilerinizi ilerletmek istiyorsanız, yetkin bir veri analisti olmak için DataCamp’in Associate Data Analyst in SQL kariyer yolunu deneyin. Reporting in SQL kursu da etkili veri sunumu için karmaşık raporlar ve panolar oluşturma konusunda yetkinleşmenize yardımcı olacaktır. Son olarak, SQL’i iş problemlerini çözmek için kullanmadaki uzmanlığınızı sergilemek ve diğer profesyoneller arasında öne çıkmak için SQL Associate Certification sertifikasını almalısınız.
SQL Çalıştırma Sırası Hakkında SSS
SQL çalıştırma sırası yazım sırasından nasıl farklıdır?
SQL’de çalıştırma sırası genellikle FROM deyimiyle başlar ve WHERE, GROUP BY gibi deyimler izler; yazım sırası ise SELECT ifadesiyle başlar.
JOIN, çalıştırma sırasına nasıl oturur?
JOIN işlemleri, FROM deyiminin bir parçası olarak çalıştırılır.
Sütun takma adlarını WHERE deyiminde kullanabilir miyim?
Hayır, sütun takma adları SELECT deyiminde tanımlanır ve WHERE deyiminden sonra çalıştırılır.
WHERE ile HAVING arasındaki fark nedir?
WHERE, gruplamadan önce satırları filtreler; HAVING ise GROUP BY’dan sonra filtreler ve toplulaştırılmış veri üzerinde çalışır.
SQL çalıştırma sırası sorgu performansını etkiler mi?
Evet, çalıştırma sırasını anlamak filtreleri erken uygulayarak ve gereksiz işlemleri azaltarak sorguları optimize etmenizi sağlar.
