Veritabanı Yönetim Sistemleri

Hafta 1 - Veriden Sorguya

Dr. Öğr. Üyesi Oğuz Emre Kural

2026

Öğrenme Kazanımları

Bu dersin sonunda:

  • Bir tabloda satır, sütun ve hücreyi gösterebilir; veritabanı ile DBMS’nin görevlerini ayırt edebilirsiniz.
  • Elektronik tablonun yeterli olduğu durumla DBMS’nin katkı sağladığı durumu karşılaştırabilirsiniz.
  • SELECT, FROM ve LIMIT ile tek tablodan istediğiniz veriyi okuyabilirsiniz.
  • WHERE, LIKE, BETWEEN ve IS NULL ile koşul kurabilir; ORDER BY ile sonuçları sıralayabilirsiniz.
  • COUNT, AVG, SUM, MIN, MAX ve DISTINCT ile sonuçları özetleyebilirsiniz.

Veri Nedir?

Veri, kaydedilebilen olgulardır. Bir şarkının adı ve süresi de bir nüfus sayımında sayılan kişi sayısı da veridir.

Kayıtları daha sonra bulmak, karşılaştırmak ve onlardan anlam çıkarmak için saklarız.

Kayıt Tutma İhtiyacı Yeni Değil

Üzerinde çizgiler ve kayıt işaretleri bulunan eski bir kil tablet

İnsanlar bilgiyi binlerce yıldır kaydediyor. Bu kil tablet, yazılı kayıtların eski örneklerinden biri.

Basılı Nüfus Tabloları - 1790

1790 ABD nüfus sayımında sütun başlıkları ve Vermont satırı

Tabloda Vermont için verilen toplam nüfus kaç? Nereden okuduğunuzu da gösterin.

85.539 kişi. Vermont satırındaki Total sütununda yazıyor.

Bir Şarkı Hakkındaki Veriler

Şimdi daha tanıdık bir kayda bakalım. Bohemian Rhapsody için elimizde şu bilgiler var:

Bilgi Değer
Parça adı Bohemian Rhapsody
Sanatçı Queen
Albüm Greatest Hits I
Tür Rock
Süre 358.948 milisaniye
Fiyat 0.99

Bu altı bilgi birlikte Bohemian Rhapsody için bir kayıt oluşturur.

Şarkıları Çizelgede Toplamak

Her şarkı için aynı bilgileri tutarsak kayıtları bir çizelgede toplayabiliriz.

Bohemian Rhapsody SanatçıQueen TürRock Süre358948
Enter Sandman SanatçıMetallica TürMetal Süre332251
Smells Like Teen Spirit SanatçıNirvana TürRock Süre301296
title artist genre milliseconds
Bohemian Rhapsody Queen Rock 358948
Enter Sandman Metallica Metal 332251
Smells Like Teen Spirit Nirvana Rock 301296
Üç şarkının bilgileri ayrı duruyor.

title parça adı, artist sanatçı, genre tür, milliseconds milisaniye cinsinden süre. Her şarkı bir satır.

Tablo Nedir?

Bir tablo, aynı tür kayıtları satır ve sütunlarla düzenler.

Kavram Parça kataloğundaki karşılığı
Satır Bohemian Rhapsody parçasına ait kayıt
Sütun title, artist, genre gibi özellikler
Hücre Enter Sandman satırındaki milliseconds = 332251 değeri

Satır ve sütun düzeni hem elektronik tabloda hem de ilişkisel veritabanında karşımıza çıkar.

Elektronik Tablo Ne Zaman Yeter?

Google Sheets, Apple Numbers ve Microsoft Excel birer elektronik tablo aracıdır. Kendi müzik koleksiyonunuzun listesini bu araçlardan birinde de tutabilirsiniz.

Listeyi tek kişi düzenliyor ve ara sıra dosya olarak paylaşıyorsa elektronik tablo iyi bir seçim olabilir.

Başka bir araca geçme kararını yalnızca satır sayısı belirlemez. Listeyi kimlerin, nasıl kullandığına da bakarız.

Aynı Liste Bir Mağazaya Dönüşürse

1 · Tek dosyaBir kişi, kendi koleksiyonuElektronik tablo hâlâ yeterli olabilir.
2 · Ortak kullanımMağaza ekibi kataloğu güncelliyorGün boyunca, bazen aynı anda kayıt eklenir veya düzeltilir. Kimin neyi değiştirdiği ve tutarlılık önem kazanır.
3 · UygulamaMüşteriler aynı kataloğu arıyorBinlerce parça, çok sayıda kullanıcı. Erişim hızı, güvenilir değişiklik ve tekrar kullanılabilir sorgular gerekir.

Ölçek, güncelleme sıklığı ve erişim hızı birlikte değişince bir veritabanı yönetim sistemi (DBMS) işimizi kolaylaştırır. Tek başına kayıt sayısı karar verdirmez.

Hangi Araç?

Aynı müzik kataloğu için iki durum düşünün:

  1. Listeyi tek kişi güncelliyor ve ara sıra dosya olarak paylaşıyor.
  2. Katalog büyüyor; mağaza ekibi kayıtları güncelliyor ve müşteriler aynı katalogda arama yapıyor.

İlk durumda elektronik tablo yeterli olabilir. İkincisinde ölçek, eşzamanlı güncellemeler ve arama hızı ihtiyacı DBMS’yi daha uygun bir aday yapar.

Veritabanı, DBMS ve SQL

SQLSoru sorma diliBirazdan yazacağımız sorgular
DBMSVeriyi yöneten yazılımÖrneğimiz: SQLite
VeritabanıDüzenlenmiş veriÖrneğimiz: muzik.db

SQL sorgusunu DBMS işler; DBMS veritabanındaki veriye erişir ve sonucu döndürür.

Veritabanı

Veritabanı, belirli bir amaç için düzenlenmiş veri bütünüdür. Veriyi düzenli biçimde saklar ve üzerinde işlemler yapılmasına izin verir.

Temel işlemler genellikle CRUD olarak anılır:

  • Create: Veri oluşturma
  • Read: Veri okuma
  • Update: Veri güncelleme
  • Delete: Veri silme

DBMS

DBMS (Database Management System), veritabanını oluşturmaya, okumaya, değiştirmeye ve yönetmeye yarayan yazılımdır. Sorguları işler, değişiklikleri yönetir ve sisteme göre erişim, eşzamanlılık ve güvenilirlik mekanizmaları sunar.

Dosya veriyi tutar, DBMS ise onu yönetir.

DBMS’lerin Farklı Türleri

İlişkisel
TablolarSQLite, PostgreSQL, MySQL, SQL Server, Oracle Database
Belge tabanlı
BelgelerMongoDB · JSON benzeri kayıtlar
Anahtar–değer
Anahtar → değerRedis · anahtarla hızlı erişim
Graf
Düğümler ve ilişkilerNeo4j · bağlantılar ön planda

DBMS Seçiminde Ölçütler

Gereksinim Seçimde etkisi
Verinin yapısı Tablolar, belgeler veya başka bir model uygun olabilir.
Kullanım biçimi Tek cihazdaki dosya ile ortak kullanılan uygulama farklı ihtiyaçlar doğurur.
İşletim Ayrı sunucu kurmak ve yönetmek gerekip gerekmediği önemlidir.
Güvenilirlik Eşzamanlı değişiklikler ve erişim denetimi düşünülmelidir.

Bu derste seçeceğimiz araç, ilk sorguları kolayca çalıştırmamızı sağlayacak.

Bu Derste SQLite

SQLite, ilişkisel bir DBMS’dir. Veritabanını tek bir dosyada tutar. Çalışmak için ayrı bir sunucu kurmamız gerekmez.

Bu derste SQLite ile bir müzik kataloğunu açıp SQL sorguları çalıştıracağız. Böylece ilk aşamada sunucu kurulumuyla uğraşmadan sorgulara odaklanabiliriz.

SQL Nedir?

SQL, Structured Query Language ifadesinin kısaltmasıdır.

Türkçeye genellikle Yapılandırılmış Sorgu Dili olarak çevrilir.

SQL ile veri okunabilir, eklenebilir, değiştirilebilir ve silinebilir. Bu derste yalnızca okuma ve sorgulama tarafındayız:

Seç→Filtrele→Sırala→Özetle

SQL ile Hangi Soruları Soracağız?

Müzik kataloğuna üç farklı soru sorabiliriz:

Soru İstediğimiz sonuç
Rock türündeki parçalar hangileri? Parça adları
4 dakikadan kısa ve bestecisi kayıtlı parçalar hangileri? Koşulu sağlayan parçalar
Katalogda kaç farklı tür var? Tek bir sayı

Birazdan sorguları yazarken önce nasıl bir sonuç istediğimizi belirleyeceğiz.

Chinook: Örnek Bir Müzik Mağazası

Chinook, veritabanı öğretimi için hazırlanmış açık kaynaklı bir örnek veritabanıdır. Kurgusal bir dijital müzik mağazasını modeller.

Parça kataloğuGerçek veriSanatçı, albüm, tür ve parça bilgileri gerçek bir müzik kütüphanesinden derlenmiş.
Müşteri ve çalışanlarKurgusalAdlar ve adresler uydurma; gerçek kişilere ait değil.
SatışlarRastgele üretilmişDört yıllık fatura kayıtları otomatik oluşturulmuş.

Bugün yalnızca parça kataloğuyla çalışacağız. Müşteri ve satış tabloları, birden fazla tabloyu birleştirmeyi öğrendiğimizde devreye girecek.

muzik.db Dosyasında Ne Var?

Chinook’un parça kataloğu, ders için muzik.db adlı bir SQLite dosyasında tek tabloya indirildi.

muzik.dbtracks tablosu · 3.503 parça · 10 sütun

Dosyanın içindeki tablonun adı tracks. Her parça için 10 alan tutuluyor. Sanatçı, albüm ve tür adları bu tabloda doğrudan metin olarak yer alıyor.

tracks Tablosundaki Parça Bilgileri

Alan Tür İçerik
track_id INTEGER Parçanın numarası
title TEXT Parçanın adı
artist TEXT Sanatçı veya grup
album TEXT Albüm adı
genre TEXT Müzik türü (ör. Rock, Jazz, Latin)

Metin alanları TEXT, tam sayı alanları INTEGER türünde saklanır.

tracks Tablosundaki Diğer Alanlar

Alan Tür İçerik
composer TEXT Besteci; bazı parçalarda boş
media_type TEXT Dosya biçimi (ör. MPEG audio file)
milliseconds INTEGER Süre, milisaniye cinsinden
bytes INTEGER Dosya boyutu
price REAL Fiyat, dolar

milliseconds değeri 300000 ise parça 5 dakika sürer. Veri türleri: metin (TEXT), tam sayı (INTEGER) ve ondalıklı sayı (REAL).

Veritabanına Üç Erişim Yolu

Derste bu yolu izleyeceğizVS Code terminalisqlite3 komutunu VS Code’un içindeki terminale yazarsınız. Slaytlardaki tüm komutlar bu yola göre hazırlandı.
Aynı komutlarSistem terminalimacOS ve Linux’ta Terminal, Windows’ta PowerShell. VS Code’a gerek kalmadan aynı sqlite3 komutları çalışır.
Görsel tercih edenlereGrafik arayüzDB Browser for SQLite veya SQLiteStudio. SQL’i sorgu sekmesine yazarsınız; .tables gibi nokta komutları burada çalışmaz, tabloları menüden görürsünüz.

Yol değişir, SQL değişmez. Hangisini seçerseniz seçin aynı dosyayla çalışın:

⬇ muzik.db dosyasını indir SQLite · 432 KB · tek tablo

VS Code’da Terminal

Dosyayı indirdik. Derste komutları VS Code’un içindeki terminale yazacağız; önce aracın hazır olduğunu kontrol edelim.

Terminal > New Terminal menüsünü açın. Ardından şunu yazın:

sqlite3 --version

Bir sürüm numarası görünüyorsa sqlite3 hazır. Birazdan muzik.db dosyasını burada açacağız.

Önce Dosyayı Bulalım

Dosyayı nereye indirdiğinizi bulun. Örneğin Downloads klasöründeyse terminalde o klasöre geçin:

macOS / Linux

cd ~/Downloads
ls muzik.db

Windows PowerShell

cd "$HOME\Downloads"
dir muzik.db

Dosyayı başka klasöre indirdiyseniz cd komutundaki yolu ona göre değiştirin. Son komut dosyayı göstermeli.

sqlite3 Komutu Ne Yapar?

Terminalde bulunduğunuz klasörde şu komut:

sqlite3 muzik.db
  • muzik.db varsa o veritabanını açar.
  • Yoksa aynı adla yeni, boş bir veritabanı oluşturabilir.

Bu nedenle dosya adını ve bulunduğunuz klasörü kontrol etmek önemlidir.

Ders dosyasını bir sonraki adımda -readonly ile açacağız.

Veritabanını SQLite ile Açma

Dosyayı bulduğunuz klasörde SQLite’ı bu dosyayla başlatın:

sqlite3 -readonly muzik.db

-readonly var olan dosyayı salt okunur açar: yanlış ad veya klasörde yeni boş dosya oluşturmaz; veriyi değiştirmemizi de engeller.

sqlite>

Bu istemi gördüğünüzde SQLite dosyayı açmış ve komut yazmanızı bekliyor.

Doğru Dosyayı Açtık mı?

SQLite isteminde dosyanın içindeki tablo adını kontrol edin:

.tables

Beklenen çıktı: tracks. Hiçbir tablo görünmüyorsa dosya adını ve klasörü yeniden kontrol edin.

Çıktıyı Okunur Hâle Getirelim

SQLite, sonuçları varsayılan olarak sütun başlığı olmadan ve | ile ayırarak yazar. Boş değerleri de boş hücre olarak bırakır. Slaytlardaki gibi görmek için üç ayar yapın:

.headers on
.mode box
.nullvalue NULL

Bundan sonra her sorgunun sonucu başlıklı bir kutu içinde görünür ve boş değerler NULL olarak yazılır. Bu üç komut da .tables gibi SQLite isteminin komutudur; sonlarına noktalı virgül konmaz.

Sorgu Nedir?

Sorgulama (querying), kayıtlı veriye bir soru sorup yanıtını almaktır. Bu isteğe sorgu (query) deriz.

Veritabanı Yönetim Sistemleri dersine kaç öğrenci kayıtlı?

Ders kayıtlarıBir sayı

Bu hafta en çok dinlenen parça hangisi?

Dinlenme kayıtlarıBir parça adı

Kütüphanede şu an hangi kitaplar ödünç alınabilir?

Kütüphane kayıtlarıBir kitap listesi

Şimdi ilk sorumuzu SQL ile soralım: Katalogdaki parçaların adları neler?

SELECT: Veriyi Okuma İfadesi

SQL’de bir tablodan veri okumak için SELECT ifadesi kullanılır. SQLite dahil tüm ilişkisel DBMS’lerde veri okuyan sorgular bu sözcükle başlar.

En kısa hâliyle iki parçadan oluşur:

SELECTHangi sütunlar?Sonuçta görmek istediğimiz bilgi
FROMHangi tablo?Verinin okunacağı yer
;Sorgunun sonuSQLite bunu görünce çalıştırır
SELECT sütun
FROM tablo;

SELECT ifadesi veriyi değiştirmez, yalnızca okur. Bugünkü bütün sorgularımız bu iskelet üzerine kurulacak.

İlk Sorgu: Parça Adları

Dosyayı açtık ve tracks tablosunu gördük. Parça adlarını isteyelim:

SELECT "title"
FROM "tracks";

tracks 3 örnek kayıt

title artist genre
Bohemian Rhapsody Queen Rock
Enter Sandman Metallica Metal
Smells Like Teen Spirit Nirvana Rock

Sorgu sonucu örnek

title
Bohemian Rhapsody
Enter Sandman
Smells Like Teen Spirit
Sorgu iki satır: hangi tablo, hangi sütun?

Burada yalnızca üç kayıt gösteriliyor. Sorgu çalıştırıldığında tablodaki 3.503 parçanın adı gelir; sıra garanti edilmez.

SQL Yazım Biçimi

SQL’de yaygın stil tercihleri:

  • SQL anahtar kelimeleri büyük harfle yazılır: SELECT, FROM, WHERE
  • Tablo ve sütun adları çift tırnakla yazılabilir: "title"
  • Metinsel değerler tek tırnakla yazılır: 'Rock'
  • Her sorgu noktalı virgülle biter: ;

İlk üçü okunabilirliği artıran alışkanlıklardır. Noktalı virgül ise sqlite3 isteminde zorunludur: SQLite onu görmeden sorguyu çalıştırmaz ve ...> istemiyle devamını bekler.

Birden Fazla Sütun Seçmek

Bu kez parçaların adlarını sanatçılarıyla birlikte görelim:

SELECT "title", "artist"
FROM "tracks";
title artist
For Those About To Rock (We Salute You) AC/DC
Balls to the Wall Accept
Fast As a Shark Accept
… …

Sütun adlarını virgülle ayırdık. Sonuç yine 3.503 satır: terminal dolar, ilk satırlar yukarı kayar. Birazdan yalnızca birkaç satır isteyeceğiz.

LIMIT: Satır Sayısını Sınırlama

Aynı iki sütunu isteyelim, ama bu kez yalnızca üç satır:

SELECT "title", "artist"
FROM "tracks"
LIMIT 3;

tracks ilk 5 kayıt

title artist milliseconds
For Those About To Rock (We Salute You) AC/DC 343719
Balls to the Wall Accept 342562
Fast As a Shark Accept 230619
Restless and Wild Accept 252051
Princess of the Dawn Accept 375418

Sorgu sonucu 3 satır

title artist
For Those About To Rock (We Salute You) AC/DC
Balls to the Wall Accept
Fast As a Shark Accept
Sorgu üç satır: hangi tablo, hangi sütunlar, kaç satır?

LIMIT yalnızca satır sayısını sınırlar. ORDER BY olmadan hangi satırların geleceğine güvenmeyin.

Tüm Sütunları Görmek

Tablodaki her sütuna bakmak istersek * kullanabiliriz:

SELECT *
FROM "tracks"
LIMIT 2;

Bu sorgu iki parça için 10 sütunun tamamını gösterir. Belirli bir bilgiye ihtiyacımız olduğunda sütunları tek tek yazmak sonucu okumayı kolaylaştırır.

Uygulama 1

  • tracks tablosundan iki parçanın adını (title) ve fiyatını (price) getiren sorguyu yazın.
SELECT "title", "price"
FROM "tracks"
LIMIT 2;

WHERE: Belirli Bir Ölçüte Göre Seçmek

Şimdiye kadar tablodaki bütün satırları okuduk. Çoğu soru ise belirli satırları ister: yalnızca rock parçalar, yalnızca Queen’in parçaları. Bu ölçütü WHERE ile belirtiriz:

SELECTHangi sütunlar?Sonuçta görmek istediğimiz bilgi
FROMHangi tablo?Verinin okunacağı yer
WHEREHangi satırlar?Her satır için doğru ya da yanlış olan bir koşul
SELECT sütun
FROM tablo
WHERE koşul;

Koşul her satır için ayrı sınanır; yalnızca doğru olduğu satırlar sonuca girer.

WHERE

Fiyatı 1.99 olan parçalardan iki kaydın title ve price alanlarına bakalım.

SELECT "title", "price"
FROM "tracks"
WHERE "price" = 1.99
LIMIT 2;
title price
Battlestar Galactica: The Story So Far 1.99
Occupation / Precipice 1.99

WHERE, koşulu sağlamayan satırları eler. Sayısal değer 1.99 tırnak içine alınmaz.

Metinsel Değerlerle Filtreleme

genre sütununda 25 farklı değer var. Örneğin Bohemian Rhapsody Rock, Enter Sandman Metal olarak kayıtlı.

title genre
Bohemian Rhapsody Rock
Enter Sandman Metal

Şimdi yalnızca Rock türündeki parçaların adını ve türünü isteyelim:

SELECT "title", "genre"
FROM "tracks"
WHERE "genre" = 'Rock';

'Rock' bir metinsel değer olduğu için tek tırnakta; "genre" ise sütun adı olduğu için çift tırnakta.

Sorgudan Sonuca

Bu kez Bohemian Rhapsody kaydını istiyoruz. Sorgu SQLite’a gider; SQLite tracks verisini kullanır ve sonucu döndürür.

SQL sorgusu

SELECT "title", "artist"
FROM "tracks"
WHERE "title" = 'Bohemian Rhapsody';
SQLite DBMS

tracks

title artist
Enter Sandman Metallica
Smells Like Teen Spirit Nirvana
Bohemian Rhapsody Queen

Sonuç

title artist
Bohemian Rhapsody Queen

Koşullarda Kullanacağımız İşaretler

İşaret Okunuşu Örnek koşul
= eşittir price = 0.99
!= veya <> eşit değildir price != 0.99
> / < büyüktür / küçüktür milliseconds > 300000
>= / <= büyük-eşit / küçük-eşit milliseconds <= 180000

!= ve <> aynı “eşit değil” karşılaştırmasını yapar. NOT ise yazdığımız koşulu tersine çevirebilir.

Eşit Olmayan Değerler

Az önce = ile yalnızca Rock kayıtlarını seçtik. Rock olmayan parçaları yazmanın üç yolu var:

SELECT "title", "genre"
FROM "tracks"
WHERE "genre" != 'Rock';

WHERE "genre" <> 'Rock' veya WHERE NOT "genre" = 'Rock' aynı karşılaştırmanın diğer yazımlarıdır. Katalogda 25 tür bulunduğu için sonuç, kalan 24 türden gelen 2.206 parçadır.

AND ve OR ile Bileşik Koşullar

Birden fazla koşul birleştirilebilir.

SELECT "title", "artist"
FROM "tracks"
WHERE "genre" = 'Rock'
   OR "genre" = 'Metal';

OR: koşullardan en az biri doğruysa satır gelir.

SELECT "title", "artist"
FROM "tracks"
WHERE "genre" = 'Rock'
  AND "milliseconds" < 180000;

AND: koşulların hepsi doğruysa satır gelir.

Soldaki sorgu rock veya metal parçaları, sağdaki 3 dakikadan kısa rock parçaları getirir.

Parantez ile Koşul Önceliği

Karmaşık koşullarda parantez kullanmak sorguyu daha açık hale getirir.

SELECT "title", "genre"
FROM "tracks"
WHERE ("genre" = 'Rock' OR "genre" = 'Metal')
  AND "milliseconds" < 180000;

Bu sorgu, 3 dakikadan kısa rock veya metal parçaları getirir. Katalogda böyle 178 parça var.

NULL: Eksik Değerler

NULL, veritabanında değerin bulunmadığını ifade eder.

Besteci bilgisi bulunmayan parçalardan iki tanesine bakalım.

SELECT "title", "artist"
FROM "tracks"
WHERE "composer" IS NULL
LIMIT 2;
title artist
Balls to the Wall Accept
Desafinado Antônio Carlos Jobim

NULL, sıfır veya boş metin değildir; değerin yokluğunu temsil eder. Katalogda bestecisi boş 978 parça var. Dolu olanları aramak için IS NOT NULL kullanılır.

LIKE: Adın Tamamını Bilmeden Aramak

Bir parçanın adında love geçtiğini hatırlıyoruz, ama adının tamamını değil. = burada işe yaramaz: eşittir tam eşleşme ister.

Böyle durumlarda metni bir örüntüyle karşılaştırır, bilmediğimiz kısımların yerine joker karakter koyarız:

LIKEÖrüntüyle karşılaştır= yerine geçer; tam eşleşme yerine uyum arar
%Herhangi bir şeySıfır veya daha fazla karakter, ne olduğu önemsiz
_Tek bir karakterTam olarak bir karakter, ne olduğu önemsiz
WHERE "sütun" LIKE 'örüntü';

LIKE ile İlk Arama

Adında love geçen parçaları bulmak için:

SELECT "title"
FROM "tracks"
WHERE "title" LIKE '%love%';

% işaretleri “love”dan önce ve sonra herhangi bir şey olabilir diyor. Bu sorgu katalogda 114 parça bulur; Love in the Big City de All My Love da gelir.

LIKE ve % Kullanımı

Örüntü Anlamı
'love%' love ile başlayan değerler
'%love' love ile biten değerler
'%love%' içinde love geçen değerler
'The %' The ve boşluk ile başlayan değerler

LIKE ve _ Kullanımı

_, tek bir karakteri temsil eder.

Örneğin yazımı tam bilinmeyen bir parça adını bulmak için:

SELECT "title"
FROM "tracks"
WHERE "title" LIKE 'F_re';

Bu örüntü Fire veya Fare gibi dört karakterli değerlerle eşleşebilir. Katalogda Fire adlı bir parça var.

LIKE ve Büyük/Küçük Harf

SQLite’ta varsayılan LIKE, ASCII harflerde büyük/küçük harfi ayırmaz. Türkçe karakterlerde aynı sonucu varsaymayın.

SELECT "title"
FROM "tracks"
WHERE "title" LIKE 'bohemian rhapsody';

Varsayılan metin karşılaştırmasında = ise büyük/küçük harfi ayırır. Aşağıdaki sorgu hiçbir satır döndürmez:

SELECT "title"
FROM "tracks"
WHERE "title" = 'bohemian rhapsody';

Süre Aralığı: BETWEEN

3 ile 4 dakika arasındaki parçaları seçmek için:

SELECT "title", "milliseconds"
FROM "tracks"
WHERE "milliseconds" BETWEEN 180000 AND 240000;

BETWEEN iki sınırı da dahil eder. Aynı koşul "milliseconds" >= 180000 AND "milliseconds" <= 240000 biçiminde yazılabilir. Katalogda bu aralıkta 982 parça var.

Kataloğu Elle Filtreleyelim

Bu beş kayıt tracks tablosundan. Mağaza, Guns N’ Roses’ın 4 dakikadan kısa ve bestecisi kayıtlı parçalarından bir liste hazırlıyor. Hangi satırlar kalır?

title artist milliseconds composer
Bohemian Rhapsody Queen 358948 Mercury, Freddie
Sweet Child O’ Mine Guns N’ Roses 356424 NULL
Shotgun Blues Guns N’ Roses 203206 W. Axl Rose
It’s So Easy Guns N’ Roses 202824 NULL
My World Guns N’ Roses 84532 W. Axl Rose

Guns N’ Roses: 4 parça 4 dakikadan kısa: 3 parça Bestecisi kayıtlı: 2 parça

Shotgun Blues ve My World kalır.

Aynı Filtrenin SQL Karşılığı

Az önce elle elediğimiz satırları şimdi tracks tablosunun tamamında SQL ile bulalım.

SELECT "title", "milliseconds"
FROM "tracks"
WHERE "artist" = 'Guns N'' Roses'
  AND "milliseconds" < 240000
  AND "composer" IS NOT NULL;
title milliseconds
Yesterdays 196205
Shotgun Blues 203206
My World 84532

Metin içindeki kesme işareti '' biçiminde iki kez yazılır.

Uygulama 2: Koşul Kurma

Katalogda Paranoid adlı iki parça var. Bestecisi kayıtlı olmayanın albüm adını bulun.

SELECT "title", "album"
FROM "tracks"
WHERE "title" = 'Paranoid'
  AND "composer" IS NULL;

Sonuç: Speak of the Devil

ORDER BY: Sonucu Sıraya Koymak

Şimdiye kadar satırlar geldikleri sırayla listelendi ve bu sıraya güvenemeyeceğimizi söyledik. Oysa çoğu soru bir sıra ister: en uzun parçalar, alfabetik liste, en ucuzdan pahalıya.

Sırayı ORDER BY ile biz belirleriz:

ORDER BYHangi sütuna göre?Satırlar bu sütunun değerine bakılarak dizilir
ASC / DESCHangi yönde?Artan ya da azalan; yazılmazsa artan
+ LIMITEn … olan N taneSıralayıp ilk N satırı almak “en uzun üç” demektir
SELECT sütun
FROM tablo
ORDER BY sütun DESC;

ORDER BY ile İlk Sıralama

En uzun üç parçayı bulalım.

SELECT "title", "artist", "milliseconds"
FROM "tracks"
ORDER BY "milliseconds" DESC
LIMIT 3;
title artist milliseconds
Occupation / Precipice Battlestar Galactica 5286953
Through a Looking Glass Lost 5088838
Greetings from Earth, Pt. 1 Battlestar Galactica (Classic) 2960293

DESC azalan, ASC artan sıradır. SQLite’ta yön yazılmazsa ASC kullanılır.

Birden Fazla Sütuna Göre Sıralama

Eşit fiyatlı parçalarda süreye göre ikinci bir sıralama yapılabilir.

SELECT "title", "price", "milliseconds"
FROM "tracks"
ORDER BY "price" DESC, "milliseconds" DESC
LIMIT 10;

Önce price, eşitlik durumunda milliseconds dikkate alınır.

Metinleri Sıralama

Parça adlarını alfabetik sıralamak için:

SELECT "title"
FROM "tracks"
ORDER BY "title";

Ters alfabetik sıralama için:

SELECT "title"
FROM "tracks"
ORDER BY "title" DESC;

Toplulaştırma: Tek Bir Yanıt İstemek

Şimdiye kadar her sonuç satırı tablodaki bir parçaydı. Oysa bazı sorular tek bir sayı ister: kaç parça var, ortalama fiyat ne, en uzun parça kaç dakika?

Bu sorular satırları tek tek değil, hepsini birden özetler. Bunu toplulaştırma (aggregate) fonksiyonları yapar:

GirdiBir sütunun tüm değerleriÖrneğin 3.503 parçanın fiyatı
FonksiyonCOUNT, AVG, SUM, MIN, MAXSayar, ortalar, toplar, en küçüğü ya da en büyüğü bulur
ÇıktıTek bir değerSonuç tablosunda tek satır
SELECT FONKSİYON("sütun")
FROM tablo;

AVG: Ortalama Fiyat

Parçaların ortalama fiyatını bulalım:

SELECT AVG("price")
FROM "tracks";

Sonuç yaklaşık 1.0508. AVG binlerce fiyatı tek bir ortalama değere indirger.

ROUND: Ortalamayı Yuvarlama

Ortalamayı iki ondalık basamakla göstermek için ROUND kullanırız:

SELECT ROUND(AVG("price"), 2)
FROM "tracks";

Sonuç: 1.05. Parantez içindeki 2, ondalık basamak sayısıdır.

AS: Sonuç Sütununa Ad Verme

Hesaplanan sütunun başlığını anlaşılır kılalım:

SELECT ROUND(AVG("price"), 2) AS "average_price"
FROM "tracks";
average_price
1.05

AS, sonuç sütununa ad verir. Veritabanındaki price sütununu değiştirmez.

MIN ve MAX: En Kısa ve En Uzun Parça

SELECT MIN("milliseconds") AS "shortest",
       MAX("milliseconds") AS "longest"
FROM "tracks";
shortest longest
1071 5286953

MIN en küçük, MAX en büyük değeri bulur. En kısa kayıt bir saniye, en uzunu yaklaşık 88 dakika. Metinlerde bu işlevler uzunluğa göre değil alfabetik sıraya göre çalışır.

SUM: Toplam Fiyat

Katalogdaki tüm parçaları tek tek satın almak kaça mal olur?

SELECT SUM("price") AS "catalog_total"
FROM "tracks";

Sonuç: 3680.97. SUM sayısal sütundaki değerleri toplar.

COUNT: Satır Sayma

Tabloda 3.503 parça var. Kaçının besteci bilgisi dolu?

SELECT COUNT(*) AS "track_count",
       COUNT("composer") AS "with_composer"
FROM "tracks";

3503 − 978 = 2525

3.503 parça, 978 eksik besteci, 2.525 dolu kayıt

COUNT(*) satırları sayar. COUNT("composer") ise NULL değerleri saymaz.

DISTINCT: Tekil Değerler

Aynı tür binlerce parçada geçer. Katalogda kaç farklı tür var?

SELECT COUNT(DISTINCT "genre") AS "genre_count"
FROM "tracks";

Sonuç: 25. COUNT(*) burada 3503 dönerdi; DISTINCT tekrar eden türleri tekilleştirir.

Türlerin adlarını görmek için:

SELECT DISTINCT "genre"
FROM "tracks";

Uygulama 3: Farklı Sanatçılar

Metal türündeki parçaların kaç farklı sanatçıdan geldiğini bulun. Önce sorgunuzu yazın, sonra çalıştırın.

SELECT COUNT(DISTINCT "artist")
FROM "tracks"
WHERE "genre" = 'Metal';

Sonuç: 14. Metal türünde 374 parça var, fakat bunlar yalnızca 14 sanatçıya ait.

Genel Sorgu Şablonu

Birçok temel SQL sorgusu şu yapıya sahiptir.

SELECT "column"
FROM "table"
WHERE condition
ORDER BY "column" DESC
LIMIT n;

Her sorguda tüm bölümler olmak zorunda değildir.

Bu Bölümde Görülen Anahtar Kelimeler

Amaç SQL
Veri seçme SELECT, FROM
Sınırlama LIMIT
Filtreleme WHERE, AND, OR, NOT
Eksik değer IS NULL, IS NOT NULL
Örüntü arama LIKE, %, _
Aralık >, <, >=, <=, BETWEEN
Sıralama ORDER BY, ASC, DESC
Özetleme AVG, COUNT, MIN, MAX, SUM
Tekilleştirme DISTINCT
Yeniden adlandırma AS

Alıştırmalar

Mağaza ekibi, tracks verisini kullanarak çalma listeleri hazırlıyor ve katalogdaki eksikleri kontrol ediyor.

Önce nasıl bir sonuç istendiğini belirleyin: parça listesi mi, tek bir sayı mı? Ardından gerekli sütunları ve koşulları seçin.

Soru 1: Albümün Uzun Parçaları

Ekip, Appetite for Destruction albümünden 5 dakikadan uzun parçaların adını ve süresini istiyor. En uzun parça üstte olsun. Nasıl sorgularsınız?

SELECT "title", "milliseconds"
FROM "tracks"
WHERE "album" = 'Appetite for Destruction' AND "milliseconds" > 300000
ORDER BY "milliseconds" DESC;

Sonuç: Paradise City (406347), Rocket Queen (375349), Sweet Child O’ Mine (356424).

Soru 2: Üç ile Dört Dakika Arası

Ekip, Black Album albümünden 3 ile 4 dakika arasındaki parçaların adını ve süresini, en uzundan başlayarak istiyor. Nasıl sorgularsınız?

SELECT "title", "milliseconds"
FROM "tracks"
WHERE "album" = 'Black Album'
  AND "milliseconds" BETWEEN 180000 AND 240000
ORDER BY "milliseconds" DESC;

Sonuç: The Struggle Within (234240), Holier Than Thou (227892).

Soru 3: Adı The ile Başlayanlar

Ekip, Queen’in parçaları arasından adı The sözcüğüyle başlayanları arıyor. Parça adlarını nasıl getirirsiniz?

SELECT "title"
FROM "tracks"
WHERE "artist" = 'Queen' AND "title" LIKE 'The %';

Sonuç: The Miracle, The Invisible Man, The Show Must Go On.

Soru 4: Bu Sorguda Ne Yanlış?

Ekip, besteci bilgisi eksik parçaları saymak istiyor. Aşağıdaki sorgu 0 getiriyor. Oysa eksik bilgi var. Neden?

SELECT COUNT(*)
FROM "tracks"
WHERE "composer" = NULL;

Hatayı bulun ve sorguyu düzeltin.

Soru 4: Düzeltme

NULL bir değer gibi = ile karşılaştırılmaz. Eksik besteci bilgisini şöyle sayabiliriz:

SELECT COUNT(*) AS "missing_composer"
FROM "tracks"
WHERE "composer" IS NULL;

Sonuç: 978 parça. NULL için = yerine IS NULL kullanılır.

Soru 5: Video Kataloğunun Özeti

Ekip, fiyatı 1.99 olan kayıtların sayısını ve bunların toplam fiyatını tek satırda görmek istiyor. Toplamı iki ondalık basamakla gösterin.

SELECT COUNT(*) AS "video_count",
       ROUND(SUM("price"), 2) AS "video_total"
FROM "tracks"
WHERE "price" = 1.99;

Sonuç: 213 kayıt, toplam 423.87 dolar.

SQLite Oturumunu Kapatma

Sorgularınız bittiğinde SQLite isteminden çıkabilirsiniz:

.quit

Bu, SQL sorgusu değil, SQLite komut satırına ait bir komuttur.

Çıkış Soruları

Çalıştığımız müzik kataloğuna dönün. Üç kısa yanıt yazın:

  1. Enter Sandman’in süresini hangi satır ve sütunda bulursunuz?
  2. DBMS hangi durumda daha yararlıdır: tek kişinin dosyasında mı, ortak uygulamada mı? Neden?
  3. Aşağıdaki sorgu hangi parçanın adını getirir?
SELECT "title"
FROM "tracks"
WHERE "artist" = 'Queen'
ORDER BY "milliseconds" DESC
LIMIT 1;

Kaynaklar