🧠 Veritabanı Yönetim Sistemleri – SQL Temelleri
📌 1. SQL Nedir?
SQL (Structured Query Language), ilişkisel veritabanlarında veri tanımlama, sorgulama,
güncelleme ve kontrol etme işlemlerini gerçekleştirmek için kullanılan standart bir dildir.
🧠
📌 2. Veritabanı Temel Kavramları
Terim Açıklama
Tablo (Table) Benzer verilerin satır ve sütunlar halinde saklandığı yapıdır.
Sütun (Column) Tablodaki her bir alanı ifade eder (örneğin: ad , soyad ).
Satır (Row) Bir kayda ait tüm bilgileri içerir (örneğin: bir öğrencinin tüm
bilgileri).
Alan (Field) Belirli bir satır ve sütunun kesişimindeki veridir.
Veri Türü (Data Her sütunun hangi tür veri içereceğini belirtir (örneğin: INT ,
Type) VARCHAR , DATE ).
🧠 Şekil 1’de bu kavramların görsel karşılığı bir tablo üzerinde gösterilmiştir.
📌 3. SQL Komut Türleri
SQL komutları işlevlerine göre üç ana gruba ayrılır:
Tür Açıklama Örnek Komutlar
DDL (Data Definition Veri yapısını tanımlar. CREATE , ALTER ,
Language) DROP
DML (Data Manipulation Veri üzerinde değişiklik INSERT , UPDATE ,
Language) yapar. DELETE
DQL (Data Query Language) Veri sorgular. SELECT
🧠 Şekil 2’de bu komut türlerinin kullanım amaçları özetlenmiştir.
📌 4. Temel SQL Sorgu Yapısı
sql
SELECT sütun1, sütun2
FROM tablo_adi
WHERE koşul
GROUP BY sütun1
HAVING koşul
ORDER BY sütun1 ASC|DESC;
SELECT: Hangi sütunların getirileceğini belirtir.
FROM: Verinin hangi tablodan alınacağını gösterir.
WHERE: Satırları filtreler.
GROUP BY: Gruplama yapar.
HAVING: Gruplama sonrası filtreleme yapar.
ORDER BY: Sıralama yapar.
🧠 Şekil 3’te bu yapının görsel akışı yer almaktadır.
📌 5. Birleştirmeler (JOINs)
JOIN ifadeleri, birden fazla tablodan veri çekmek için kullanılır. 🧠
JOIN Türü Açıklama
INNER JOIN Sadece eşleşen kayıtları getirir.
LEFT JOIN Sol tablodaki tüm kayıtları, sağ tablodaki eşleşenleri getirir.
Eşleşmeyenler için NULL döner.
RIGHT JOIN Sağ tablodaki tüm kayıtları, sol tablodaki eşleşenleri getirir.
FULL OUTER Her iki tablodaki tüm kayıtları getirir. Eşleşmeyenler için NULL döner.
JOIN
INNER JOIN -->>
LEFT JOIN -->>
RIGHT JOIN -->>
FULL JOIN -->>
🧠 Şekil 4’te farklı JOIN türlerinin görsel karşılaştırması yapılmıştır.
📌 6. Kümeleme (Aggregation) Fonksiyonları
Kümeleme fonksiyonları, birden fazla satırdan tek bir sonuç döndürür.
Fonksiyon Açıklama
COUNT() Satır sayısını döndürür.
SUM() Sayısal değerlerin toplamını verir.
AVG() Ortalama değeri hesaplar.
MIN() En küçük değeri bulur.
MAX() En büyük değeri bulur.
GROUP BY -->>
HAVING -->>
AGGREGATION Fonksiyonları -->>
🧠 Şekil 5’te bu fonksiyonların kullanım örnekleri tablo üzerinde
gösterilmiştir.
📌 7. Alt Sorgular (Subqueries)
Bir sorgu içinde kullanılan başka bir sorgudur. 🧠
Skaler Alt Sorgu: Tek bir değer döndürür.
Çok Satırlı Alt Sorgu: Birden fazla satır döndürür.
İlişkili Alt Sorgu: Ana sorguya bağlı olarak çalışır.
🧠 Şekil 6’da bu alt sorgu türlerine örnekler verilmiştir.
📌 8. SQL Operatörleri
Karşılaştırma Operatörleri
Operatör Açıklama
= Eşittir
<> veya != Eşit değildir
< , > , <= , >= Küçüktür, büyüktür, küçük eşit, büyük eşit
BETWEEN Aralık kontrolü yapar
LIKE Desen eşleştirme yapar ( % ve _ joker karakterleri)
IN Belirli değerlerden birine sahip olup olmadığını kontrol
eder
IS NULL / IS NOT NULL değer kontrolü yapar
NULL
🧠 Şekil 7’de bu operatörlerin kullanım örnekleri yer almaktadır.
📌 9. Mantıksal Operatörler
Operatör Açıklama
AND Her iki koşul da doğru olmalı
OR En az bir koşul doğru olmalı
NOT Koşulun tersini alır
🧠 Şekil 8’de bu operatörlerin kullanım senaryoları özetlenmiştir.
📌 10. CASE WHEN İfadeleri
Koşullu durumlar için kullanılır. IF-THEN-ELSE yapısının SQL karşılığıdır.
sql
SELECT ad, soyad,
CASE
WHEN notu >= 90 THEN 'A'
WHEN notu >= 80 THEN 'B'
ELSE 'C'
END AS harf_notu
FROM ogrenciler;
🧠 Şekil 9’da CASE WHEN yapısının kullanımı örnekle açıklanmıştır.
📌 11. SQL Fonksiyonları
Metin Fonksiyonları
Fonksiyon Açıklama
CONCAT() Metinleri birleştirir
SUBSTRING() Metinden parça alır
LENGTH() Karakter sayısını verir
UPPER() / LOWER() Büyük/küçük harfe çevirir
TRIM() Boşlukları temizler
🧠 Şekil 10’da bu fonksiyonların örnek çıktıları yer almaktadır.
📌 12. Veri Türleri ve Kısıtlamalar (Constraints)
Yaygın Veri Türleri
INT : Tam sayı
VARCHAR(n) : Değişken uzunlukta metin
DATE : Tarih
DECIMAL(p,s) : Ondalıklı sayı
Kısıtlamalar (Constraints)
Kısıtlayıcı Açıklama
PRIMARY KEY Tekil ve NULL olamaz
FOREIGN KEY Başka bir tabloya bağlantı sağlar
NOT NULL NULL değer alamaz
UNIQUE Tekil olmalı
CHECK Belirli bir koşulu sağlamalı
DEFAULT Varsayılan değer atar
🧠 Şekil 11’de bu kısıtlamaların tablo oluşturma sırasında nasıl kullanıldığı
gösterilmiştir.
Aşağıda, Film VT (görseldeki şemaya göre) için basitten karmaşığa doğru ilerleyen SQL örnekleri
yer alıyor.
Her sorgunun üstünde Türkçe açıklaması, altında ise SQL ifadesi verilmiştir.
1) Tüm filmleri listele
SELECT *
FROM film;
2) Sadece film adı ve yıl bilgisi (yinelenenler hariç)
SELECT DISTINCT ad, yil
FROM film;
3) 2000 sonrası çekilmiş filmler
SELECT ad, yil
FROM film
WHERE yil > 2000
ORDER BY yil DESC;
4) Belirli bir kategoriye ait filmler
SELECT [Link], [Link]
FROM film f
JOIN kategoriler k ON [Link] = [Link]
WHERE [Link] IN ('Aksiyon', 'Komedi');
5) Hiç kategorisi tanımlanmamış filmler
SELECT [Link]
FROM film f
LEFT JOIN kategoriler k ON [Link] = [Link]
WHERE [Link] IS NULL;
6) Her kategoride kaç film var?
SELECT [Link], COUNT(*) AS film_sayisi
FROM kategoriler k
GROUP BY [Link]
HAVING COUNT(*) >= 3
ORDER BY film_sayisi DESC;
7) En pahalı 5 film
SELECT ad, sFiyat
FROM film
ORDER BY sFiyat DESC
LIMIT 5;
8) Ortalama film fiyatı ile en pahalı ve en ucuz film
SELECT
MIN(sFiyat) AS en_ucuz,
MAX(sFiyat) AS en_pahali,
AVG(sFiyat) AS ortalama_fiyat
FROM film;
9) Her meslekten kaç kullanıcı var?
SELECT [Link] AS meslek, COUNT(*) AS kullanici_sayisi
FROM kullanici k
JOIN meslekler m ON [Link] = [Link]
GROUP BY [Link]
ORDER BY kullanici_sayisi DESC;
10) Satın alma tutarı 50-150 TL arasındaki işlemler
SELECT [Link], [Link], [Link], [Link] AS kullanici
FROM satinAlma s
JOIN kullanici u ON [Link] = [Link]
WHERE [Link] BETWEEN 50 AND 150;
11) Hiç satın alma yapmayan kullanıcılar
SELECT [Link], [Link]
FROM kullanici u
LEFT JOIN satinAlma s ON [Link] = [Link]
WHERE [Link] IS NULL;
12) Her filmden kaç adet satılmış?
SELECT [Link], SUM([Link]) AS toplam_adet
FROM film f
JOIN satinAlma s ON [Link] = [Link]
GROUP BY [Link]
ORDER BY toplam_adet DESC;
13) Aynı isimde birden fazla film var mı?
SELECT ad, COUNT(*) AS adet
FROM film
GROUP BY ad
HAVING COUNT(*) > 1;
14) Her ülke için ortalama satın alma tutarı
SELECT [Link] AS ulke, AVG([Link]) AS ort_tutar
FROM satinAlma sa
JOIN kullanici k ON [Link] = [Link]
JOIN sehirler s ON [Link] = [Link]
JOIN ulkeler ul ON [Link] = [Link]
GROUP BY [Link]
ORDER BY ort_tutar DESC;
15) En az bir kez “Aksiyon” filmi satın alan kullanıcılar
SELECT DISTINCT [Link], [Link]
FROM kullanici ku
JOIN satinAlma sa ON [Link] = [Link]
JOIN film f ON [Link] = [Link]
JOIN kategoriler ka ON [Link] = [Link]
WHERE [Link] = 'Aksiyon';
16) Her kategoride en az 3 filmi olan ve toplam satış adedi 100+ olan
kategoriler
SELECT [Link],
COUNT(DISTINCT [Link]) AS film_sayisi,
SUM([Link]) AS toplam_adet
FROM kategoriler ka
JOIN film f ON [Link] = [Link]
JOIN satinAlma sa ON [Link] = [Link]
GROUP BY [Link]
HAVING COUNT(DISTINCT [Link]) >= 3
AND SUM([Link]) >= 100;
17) CROSS JOIN ile tüm kullanıcı-film kombinasyonları (satın alma olmasa
bile)
SELECT [Link] AS kullanici, [Link] AS film
FROM kullanici u
CROSS JOIN film f;
18) RIGHT OUTER JOIN ile hiç satılmamış filmler
SELECT [Link], COALESCE(SUM([Link]), 0) AS satilan_adet
FROM satinAlma s
RIGHT OUTER JOIN film f ON [Link] = [Link]
GROUP BY [Link]
HAVING COALESCE(SUM([Link]), 0) = 0;
19) INNER + LEFT + RIGHT birleşimi: tüm filmler, satışları ve kategorileri
SELECT [Link],
COALESCE(SUM([Link]), 0) AS satilan,
COALESCE(string_agg([Link], ', '), 'Kategori Yok') AS
kategoriler
FROM film f
LEFT JOIN satinAlma s ON [Link] = [Link]
LEFT JOIN kategoriler k ON [Link] = [Link]
GROUP BY [Link]
ORDER BY satilan DESC;
20) Alt sorgu: Ortalama fiyatın üzerinde olan filmler
SELECT ad, sFiyat
FROM film
WHERE sFiyat > (SELECT AVG(sFiyat) FROM film)
ORDER BY sFiyat DESC;