Clear        


                
                    -- SUBQUERIES --
-- subquery'ler parantez içerisinde yazılır
-- where kısmında eğer subquery sonucunda 1 sonuç dönüyorsa =, birden çok sonuç dönüyorsa in kullanılmalıdır
-- maksimum gişe yapan filmlerin yönetmenlerini getir
use Filmler
select * from film
select max(gisesi) from film
select * from film where gisesi = 1000000.00
select * from film where gisesi = (select max(gisesi) from film) -- = kullanıyoruz çünkü mutlaka tek sonuç döner
select * from yonetmen where id = 1 or id = 4
select * from yonetmen where id in (1, 4)
select yonetmen_id from film where gisesi = (select max(gisesi) from film)
select * from yonetmen where id in (select yonetmen_id from film where gisesi = (select max(gisesi) from film)) -- sonuç sorgusu: in kullanıyoruz çünkü farklı yönetmenlerin aynı maksimum gişeye sahip filmleri olabilir



-- yönetmen adları ile birlikte filmleri getir
select * from film
select * from yonetmen
select id, adi, yapimyili, gisesi from film
select id, adi, yapimyili, gisesi, (select adi + ' ' + soyadi from yonetmen where yonetmen.id = film.yonetmen_id) yonetmeni from film -- sonuç sorgusu



select Oyuncu.adi + ' ' + Oyuncu.soyadi as oyuncu from Oyuncu
where Oyuncu.id = 
(
	select top 1 FilmOyuncuKarakter.oyuncu_id from FilmOyuncuKarakter
	where FilmOyuncuKarakter.film_id = 
	(
		select Film.id from Film 
		where Film.gisesi = 
		(
			select MAX(Film.gisesi) from Film
		)
	)
)
-- En çok gişe yapan filmin oyuncularından ilk sıradakini getir.
-- Burda subquery'lerden birinden birden çok değer dönüyor. Bu sorunu ya top 1 diyip
-- ilk sıradaki oyuncu id'sini alarak çözebiliriz veya where clause'undaki ='ler yerine
-- in kullanabiliriz.



select Oyuncu.adi + ' ' + Oyuncu.soyadi as oyuncu from Oyuncu
where Oyuncu.id in 
(
	select FilmOyuncuKarakter.oyuncu_id from FilmOyuncuKarakter
	where FilmOyuncuKarakter.film_id in 
	(
		select Film.id from Film 
		where Film.gisesi = 
		(
			select MAX(Film.gisesi) from Film
		)
	)
)
-- En çok gişe yapan filmin tüm oyuncularını getir.
-- Eğer bir tabloda iki primary key varsa, bu primary key'lerin olduğu iki sütunu tek bir
-- sütunmuş gibi düşünebiliriz. Yani bu tabloda primary key olan ilk sütun ile beraber 
-- primary key olan ikinci sütunda aynı verilere sahip hiçbir satır yoktur.
-- Eğer birden çok satır içeren bir tablo dönüyorsa subquery'de, 
-- in kullanarak sorunu ortadan kaldırabiliyoruz. Tek satır döneceğinden emin olmadığımız 
-- tüm subquery'lerde in kullanmak mantıklı ve doğru.



select f.id as filmid, f.adi as filmadi, 
(
	select y.adi + ' ' + y.soyadi from Yonetmen as y where f.yonetmen_id = y.id
) as filmyonetmeni from Film as f
-- Her bir satırda filmin id'sini, filmin adını ve o filme ait yönetmeni getirir.
select f.id as filmid, f.adi as filmadi, f.yapimyili as filmyapimyili, f.gisesi as filmgisesi, 
(
	select y.adi from Yonetmen as y where f.yonetmen_id = y.id
) as filmyonetmenadi, 
(
	select y.soyadi from Yonetmen as y where f.yonetmen_id = y.id
) as filmyonetmensoyadi
from Film as f
-- Her bir satırda filmin id'sini, filmin adını, filmin yapım yılını, filmin gişesini, 
-- filmin yönetmen adını ve filmin yönetmen soyadını getirir.



select o.soyadi + ', ' + o.adi as oyuncu from Oyuncu as o
where o.id in 
(
	select fok.oyuncu_id from FilmOyuncuKarakter as fok
	where fok.film_id =
	(
		select f.id from Film as f
		where f.adi = 'Avatar'
	)
)
-- Avatar filminin oyuncularını getir.
-- as ile alias tanımlama işlemi tablolar için de yapılabilir,
-- alias tanımlandıktan sonra o tabloya alias'ı üzerinden de ulaşılabilir.