Hafta 1 - Veriden Sorguya
2026
Bu dersin sonunda:
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, 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.

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

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.
Ş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.
Her şarkı için aynı bilgileri tutarsak kayıtları bir çizelgede toplayabiliriz.
| title | artist | genre | milliseconds |
|---|---|---|---|
| Bohemian Rhapsody | Queen | Rock | 358948 |
| Enter Sandman | Metallica | Metal | 332251 |
| Smells Like Teen Spirit | Nirvana | Rock | 301296 |
title parça adı, artist sanatçı, genre tür, milliseconds milisaniye cinsinden süre. Her şarkı bir satır.
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.
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.
Ö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.
Aynı müzik kataloğu için iki durum düşünün:
İ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.
muzik.db
SQL sorgusunu DBMS işler; DBMS veritabanındaki veriye erişir ve sonucu döndürür.
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:
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.
| 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.
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, 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
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, veritabanı öğretimi için hazırlanmış açık kaynaklı bir örnek veritabanıdır. Kurgusal bir dijital müzik mağazasını modeller.
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.
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).
sqlite3 komutunu VS Code’un içindeki terminale yazarsınız. Slaytlardaki tüm komutlar bu yola göre hazırlandı.
sqlite3 komutları çalışır.
.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:
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:
Bir sürüm numarası görünüyorsa sqlite3 hazır. Birazdan muzik.db dosyasını burada açacağız.
Dosyayı nereye indirdiğinizi bulun. Örneğin Downloads klasöründeyse terminalde o klasöre geçin:
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:
muzik.db varsa o veritabanını açar.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.
Dosyayı bulduğunuz klasörde SQLite’ı bu dosyayla başlatın:
-readonly var olan dosyayı salt okunur açar: yanlış ad veya klasörde yeni boş dosya oluşturmaz; veriyi değiştirmemizi de engeller.
Bu istemi gördüğünüzde SQLite dosyayı açmış ve komut yazmanızı bekliyor.
SQLite isteminde dosyanın içindeki tablo adını kontrol edin:
Beklenen çıktı: tracks. Hiçbir tablo görünmüyorsa dosya adını ve klasörü yeniden kontrol edin.
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:
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.
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ı?
Bu hafta en çok dinlenen parça hangisi?
Kütüphanede şu an hangi kitaplar ödünç alınabilir?
Şimdi ilk sorumuzu SQL ile soralım: Katalogdaki parçaların adları neler?
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:
SELECT ifadesi veriyi değiştirmez, yalnızca okur. Bugünkü bütün sorgularımız bu iskelet üzerine kurulacak.
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 |
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’de yaygın stil tercihleri:
SELECT, FROM, WHERE"title"'Rock';İ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.
Bu kez parçaların adlarını sanatçılarıyla birlikte görelim:
| 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.
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 |
LIMIT yalnızca satır sayısını sınırlar. ORDER BY olmadan hangi satırların geleceğine güvenmeyin.
Tablodaki her sütuna bakmak istersek * kullanabiliriz:
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.
tracks tablosundan iki parçanın adını (title) ve fiyatını (price) getiren sorguyu yazın.Ş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:
Koşul her satır için ayrı sınanır; yalnızca doğru olduğu satırlar sonuca girer.
Fiyatı 1.99 olan parçalardan iki kaydın title ve price alanlarına bakalım.
| 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.
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:
'Rock' bir metinsel değer olduğu için tek tırnakta; "genre" ise sütun adı olduğu için çift tırnakta.
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';
tracks
| title | artist |
|---|---|
| Enter Sandman | Metallica |
| Smells Like Teen Spirit | Nirvana |
| Bohemian Rhapsody | Queen |
Sonuç
| title | artist |
|---|---|
| Bohemian Rhapsody | Queen |
| İş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.
Az önce = ile yalnızca Rock kayıtlarını seçtik. Rock olmayan parçaları yazmanın üç yolu var:
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.
Birden fazla koşul birleştirilebilir.
OR: koşullardan en az biri doğruysa satır gelir.
Soldaki sorgu rock veya metal parçaları, sağdaki 3 dakikadan kısa rock parçaları getirir.
Karmaşık koşullarda parantez kullanmak sorguyu daha açık hale getirir.
Bu sorgu, 3 dakikadan kısa rock veya metal parçaları getirir. Katalogda böyle 178 parça var.
NULL, veritabanında değerin bulunmadığını ifade eder.
Besteci bilgisi bulunmayan parçalardan iki tanesine bakalım.
| 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.
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:
= yerine geçer; tam eşleşme yerine uyum arar
Adında love geçen parçaları bulmak için:
% 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.
| Ö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 |
_, tek bir karakteri temsil eder.
Örneğin yazımı tam bilinmeyen bir parça adını bulmak için:
Bu örüntü Fire veya Fare gibi dört karakterli değerlerle eşleşebilir. Katalogda Fire adlı bir parça var.
SQLite’ta varsayılan LIKE, ASCII harflerde büyük/küçük harfi ayırmaz. Türkçe karakterlerde aynı sonucu varsaymayın.
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:
3 ile 4 dakika arasındaki parçaları seçmek için:
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.
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.
Az önce elle elediğimiz satırları şimdi tracks tablosunun tamamında SQL ile bulalım.
| title | milliseconds |
|---|---|
| Yesterdays | 196205 |
| Shotgun Blues | 203206 |
| My World | 84532 |
Metin içindeki kesme işareti '' biçiminde iki kez yazılır.
Katalogda Paranoid adlı iki parça var. Bestecisi kayıtlı olmayanın albüm adını bulun.
Ş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:
En uzun üç parçayı bulalım.
| 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.
Eşit fiyatlı parçalarda süreye göre ikinci bir sıralama yapılabilir.
Önce price, eşitlik durumunda milliseconds dikkate alınır.
Parça adlarını alfabetik sıralamak için:
Ters alfabetik sıralama için:
Ş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:
Parçaların ortalama fiyatını bulalım:
Sonuç yaklaşık 1.0508. AVG binlerce fiyatı tek bir ortalama değere indirger.
Ortalamayı iki ondalık basamakla göstermek için ROUND kullanırız:
Sonuç: 1.05. Parantez içindeki 2, ondalık basamak sayısıdır.
Hesaplanan sütunun başlığını anlaşılır kılalım:
| average_price |
|---|
| 1.05 |
AS, sonuç sütununa ad verir. Veritabanındaki price sütununu değiştirmez.
| 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.
Katalogdaki tüm parçaları tek tek satın almak kaça mal olur?
Sonuç: 3680.97. SUM sayısal sütundaki değerleri toplar.
Tabloda 3.503 parça var. Kaçının besteci bilgisi dolu?
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.
Aynı tür binlerce parçada geçer. Katalogda kaç farklı tür var?
Sonuç: 25. COUNT(*) burada 3503 dönerdi; DISTINCT tekrar eden türleri tekilleştirir.
Türlerin adlarını görmek için:
Metal türündeki parçaların kaç farklı sanatçıdan geldiğini bulun. Önce sorgunuzu yazın, sonra çalıştırın.
Birçok temel SQL sorgusu şu yapıya sahiptir.
Her sorguda tüm bölümler olmak zorunda değildir.
| 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 |
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.
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?
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?
The ile BaşlayanlarEkip, Queen’in parçaları arasından adı The sözcüğüyle başlayanları arıyor. Parça adlarını nasıl getirirsiniz?
Ekip, besteci bilgisi eksik parçaları saymak istiyor. Aşağıdaki sorgu 0 getiriyor. Oysa eksik bilgi var. Neden?
Hatayı bulun ve sorguyu düzeltin.
NULL bir değer gibi = ile karşılaştırılmaz. Eksik besteci bilgisini şöyle sayabiliriz:
Sonuç: 978 parça. NULL için = yerine IS NULL kullanılır.
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.
Sorgularınız bittiğinde SQLite isteminden çıkabilirsiniz:
Bu, SQL sorgusu değil, SQLite komut satırına ait bir komuttur.
Çalıştığımız müzik kataloğuna dönün. Üç kısa yanıt yazın:
muzik.db, Chinook’un parça kataloğundan ders için türetilmiştir; lisans metni.BİL309 - Veritabanı Yönetim Sistemleri – OMÜ | 🏠