Tablolar Arasındaki İlişkiler
2026
Bu dersin sonunda:
JOIN ile birden fazla tablodaki bilgiyi bir araya getirebilirsiniz.GROUP BY ve HAVING ile ilişkisel veriye yeni sorular sorabilirsiniz.muzik.db dosyasındaki tracks tablosunda bir satır şöyleydi:
| track_id | title | artist | album | genre |
|---|---|---|---|---|
| 2254 | Bohemian Rhapsody | Queen | Greatest Hits I | Rock |
Parçayla ilgili bilgilere tek satırdan ulaşmak kolaydı. Bu, ilk sorgularımız için iyi bir başlangıçtı.
| track_id | title | artist | album |
|---|---|---|---|
| 419 | A Kind Of Magic | Queen | Greatest Hits II |
| 420 | Under Pressure | Queen | Greatest Hits II |
| 2254 | Bohemian Rhapsody | Queen | Greatest Hits I |
artist ve album değerleri her parça satırında yeniden yer alıyor.
Bir satırda Queen, başka bir satırda yanlışlıkla Quen yazdığımızı düşünelim. Aynı sanatçı için iki farklı ad oluşur.
Bu, yalnızca yazım hatası değildir. Sanatçıya göre arama ve sayım sonuçları da değişir.
Peki sanatçının adını her parçada tutmak zorunda mıyız?
İki dosyada da aynı 3.503 parça var. Fark, albüm ve sanatçı adını nerede tuttuğumuz.
İlk ders: muzik.db
|
Örnek bilgi |
Bu ders: chinook.db
|
|---|---|---|
tracksTek satırda |
Bohemian Rhapsody |
Track.Name
|
| Greatest Hits I |
Album.Title
|
|
| Queen |
Artist.Name
|
chinook.db içinde toplam 11 tablo var. Burada bu parçayla ilgili üçünü görüyoruz.
Track ve Album ayrı tablolarda. Önce bağlantı sütunlarını gizleyip yalnızca adlara bakalım.
| Name |
|---|
| Bohemian Rhapsody |
| We Will Rock You |
| We Will Rock You |
| Title |
|---|
| Greatest Hits I |
| News Of The World |
We Will Rock You iki kez geçiyor. Bu hâliyle hangi satırın hangi albüme ait olduğunu tablolardan okuyamayız.
Aynı kayıtlara bu kez AlbumId sütunuyla bakalım.
| TrackId | Name | AlbumId |
|---|---|---|
| 2254 | Bohemian Rhapsody | 185 |
| 2269 | We Will Rock You | 185 |
| 2271 | We Will Rock You | 186 |
| AlbumId | Title |
|---|---|
| 185 | Greatest Hits I |
| 186 | News Of The World |
AlbumId değeri 185 olan parçalar Greatest Hits I albümüne, 186 olan parça News Of The World albümüne bağlı.
chinook.db Dosyasını Açalımchinook.db dosyasını indirin. muzik.db ile aynı klasöre koyabilirsiniz.
Terminalde dosyanın bulunduğu klasöre geçip şu komutu çalıştırın:
İlk dersteki çıktı ayarlarını yeniden yapın:
SQLite isteminde:
Bugün ağırlıkla Artist, Album, Track, Genre, Playlist ve PlaylistTrack tablolarını kullanacağız.
.tables SQL sorgusu değil, sqlite3 komutudur.
Bohemian Rhapsody için üç ayrı tabloda şu kayıtlar var:
Track
| TrackId | Name | AlbumId |
|---|---|---|
| 2254 | Bohemian Rhapsody | 185 |
Album
| AlbumId | Title | ArtistId |
|---|---|---|
| 185 | Greatest Hits I | 51 |
Artist
| ArtistId | Name |
|---|---|
| 51 | Queen |
Track.AlbumId = 185 bizi albüme, Album.ArtistId = 51 sanatçıya götürür.
İlişkisel veritabanında bilgiler, tanımlı sütunlara sahip tablolarda tutulur. Tablolar arasındaki bağlantıları anahtar değerleri kurar.
Buradaki ilişki yolu:
Tek tablodaki görünümü gerektiğinde bu bağlantıları kullanarak yeniden elde ederiz.
Bir albüme birden fazla parça bağlanabiliyor. Aşağıdaki üç çizimde bağlantı sayıları nasıl değişiyor?
| Biçim | Örnek | Nasıl okunur? |
|---|---|---|
| Bire bir | Öğrenci ve öğrenci kartı | Bir öğrencinin en fazla bir kartı, bir kartın en fazla bir sahibi olur. |
| Bire çok | Album ve Track |
Bir albüme birçok parça bağlanabilir. Her Track kaydı en fazla bir albüme bağlıdır. |
| Çoka çok | Playlist ve Track |
Bir listede birçok parça bulunur; aynı parça başka listelerde de yer alabilir. |
Öğrenci kartı örneği Chinook’ta yok. Çalma listeleri ile parçalar arasındaki bağlantıyı PlaylistTrack tutuyor.
ER (Entity–Relationship, varlık–ilişki) diyagramı, veritabanında hangi varlıkların bulunduğunu ve bunların nasıl ilişkilendiğini gösterir.
Album ve Track ayrı tablolar. Aralarındaki çizgi, bu iki tablonun ilişkili olduğunu gösteriyor.
Bu çizimde 11 tablonun tamamı var. Bağlantı uçlarındaki daire, dik çizgi ve çatal kaç kaydın eşleşebileceğini gösteriyor.
Çizginin uçları, iki tablo arasında kaç kayıt eşleşebileceğini gösterir.
Daireyle dik çizgi bir aradaysa sıfır veya bir; daireyle çatallı uç bir aradaysa sıfır veya daha fazla kayıt eşleşebilir.
Chinook’a bir sanatçı, albümü eklenmeden de kaydedilebilir. Albümleri varsa hepsi aynı sanatçıya bağlanır. Album tarafındaki 0..çok işareti bunu gösterir.
Chinook’ta Queen’e üç albüm bağlı. Azymuth içinse bu katalogda albüm kaydı yok.
Chinook’ta her Album kaydının bir ArtistId değeri var. Bu yüzden albümden sanatçıya doğru bakınca 1 görüyoruz.
Greatest Hits I kaydındaki ArtistId 51; bu değer Queen kaydını gösteriyor.
Track.GenreId boş bırakılabilir. Türü henüz girilmemiş bir parça kaydedildiğinde, o parça hiçbir Genre kaydıyla eşleşmez. Türü girilirse bir kayıtla eşleşir: 0..1.
Bohemian Rhapsody kaydında GenreId 1, yani türü Rock. Alan boş olsaydı türü henüz belirtilmemiş olacaktı.
We Will Rock You adına göre arayınca iki parça kaydı çıkıyor.
| Parça adı | Sanatçı | Albüm | TrackId |
|---|---|---|---|
| We Will Rock You | Queen | Greatest Hits I | 2269 |
| We Will Rock You | Queen | News Of The World | 2271 |
ISBN, kitabın belirli baskısına yayıncılıkta verilen kimliktir. TrackId ise Chinook'un bir parça kaydına verdiği numaradır.
Birincil anahtar (primary key), tablodaki bir kaydı tekil olarak tanımlar.
Track tablosundaki iki kayda bakalım:
| TrackId | Name | AlbumId |
|---|---|---|
| 77 | Enter Sandman | 9 |
| 1801 | Enter Sandman | 148 |
77: Apocalyptica’nın yorumu. 1801: Metallica’nın kaydı.
Bu iki satırı hangi sütun ayırıyor?
Bu üç tabloda kayıtları ayıran birincil anahtarlar:
| Tablo | Kayıt | Birincil anahtar |
|---|---|---|
Artist |
Queen | ArtistId = 51 |
Album |
Greatest Hits I | AlbumId = 185 |
Track |
Bohemian Rhapsody | TrackId = 2254 |
Bohemian Rhapsody satırındaki AlbumId = 185 değeri, Album tablosunda 185 numaralı kaydı bulmamızı sağlar.
Yabancı anahtar (foreign key), başka bir tablodaki kayda işaret eder.
| TrackId | Name | AlbumId |
|---|---|---|
| 2254 | Bohemian Rhapsody | 185 |
| AlbumId | Title | ArtistId |
|---|---|---|
| 36 | Greatest Hits II | 51 |
| 185 | Greatest Hits I | 51 |
| ArtistId | Name |
|---|---|
| 50 | Metallica |
| 51 | Queen |
Parçadaki AlbumId değeri bizi hangi albüme götürür?
Parça satırında albüm adını, albüm satırında sanatçı adını tekrar etmeyiz. İlgili kayıtların kimliklerini tutarız.
ArtistId = 51 olan Queen’in üç albümü var:
| ArtistId | Name |
|---|---|
| 51 | Queen |
| AlbumId | Title | ArtistId |
|---|---|---|
| 36 | Greatest Hits II | 51 |
| 185 | Greatest Hits I | 51 |
| 186 | News Of The World | 51 |
Her albüm tek bir sanatçı kaydına işaret ediyor. Bir sanatçı ise birçok albüme bağlanabiliyor. Buna bire çok ilişki deriz.
Smells Like Teen Spirit (TrackId = 1990) birden fazla listede bulunuyor:
| PlaylistId | Name |
|---|---|
| 1 | Music |
| 5 | 90’s Music |
| 8 | Music |
| PlaylistId | TrackId |
|---|---|
| 1 | 1990 |
| 5 | 1990 |
| 8 | 1990 |
| TrackId | Name |
|---|---|
| 1990 | Smells Like Teen Spirit |
PlaylistTrack yalnızca kimlik çiftlerini saklar. Liste adı Playlistte, parça adı Tracktedir.
PlaylistTrack tablosunun iki sütunu var:
| PlaylistId | TrackId |
|---|---|
| 1 | 1990 |
| 5 | 1990 |
| 8 | 1990 |
Tek bir satırın anlamı: “Bu parça bu listede yer alıyor.”
Birincil anahtar (PlaylistId, TrackId) çiftidir. TrackId = 1990 farklı listelerde bulunabilir; (1, 1990) çifti tekrar edemez.
SQLite isteminde şu komut tablo tanımını gösterir:
Tanımın önemli kısmı:
Birincil anahtar satırı benzersiz kılar; iki yabancı anahtar bağlantının uçlarını tanımlar.
TrackId = 2254 kaydının AlbumId değeri 185. AlbumId = 185 kaydının ArtistId değeri 51.
Bu parçanın albümü ve sanatçısı nedir?
AlbumId = 185 → Greatest Hits I. ArtistId = 51 → Queen.
Tabloları sorgularken üç hareket sık görülür:
| İstediğimiz | SQL’de karşılığı |
|---|---|
| Bazı satırları seçmek | WHERE |
| Bazı sütunları seçmek | SELECT içindeki sütun listesi |
| İlişkili satırları birleştirmek | JOIN ... ON ... |
İlişkisel cebirde bunlara sırasıyla seçme (σ), izdüşüm (π) ve birleştirme (⨝) denir. SQL bu düşünceleri veritabanında çalıştırmamızı sağlar.
Soru: Queen’in albümleri hangileri?
Album tablosunda sanatçı adı yok, ArtistId var. Önce Queen’in kimliğini, sonra bu kimliğe bağlı albümleri bulabiliriz.
| ArtistId |
|---|
| 51 |
ArtistId bir sanatçıyı işaret eder; Name insanın okuyabileceği addır.
| Title |
|---|
| Greatest Hits II |
| Greatest Hits I |
| News Of The World |
Bu sorgu çalışır. Fakat 51 değerini önceki sorgudan elle aldık.
Bir sorgunun sonucunu başka bir sorguda kullanabiliriz:
İçteki sorgu Queen’in kimliğini sağlar. Dıştaki sorgu bu kimliğe bağlı albümleri getirir.
Soru: Queen’in parçaları hangileri? Trackte sanatçı yok, AlbumId var. Queen’in üç albümü olduğu için içteki sorgu üç kimlik döndürür; = tek değer bekler, birden fazla değer için IN gerekir:
Sonuç: Queen’in 45 parçası. Bire çok ilişki içteki sorguyu çok satırlı yapar; IN bu yüzden gerekir.
Soru: Bohemian Rhapsody hangi çalma listelerinde? Yol: Track → PlaylistTrack → Playlist.
Sonuç: Music, Music. Aynı ad, farklı listeler: PlaylistId 1 ve 8.
Çoka çok ilişkide ara tablo yalnızca geçiş noktasıdır; adlar iki uçtaki tablolardan gelir.
Track tablosunda GenreId var, tür adı yok. Rock parçalarının adlarını getirmek için eksik kısmı düşünün:
sea_lions.db dosyasında iki tablo var. sea_lions deniz aslanlarının kimliğini ve adını, migrations ise göç mesafesini ve gün sayısını tutuyor.
sea_lions.db dosyasını indirin. Açık Chinook isteminden .quit ile çıkın. Terminalde dosyanın bulunduğu klasöre geçin:
| id | name |
|---|---|
| 10484 | Ayah |
| 11728 | Spot |
| 11729 | Tiger |
| 11732 | Mabel |
| 11734 | Rick |
| 11790 | Jolee |
| id | distance | days |
|---|---|---|
| 10484 | 1000 | 107 |
| 11728 | 1531 | 56 |
| 11729 | 1370 | 37 |
| 11732 | 1622 | 62 |
| 11734 | 1491 | 58 |
| 11735 | 2723 | 82 |
| 11736 | 1571 | 52 |
| 11737 | 1957 | 92 |
Ayah’ın göç bilgisi hangi satırda? Aynı id değerini iki tabloda bulmak yeterli.
Tam tablodan üçer satıra yakından bakalım. Hangi kayıtlar yan yana gelebilir?
| id | name |
|---|---|
| 10484 | Ayah |
| 11728 | Spot |
| 11790 | Jolee |
| id | distance |
|---|---|
| 10484 | 1000 |
| 11728 | 1531 |
| 11735 | 2723 |
| id | name | distance |
|---|---|---|
| 10484 | Ayah | 1000 |
| 11728 | Spot | 1531 |
Önce Ayah'ın iki satırını bulun.
JOIN, burada yalnızca iki tabloda da bulunan id değerlerini getirir:
| id | name | distance | days |
|---|---|---|---|
| 10484 | Ayah | 1000 | 107 |
| 11728 | Spot | 1531 | 56 |
| 11729 | Tiger | 1370 | 37 |
| 11732 | Mabel | 1622 | 62 |
| 11734 | Rick | 1491 | 58 |
JOIN yazmak burada INNER JOIN yazmakla aynıdır. Jolee ve 11735 numaralı göç sonuçta yoktur.
id VarYalnızca id yazarsak hangi tablonun sütununu istediğimiz belirsizdir. Tablo adını veya kısa adını belirtiriz:
ON s."id" = m."id" satırı, hangi kayıtların eşleşeceğini söyler. SELECT satırıysa sonuçta hangi sütunları göreceğimizi belirler.
Bu dosyada migrations.id şemada yabancı anahtar olarak tanımlanmamış. JOIN için ON koşulunu yazmamız yine yeterli.
AS s ve AS m, sorgu içinde tablo adlarını kısaltır:
Sonuç: Ayah’ın göç mesafesi 1000. s ve m kalıcı tablo adları değildir.
LEFT JOIN, soldaki sea_lions satırlarının tamamını korur:
| id | name | distance |
|---|---|---|
| 10484 | Ayah | 1000 |
| 11728 | Spot | 1531 |
| 11790 | Jolee | NULL |
Eşleşen iki satır görünüyor. Jolee ne olacak?
RIGHT JOIN, sağdaki migrations satırlarının tamamını korur:
| name | id | distance |
|---|---|---|
| Ayah | 10484 | 1000 |
| Spot | 11728 | 1531 |
| NULL | 11735 | 2723 |
11735 numaralı göçün adı ne olacak?
FULL JOIN, eşleşenleri ve iki taraftaki eşleşmeyen kayıtları birlikte getirir:
| sea_lion_id | name | migration_id | distance |
|---|---|---|---|
| 10484 | Ayah | 10484 | 1000 |
| 11728 | Spot | 11728 | 1531 |
| 11790 | Jolee | NULL | NULL |
| NULL | NULL | 11735 | 2723 |
Önce solda eşleşmeyen Jolee'yi düşünün.
| Sorgu | Satır sayısı | Korunan eşleşmesiz kayıtlar |
|---|---|---|
INNER JOIN |
5 | Yok |
LEFT JOIN |
6 | Jolee |
RIGHT JOIN |
8 | 11735, 11736, 11737 |
FULL JOIN |
9 | Her iki taraftakiler |
6 + 8 - 5 = 9: her iki tablodaki kayıtları sayarken beş eşleşmeyi iki kez saymayız.
NATURAL JOIN, iki tabloda aynı adlı sütunları eşleşme koşulu olarak kendisi seçer. Bu örnekte ortak sütun id olduğu için sonuç ilk bakışta kullanışlı görünür.
Biz koşulu açıkça yazacağız:
Şemaya ileride başka bir ortak sütun adı eklenirse NATURAL JOINin eşleşme koşulu da değişir.
Deniz aslanları örneğinde aynı id değerlerini eşleştirdik. Chinook’ta yol farklı: Track.AlbumId, Album.AlbumId değerine; Album.ArtistId de Artist.ArtistId değerine bağlanır.
sea_lions.db isteminden çıkıp chinook.db dosyasını yeniden açın:
Soru: Bohemian Rhapsody’yi kim söylüyor?
| Başlangıç | Bağlantı | Sonuç |
|---|---|---|
Track |
Track.AlbumId = Album.AlbumId |
Albüm |
Album |
Album.ArtistId = Artist.ArtistId |
Sanatçı |
Sorgu yazmadan önce bu yolu kâğıtta çizmek, hangi ON koşulunun gerektiğini açık eder.
Sanatçı adını da istiyorsak Artist tablosuna devam ederiz:
| Parça | Albüm | Sanatçı |
|---|---|---|
| Bohemian Rhapsody | Greatest Hits I | Queen |
Track tablosunda GenreId var, tür adı Genre tablosunda. TrackId = 2254 için parça adını ve tür adını yan yana getirin.
LEFT JOIN sonucunda eşleşmeyenleri seçebiliriz:
Bu sorgu 71 sanatçı döndürür. NULL, sanatçı adının eksik olduğunu değil, bu sonuçta eşleşen bir albüm satırı bulunmadığını gösterir.
JOIN sorgusu bir sonuç kümesi üretir. Bu sonuç, sorgu sırasında görünür; kendiliğinden veritabanına yeni bir tablo olarak kaydedilmez.
Bu yüzden aynı veriyi farklı sorular için farklı biçimlerde birleştirebiliriz:
Grunge listesindeki (PlaylistId = 16) ilk beş parça:
| TrackId | Name |
|---|---|
| 52 | Man In The Box |
| 2003 | Smells Like Teen Spirit |
| 2004 | In Bloom |
| 2005 | Come As You Are |
| 2007 | Lithium |
Liste kimliği yerine adını görmek için üçüncü tabloyu ekleriz:
Bu sorguda Playlist → PlaylistTrack → Track yolunu izliyoruz. LIMIT için sıra belirtmedik; hangi beş satırın geleceği garanti edilmez.
İkisi de tablo ilişkilerinden yararlanır. Sorunun istediği sonuç biçimi seçim yapmayı kolaylaştırır:
| İstenen sonuç | Kullanışlı başlangıç |
|---|---|
| Queen’in albüm adları; kimliği içeriden bul | Alt sorgu |
| Parça, albüm ve sanatçı adını aynı satırda göster | JOIN |
Bu bir zorunluluk değildir. Aynı soruyu farklı SQL biçimleriyle çözebiliriz. Önemli olan, ilişkileri doğru okumak ve sonucu doğrulamaktır.
Bir arkadaş grubuyla müzik seçiyorsunuz.
“İkisinde de olan parçalarla başlayalım” dediniz. Listeleri tek tek karşılaştırmadan bu parçaları nasıl bulursunuz?
90’s Music listesinde 1477 parça var.
Heavy Metal Classic listesinde 26 parça var. İki liste henüz ayrı duruyor.
İki listede ortak 5 parça var. Looks That Kill bunlardan biri.
Her kayıt TrackId ile sayılır. Şema ölçekli çizilmedi.
A ∩ B: İki listede de bulunan parçalar. Looks That Kill bunlardan biri.
SQL’de: INTERSECT
A ∪ B: Listelerden en az birinde bulunan 1498 farklı parça. Ortak beş parça birer kez sayılır.
SQL’de: UNION
A − B: 90’s Music’te olup Heavy Metal Classic’te bulunmayan parçalar. Yönü ters çevirirsek sonuç değişir.
SQL’de: EXCEPT
| Sorgu cümlesi | Küme işlemi | SQL’de |
|---|---|---|
| İki listede de hangi parçalar var? | Kesişim | INTERSECT |
| Listelerden en az birinde hangi parçalar var? | Birleşim | UNION |
| 90’s Music’te olup Heavy Metal Classic’te olmayanlar hangileri? | Fark | EXCEPT |
Liste adı Playlist.Name, parça adı Track.Name alanında. PlaylistTrack ise listeyle parçayı kimlikleri üzerinden bağlıyor. Sorgularda parça adını göstereceğiz, TrackId ile aynı adlı farklı kayıtları ayıracağız.
Her iki listede de bulunan parçaların adlarını bulalım:
SELECT t."Name", t."TrackId"
FROM "PlaylistTrack" AS pt
JOIN "Track" AS t ON t."TrackId" = pt."TrackId"
WHERE pt."PlaylistId" = 5 -- 90’s Music
INTERSECT
SELECT t."Name", t."TrackId"
FROM "PlaylistTrack" AS pt
JOIN "Track" AS t ON t."TrackId" = pt."TrackId"
WHERE pt."PlaylistId" = 17 -- Heavy Metal Classic
ORDER BY "Name";Sonuç: 5 ortak parça. İki sorgu da önce adı, sonra TrackId değerini döndürür.
İki listede de bulunan beş kayıt:
Parça adı (Name) |
TrackId |
|---|---|
| Enter Sandman | 1801 |
| Fast As a Shark | 3 |
| Looks That Kill | 1984 |
| Princess of the Dawn | 5 |
| Restless and Wild | 4 |
Enter Sandman adlı 77 numaralı başka bir kayıt yalnız 90’s Music’tedir. Ad tek başına kayıtları ayırmaya yetmez.
Parça iki listede birden olsa bile aynı kayıt sonuçta bir kez görünür:
SELECT t."Name", t."TrackId"
FROM "PlaylistTrack" AS pt
JOIN "Track" AS t ON t."TrackId" = pt."TrackId"
WHERE pt."PlaylistId" = 5 -- 90’s Music
UNION
SELECT t."Name", t."TrackId"
FROM "PlaylistTrack" AS pt
JOIN "Track" AS t ON t."TrackId" = pt."TrackId"
WHERE pt."PlaylistId" = 17; -- Heavy Metal ClassicSonuç: 1498 farklı kayıt. Black Dog, Looks That Kill ve Balls to the Wall sonuçtadır. UNION, aynı kayıt iki listede olsa da onu bir kez gösterir.
90’s Music listesinde olup Heavy Metal Classic listesinde bulunmayan parçaların adları:
SELECT t."Name", t."TrackId"
FROM "PlaylistTrack" AS pt
JOIN "Track" AS t ON t."TrackId" = pt."TrackId"
WHERE pt."PlaylistId" = 5 -- 90’s Music
EXCEPT
SELECT t."Name", t."TrackId"
FROM "PlaylistTrack" AS pt
JOIN "Track" AS t ON t."TrackId" = pt."TrackId"
WHERE pt."PlaylistId" = 17; -- Heavy Metal ClassicSonuç: 1472 kayıt. Black Dog bunlardan biri. Sıra değişince soru değişir. 17 EXCEPT 5 yazarsak yalnız Heavy Metal Classic’te olan 21 kayıt gelir.
İlk derste tüm tablodaki kayıtları saymıştık:
Sonuç: 3503.
“Her müzik türünde kaç parça var?” Tek bir toplam sayı yerine her tür için ayrı bir sayı gerekiyor.
Track tablosundan altı satır seçelim. Aynı GenreId değerine sahip satırları nasıl ayırırız?
| TrackId | GenreId |
|---|---|
| 1 | 1 |
| 64 | 2 |
| 77 | 3 |
| 2 | 1 |
| 78 | 3 |
| 3 | 1 |
GenreId değerine göreHangi satırlar aynı GenreId değerini taşıyor?
Altı satırda gördüğümüz işlemi şimdi Track tablosunun tamamına uygulayalım:
| GenreId | Parça sayısı |
|---|---|
| 1 | 1297 |
| 2 | 130 |
| 3 | 374 |
| 4 | 332 |
| 5 | 12 |
Sonuç 25 satır, her tür için bir tane; tablo ilk beşini gösteriyor.
| Tür | Parça sayısı |
|---|---|
| Rock | 1297 |
| Latin | 579 |
| Metal | 374 |
| Alternative & Punk | 332 |
| Jazz | 130 |
Tür kimliği yerine adı için Genre bağlandı; tablo ilk beş satırı gösteriyor.
AVG de küme başına çalışır. Türlere göre ortalama süre, en uzun üçü:
| Tür | Ortalama süre |
|---|---|
| Sci Fi & Fantasy | 2911783.0 |
| Science Fiction | 2625549.0 |
| Drama | 2575284.0 |
Az önce GROUP BY ile her türün parça sayısını bulduk. Şimdi raporda yalnızca en az 100 parçası olan türleri görmek istiyoruz.
| Tür | Parça sayısı |
|---|---|
| Rock | 1297 |
| Jazz | 130 |
| TV Shows | 93 |
Bu üç türden hangileri raporda kalmalı?
Rock ve Jazz kalır. TV Shows elenir. SQL’de bunu nasıl yazarız?
GROUP BY tür başına bir grup oluşturur ve COUNT(*) parçaları sayar. HAVING bu sayıya göre grupları seçer.
Beş tür kalır: Rock, Latin, Metal, Alternative & Punk ve Jazz.
Süresi en az üç dakika (180.000 ms) olan parçaları seçelim. Bu parçalardan en az 100 tanesi bulunan türleri bulalım.
WHERE süreye bakarak parçaları ayırır. HAVING kalan parçalar sayıldıktan sonra türleri seçer.
Her sanatçının parça sayısına ulaşmak için iki bağlantı gerekir:
| Sanatçı | Parça sayısı |
|---|---|
| Iron Maiden | 213 |
| U2 | 135 |
| Led Zeppelin | 114 |
| Metallica | 112 |
Track.TrackId = 2254 satırının AlbumId değeri 185. Album.AlbumId = 185 satırının ArtistId değeri 51.
Hangi iki eşitlik, parça adının yanına sanatçı adını getirir?
Bohemian Rhapsody için albüm ve sanatçı adını tek sonuç satırında gösterin. Aynı isimli farklı parçalar olabileceği için TrackId = 2254 kullanın.
Hiç parçası olmayan çalma listelerini bulmak istiyoruz. Hangi iki tablo, hangi JOIN türü ve hangi koşul gerekir?
Ondan az parçası bulunan türleri getirmek için hangi koşul HAVING satırına yazılır? Sonucu tahmin edin: kaç tür gelir?
Bu sorgu iki farklı kimlik türünü karşılaştırıyor:
Hangi sütunu değiştirmeliyiz?
Birden fazla tablodan veri isterken önce üç şeyi belirleyin:
Sonra sorguyu yazın ve gelen satırların beklediğiniz anlamı taşıyıp taşımadığını kontrol edin.
BİL309 - Veritabanı Yönetim Sistemleri – OMÜ | 🏠