-- 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.