-- JOINS --
-- 1) INNER JOIN:
-- eşleşen kayıtları getirir (eşleşen kayıtlar kuralı üzerinden)
-- iki veya daha fazla tabloyu eşleşen kayıtlar kuralı üzerinden tek bir tabloymuş gibi birleştiriyor
-- burda eşleşen kayıtlar kuralı: f.yonetmen_id = y.id
use Filmler
select f.id as filmid, f.adi as filmadi, f.yapimyili as filmyapimyili, f.gisesi as filmgisesi,
y.adi as filmyonetmenadi, y.soyadi as filmyonetmensoyadi
from Film as f inner join Yonetmen as y on f.yonetmen_id = y.id order by f.yapimyili
go
select Yonetmen.adi from Film inner join Yonetmen on Film.yonetmen_id = Yonetmen.id
go
select distinct Yonetmen.adi from Film inner join Yonetmen on Film.yonetmen_id = Yonetmen.id
-- distinct kendisinden sonraki sütun adına göre tekrarlayan satırlar yerine unique satırlar getirir
-- (ilk karşılaştığı unique satırları getirir, diğer aynı değerdeki satırları getirmez)
select f.id as filmid, f.adi as filmadi, f.yapimyili as filmyapimyili, f.gisesi as filmgisesi,
y.adi + ' ' + y.soyadi as filmyonetmeni,
o.adi + ' ' + o.soyadi as filmoyuncusu
from Yonetmen as y, Film as f, FilmOyuncuKarakter as fok, Oyuncu as o
where y.id = f.yonetmen_id
and f.id = fok.film_id
and fok.oyuncu_id = o.id
go
select f.id as filmid, f.adi as filmadi, f.yapimyili as filmyapimyili, f.gisesi as filmgisesi,
y.adi + ' ' + y.soyadi as filmyonetmeni,
o.adi + ' ' + o.soyadi as filmoyuncusu
from Yonetmen as y inner join Film as f on y.id = f.yonetmen_id
inner join FilmOyuncuKarakter as fok on f.id = fok.film_id
inner join Oyuncu as o on fok.oyuncu_id = o.id
-- iki komut da INNER JOIN! --
-- INNER JOIN eşleşme kuralında null olan kayıtları getirmez
-- bir tablo kendisine de INNER JOIN yapabilir
-- Soru: Adı M ile başlayan oyuncuların oynadığı filmler?
select Oyuncu.adi + ' ' + Oyuncu.soyadi as oyuncu, Film.adi as filmadi
from Film inner join FilmOyuncuKarakter on Film.id = FilmOyuncuKarakter.film_id
inner join Oyuncu on FilmOyuncuKarakter.oyuncu_id = Oyuncu.id
where Oyuncu.adi like 'm%'
go
select Oyuncu.adi + ' ' + Oyuncu.soyadi as oyuncu, Film.adi as filmadi
from Film, FilmOyuncuKarakter, Oyuncu
where Film.id = FilmOyuncuKarakter.film_id
and FilmOyuncuKarakter.oyuncu_id = Oyuncu.id
and Oyuncu.adi like 'm%'
-- Soru: James Cameron hangi türlerdeki filmleri yönetti?
-- (Sorgudan yönetmen adı, soyadı, film adı ve film türü dönsün)
select y.adi as yonetmenadi, y.soyadi as yonetmensoyadi, f.adi as filmadi, t.adi as filmturu
from Yonetmen as y inner join Film as f on y.id = f.yonetmen_id
inner join FilmTur as ft on f.id = ft.film_id
inner join Tur as t on ft.tur_id = t.id
where y.adi = 'james' and y.soyadi = 'cameron'
-- Soru: Filmler hakkındaki tüm bilgileri getiren tablo?
select distinct f.id as filmid, f.adi as filmadi, f.yapimyili as filmyapimyili, f.gisesi as filmgisesi,
y.adi + ' ' + y.soyadi as filmyonetmeni,
o.adi + ' ' + o.soyadi as filmoyuncusu, o.dogumtarihi as filmoyuncusudogumtarihi,
k.adisoyadi as filmkarakteri,
t.adi as filmturu
from Film as f inner join Yonetmen as y on f.yonetmen_id = y.id
inner join FilmOyuncuKarakter as fok on fok.film_id = f.id
inner join Oyuncu as o on fok.oyuncu_id = o.id
inner join Karakter as k on fok.karakter_id = k.id
inner join FilmTur as ft on f.id = ft.film_id
inner join Tur as t on ft.tur_id = t.id
-- INNER JOIN her iki (veya daha fazla) tabloda da en az bir eşleşme olan satırları döndürür.
-- Eğer soldaki tablonun sağdaki tabloda eşleşmesi yoksa o satırları döndürmez.
-- 2) OUTER JOIN:
-- eşleşmeyen kayıtları da getirir
-- 2.1) LEFT JOIN:
select f.id as filmid, f.adi as filmadi,
o.id as oyuncuid, o.adi + ' ' + o.soyadi as oyuncuadisoyadi
from Film as f left outer join FilmOyuncuKarakter as fok on f.id = fok.film_id
left join Oyuncu as o on fok.oyuncu_id = o.id
go
select Film.id as filmid, Film.adi as filmadi,
Yonetmen.id as yonetmenid, Yonetmen.adi + ' ' + Yonetmen.soyadi as yonetmenadisoyadi
from Film left join Yonetmen on Film.yonetmen_id = Yonetmen.id
-- Soldaki tabloya göre sağdaki tablodan değerleri getir:
-- Filmlere göre Oyuncuları getir, Filmlere göre Yönetmenleri getir.
-- LEFT JOIN soldaki tablodan bütün satırları sağdaki tabloda eşleşmeleri olmasa da döndürür.
-- 2.2) RIGHT JOIN:
select f.id as filmid, f.adi as filmadi,
o.id as oyuncuid, o.adi + ' ' + o.soyadi as oyuncuadisoyadi
from Film as f right join FilmOyuncuKarakter as fok on f.id = fok.film_id
right outer join Oyuncu as o on fok.oyuncu_id = o.id
go
select Film.id as filmid, Film.adi as filmadi,
Yonetmen.id as yonetmenid, Yonetmen.adi + ' ' + Yonetmen.soyadi as yonetmenadisoyadi
from Film right join Yonetmen on Film.yonetmen_id = Yonetmen.id
-- Sağdaki tabloya göre soldaki tablodan değerleri getir:
-- Oyunculara göre Filmleri getir, Yönetmenlere göre Filmleri getir.
-- RIGHT JOIN sağdaki tablodan bütün satırları soldaki tabloda eşleşmeleri olmasa da döndürür.
-- 2.3) FULL JOIN:
select f.id as filmid, f.adi as filmadi,
o.id as oyuncuid, o.adi + ' ' + o.soyadi as oyuncuadisoyadi
from Film as f full outer join FilmOyuncuKarakter as fok on f.id = fok.film_id
full join Oyuncu as o on fok.oyuncu_id = o.id
go
select Film.id as filmid, Film.adi as filmadi,
Yonetmen.id as yonetmenid, Yonetmen.adi + ' ' + Yonetmen.soyadi as yonetmenadisoyadi
from Film full join Yonetmen on Film.yonetmen_id = Yonetmen.id
-- Bu 2 sorguda FULL JOIN, LEFT JOIN gibi çalışıyor.
-- FULL JOIN soldaki tablodan bütün satırları döndürür ve sağdaki tablodan bütün satırları döndürür.
-- Sağdaki tabloda eşleşmesi olmayan soldaki tablo değerlerini ve soldaki tabloda eşleşmesi olmayan
-- sağdaki tablo değerlerini de döndürür.
-- 2.4) CROSS JOIN:
select Film.id as filmid, Film.adi as filmadi,
Yonetmen.id as yonetmenid, Yonetmen.adi + ' ' + Yonetmen.soyadi as yonetmenadisoyadi
from Film cross join Yonetmen
-- WHERE kullanılmadığında CROSS JOIN iki (veya daha fazla) tablonun tüm satırlarına göre
-- Cartesian Çarpımları'nı döndürür.
-- 2 tablo için:
-- Sonuç tablosu satır sayısı = 1. Tablo satır sayısı * 2. Tablo satır sayısı
-- Film tablosu satır sayısı:
select COUNT(*) from Film
-- 6
-- Yonetmen tablosu satır sayısı:
select COUNT(*) from Yonetmen
-- 5
-- Sonuç tablosu satır sayısı:
select COUNT(*) from Film cross join Yonetmen
-- 30
-- WHERE kullanıldığında CROSS JOIN, INNER JOIN gibi davranır.
select Film.id as filmid, Film.adi as filmadi,
Yonetmen.id as yonetmenid, Yonetmen.adi + ' ' + Yonetmen.soyadi as yonetmenadisoyadi
from Film cross join Yonetmen
where Film.yonetmen_id = Yonetmen.id
go
select Film.id as filmid, Film.adi as filmadi,
Yonetmen.id as yonetmenid, Yonetmen.adi + ' ' + Yonetmen.soyadi as yonetmenadisoyadi
from Film inner join Yonetmen
on Film.yonetmen_id = Yonetmen.id