← Back to list

Veri Tabanı Yönetiminin Temelleri: SQL’de DQL Komutları

Bir önceki paylaşımımda Veri Tabanı Yönetiminin Temelleri konusuna giriş yapmıştım ve şimdi kaldığım yerden devam ediyorum. Bu paylaşımın…

Hüsnü Hamurcu · 2025-08-24 14:48 · 0 claps · 4.6 min read
#sql #dql #query-optimization #query
Open on Medium ↗
Wiki topics: 🛠️ · Crafts & DIY

Veri Tabanı Yönetiminin Temelleri: SQL’de DQL Komutları

Photo by Sunder Muthukumaran on Unsplash

Photo by Sunder Muthukumaran on Unsplash

Bir önceki paylaşımımda Veri Tabanı Yönetiminin Temelleri konusuna giriş yapmıştım ve şimdi kaldığım yerden devam ediyorum. Bu paylaşımın konusu, başlıkta da belirttiğim gibi DQL (Data Query Language) komutları. Ayrıca profesyonel hayatımda karşılaştığım irili ufaklı problemlerden, farklı Veri Tabanı Yönetim Sistemleri’nde sorguların nasıl değişebileceğinden ve performans düzenlemeleri gibi farklı noktalardan bahsedeceğim.

DQL komutları isminden anlaşılacağı üzere veriyi sorgulamamızı sağlayan temel komutlar grubuna verilen isimdir. Bu sorguların çekirdeğinde SELECT komutu olmakla birlikte FROM, JOIN, UNION, EXCEPT, WHERE, GROUP BY, HAVING, ORDER BY, DISTINCT, LIMIT, OFFSET, TOP gibi komutlar da DQL kapsamına girer. Çekirdeğindeki SELECT ve beraberinde gelen en temel bir kaç komuta bu yazıda değineceğim.

1. Select

SELECT komutu SQL dilinin ve özellikle DQL komutlarının çekirdeğinde yer alan komuttur diyebiliriz. “FROM ile belirtilen tablodan belirttiğim verileri çek” şeklinde yorumlayabileceğimiz SELECT, kendisinden sonra yazdığımız kolonları veya ifadeleri getirir.

Burada ufak bir noktaya değinmek istiyorum; bu komutu kullanırken “” ifadesi kullanılan durumlar vardır. Büyük veri setlerinde “” ile tüm kolonları çekmek performans açısından olumsuzluk oluşturur ve sorgunun performansını düşürür. Bunun yerine sadece gerekli kolonları yazıp sorguyu getirmek daha mantıklı ve verimlidir. Eğer kolon sayısı çok ise Object Explorer kısmından (SSMS’teki adı bu. MySQL’deki adı Navigator olmakla birlikte DBeaver, Oracle’da Database Explorer’dır.) üzerinde çalışacağınız tabloyu sürükleyip Query Window’a bırakırsanız tüm kolon isimleri gelir ve istemediklerinizi çıkarabilirsiniz.

Ayrıca “” ile ALL ifadesi farklı ifadelerdir. “” tüm kolonlar getir gibi anlamına gelirken ALL ifadesi DISTINCT komutunun tersidir ve tekrarlanan verileri de dahil et anlamına gelmektedir. SELECT’in varsayılanı ALL komutuyladır ve doğal olarak neredeyse kimse ALL komutunu kullanmaz. En belirgin örneğini UNION ifadesinde görebiliriz. UNION komutunun varsayılanı DISTINCT (Her farklı değeri bir defa göster) komutuyladır ve biz tekrar eden değerleri de görmek istersek UNION ALL olarak belirtmemiz gerekir.

-- Students tablosundaki tüm kolonları getirir
SELECT * FROM Students;

--Students tablosundaki belirtilen kolonları getirir
SELECT 
  student_id,
  first_name,
  last_name
FROM Students;

2. Where

Veri tabanından tüm verileri çekmek her zaman karşılaşılan bir durum değildir. Genelde istenilen verileri elde etmek için filtreleme işlemleri gerekmektedir. WHERE komutu bir sorguda belirli satırları filtrelemek için kullanılmakla birlikte DQL’in en kritik ve sık kullanılan komutlarından birisidir. Satır bazında ve gruplama yapılmadan önce filtreleme yapar. Bu noktada HAVING fonksiyonu ile ayrışmaktadır.

Karmaşık alt sorgularla birlikte kullanılabilmesine karşın genellikle sayısal ve metin karşılaştırma ifadeleri, mantıksal operatörler ve boş değer kontrol ifadeleriyle kullanılmaktadır.

Sayısal karşılaştırma ifadeleri : =, != veya <>, >, <, >=, <=

Metin karşılaştırma ifadeleri: LIKE, IN

Mantıksal operatörler: AND, OR, NOT

Boş değer kontrolü: IS NULL, IS NOT NULL

Burada AND ve OR kullanımı üzerinde dikkat edilmesi gereken bir noktada duracağım. İstenilen veriler birden fazla AND ve OR komutlarından oluşabiliyor. Bu durumda parantez kullanımı ya da IN komutuyla filtre oluşturma hayat kurtarıcı olabiliyor. Örneğin öğrencilerden cinsiyeti erkek olan, İstanbul ve İzmirli olan öğrencilerin öğrenci ID bilgisinin, isminin ve soy isminin getirilmesini istediğimiz bir sorguyu inceleyelim.

SELECT 
  student_id,
  student_name,
  student_surname
FROM Students
WHERE
  gender = 'ERKEK' 
  AND (city ='İstanbul' OR city = 'İzmir'); 

--Aynı sorgunun IN komutuyla yapılmış hali
SELECT 
  student_id,
  student_name,
  student_surname
FROM Students
WHERE
  gender = 'ERKEK' 
  AND city IN ('İstanbul', 'İzmir');

Yukarıda belirttiğim gibi iki sorguda doğrudur. Eğer ilk sorguda parantezi kullanmasaydık sorgumuz cinsiyeti erkek ve İstanbullu olan kişilere ek olarak tüm İzmirli kişiler gelecekti. Bunun sebebi AND operatörünün mantıksal işlemlerde önceliğe sahip olmasıdır. 4 işlem üzerinden örnek verecek olursak AND operatörünü çarpma işlemi OR operatörünü toplama işlemi olarak düşünebiliriz. Bu örnekle anlaşılması bir nebze daha kolay olacaktır. İkinci sorguda ise OR komutuna gerek olmadan direkt IN komutu ile sorguyu gerçekleştirdik.

Metin karşılaştırma ifadeleri metinlerde kalıp araması yapmaktadır ve “%” ve “” ifadeleri kullanılmaktadır. “%” ifadesi kullanıldığı konuma göre başlangıç veya bitiş kalıbını temsil etmektedir ve en sık kullanılan metin karşılaştırma ifadesidir. “” ifadesi daha nadir kullanılmakla birlikte tıpkı eskiden televizyonlarda yayınlanan Mehmet Ali Erbil’in sunduğu Çarkıfelek programındaki açılan harfler gibi kalıp bazlı arama yapar. Örnekler üzerinden açıklayalım.

--İsmi 'A' ile başlayan öğrenci bilgilerini getir.
SELECT * FROM Students
WHERE student_name LIKE 'A%'

--Soy ismi 'A' ile biten öğrenci bilgilerini getir.
SELECT * FROM Students
WHERE student_surname LIKE '%A'

--İsmi 5 harfli ve 3. harfi 'S' olan öğrenci bilgilerini getir.
SELECT * FROM Students
WHERE student_name LIKE '__S__'

3. Group By

Veri analizinin temelinde elimizdeki ham verinin istenilen veriye göre özetlenmesi vardır diyebiliriz ve burada GROUP BY komutu verileri bir veya daha fazla sütuna göre gruplandırarak özet veriyi alma yolunda çok kritik bir konuma sahiptir. Örnek olarak her bir müşterinin toplam sipariş tutarını görmek istediğimiz bir senaryo oluşturalım.

--Müşteri bazında toplam sipariş tutarı
SELECT 
  customer_id, 
  SUM(order_amount) AS Total_Sales
FROM Orders
GROUP BY customer_id;

Genelde Toplam Fonksiyonları (Aggregate Functions) ile birlikte kullanılmasına karşın toplam fonksiyonları olmadan da kullanımları mevcuttur. Bu kullanımı aslında DISTINCT komutunun alternatifi gibi düşünülebilir. Ben profesyonel hayatımda bu kullanımıyla karşılaşmadım ama burada bu kullanımından da bahsedeceğim.

SELECT city
FROM Customers
GROUP BY city;

Burada her “Customers” tablosunun “city” kolonundaki her farklı değeri bir kere getirir. Ayrıca gruplanmış satırlarda filtreleme işlemi yapmak istiyorsak WHERE yerine HAVING komutunu kullanmalıyız.

4. Having

HAVING komutunun amacı az önce de bahsettiğim üzere gruplandırılmış satırları filtrelemektir. GROUP BY ve toplam fonksiyonları ile birlikte kullanılır. WHERE komutu ile farkı da buradadır. WHERE komutu satır bazlı filtreleme yapar ve sorguya bu satırlar ile devam et komutunu verir. HAVING ise sonuç kümesine dahil olacak GROUP BY ile gruplandırılmış verileri filtreler. Toplam sipariş tutarının olduğu bir senaryo oluşturmuştuk, bu verilerin içinde toplam sipariş tutarı 10000 değerine eşit ve üzerinde olanları görmek istediğimiz bir filtreleme yapalım.

SELECT 
  customer_id, 
  SUM(order_amount) AS Total_Sales
FROM Orders
GROUP BY customer_id
HAVING SUM(order_amount) >= 10000;

Burada değinmek istediğim bir nokta var. HAVING komutunu ilk öğrendiğim zamanlarda şu soruyu sormuştum: “Takma adları (Alias — bu sorguda “Total_Sales”) HAVING komutunda doğrudan kullanabilir miyiz?” Tabikide hayır. En azından MySQL ve bazı veri tabanı yönetim sistemleri hariç çoğu (MS SQL, PostgreSQL, Oracle …)için hayır. Çünkü takma adlar (Alias) SQL sorgularının mantıksal çalışma sırasında en son sırada SELECT ile devreye girerler ama HAVING komutu daha önce devreye girdiği için yazdığımız takma ad HAVING komutu için tanımsız kalır.

Sıralamadan bahsetmişken WHERE komutu GROUP BY komutundan önce; HAVING komutu GROUP BY komutundan sonra kullanılır diyebiliriz. Yeri gelmişken SQL sorgularında mantıksal çalışma sırasından bahsetmemek olmaz. Bu sayede aklınıza takılan bazı yerler daha sağlam temellerle yerine oturacaktır. SQL’in düşünme sırası aşağıdaki gibidir.

  1. FROM (Tabloyu seçer)
  2. WHERE (Satırları filtreler)
  3. GROUP BY (Gruplandırmayı yapar)
  4. Toplam Fonksiyonları (Aggregate Functions - SUM, AVG, COUNT …)
  5. HAVING (Gruplandırılmış veride filtreleme yapar)
  6. SELECT (Listelenecek sonuçları seçer)
  7. ORDER BY (Sıralama yapar)

Sıralamada olduğu gibi WHERE önce gelir ve gruplama yapılıp HAVING ile filtrelenecek veriyi belirler. HAVING ve WHERE komutu benzer sonuç, farklı amaç ile çalıştığı için birlikte kullanılabilir. Şimdi ise sipariş tutarı 500 ve üzerinde olan değerleri dikkate alarak toplam sipariş tutarı 10000 değerine eşit ve üzerinde olanları getirmek isteyelim. WHERE komutunu eklediğimiz yere ve elde etmek istediğimiz verinin amacına dikkat edelim lütfen. Burası sıklıkla karıştırılabiliyor.

SELECT 
  customer_id, 
  SUM(order_amount) AS Total_Sales
FROM Orders
WHERE order_amount >= 500
GROUP BY customer_id
HAVING SUM(order_amount) >= 10000;

Şimdilik bahsedeceklerim bu kadar. Bilgi paylaştıkça çoğalır, dönüşlerinizi bekliyor olacağım. Bana LinkedIn platformundan ulaşabilirsiniz. Hepinize sağlıklı günler dilerim.


메타데이터
post_id
fd39b70fe8d6
slug
veri-tabanı-yönetiminin-temelleri-sqlde-dql-komutları-fd39b70fe8d6
url
https://medium.com/@husnu_hamurcu/veri-taban%C4%B1-y%C3%B6netiminin-temelleri-sqlde-dql-komutlar%C4%B1-fd39b70fe8d6
canonical_url
https://medium.com/@husnu_hamurcu/veri-taban%C4%B1-y%C3%B6netiminin-temelleri-sqlde-dql-komutlar%C4%B1-fd39b70fe8d6
author_url
https://medium.com/@husnu_hamurcu
status
ok
fetched_at
2026-06-10 21:21:38