Clear        


                
                    -- SQL: Structured Query Language: Veritabanında sorgular üzerinden veritabanı işlemleri yapabildiğimiz dildir.
-- T-SQL: Transact Structured Query Language: Microsoft SQL Server'ın kullandığı özelleştirilmiş SQL'dir.

-- T-SQL'de yorum satırları -- ... ile ... olan yer için tek satır olarak veya /* ... */ ile ... olan yer için birden çok
-- satır şeklinde yazılır.

-- DATA DEFINITION LANGUAGE (DDL): Veritabanında veriyi sakladığımız veya kullandığımız yapıları oluşturmak, değiştirmek 
-- veya silmek için kullanılır.

-- Örnek olarak database (veritabanı), table (tablo), column(sütun) ve view'ler (dinamik görünümler) için 
-- DDL sorguları çalıştırılabilir.

-- DDL sorguları kullanılmadan da Microsoft SQL Server design sayfaları üzerinden veritabanı, tablo, tablolar arası ilişkiler
-- vb. işlemleri yapılabilir.

-- master: Sunucudaki veritabanlarımızın yapılarıyla ilgili verilerin saklandığı veritabanıdır.

-- İki çalıştırılan SQL sorgusu arasına go konularak mutlaka birincinin işleminin bitmesi sağlanabilir, daha sonra diğeri çalışır.

-- Yeni bir veritabanı oluşturulurken önce master veritabanı üzerinden oluşturucağımız veritabanı (Filmler) var mı kontrolü yapılır,
-- eğer varsa bu veritabanı drop database Filmler sorgusu ile silinir.

-- create database Filmler ile yeni veritabanı oluşturulur.

-- use Filmler ile Filmler veritabanının kullanılması sağlanır, sonrasında sorgular Filmler veritabanı üzerinde çalışacaktır.

-- create table Film ile yeni tablo oluşturulur. Bu tablo Yonetmen ile 1 to many, Tur ile many to many ilişkilidir.

-- primary key (birincil anahtar): Bir tablodaki her bir satırda tanımlandığı sütun için tekil veri tutulmasını sağlar.

-- identity(1, 1): identity ile bu verinin soldaki 1 değeri ile 1'den başlaması, sağdaki 1 değeri ile de birer birer artması sağlanır.
-- Eğer veritabanının bu veriyi otomatik arttırması istenmiyorsa identity(1, 1) yazmaya gerek yoktur.

-- foreign key (yabancıl anahtar): Bir tabloya ilişkili olduğu başka tablodan taşınan ve taşındığı tabloda primary key olan sütundur.

-- bigint, int, smallint, tinyint ve bit saklayabildikleri değerler bakımından büyükten küçüğe doğru tam sayı verilerinin 
-- tutulması için kullanılan veri tipleridir.

-- varchar, char ve text metinsel verilerin tutulması için kullanılan veri tipleridir.

-- varchar(uzunluk) ve char(uzunluk) ile parantez içinde maksimum kaç karakter metinsel veri tutulabileceği yani uzunluk belirtilir.
-- varchar(max) ve char(max) ile SQL Server'da tanımlı olan ve versiyonlara göre değişen maksimum karakter sayısı tanımlanabilir.
-- text için max tanımlamaya gerek yoktur, bu veri tipi çok büyük metinsel verilerin tutulması için kullanılır.

-- Tutulan varchar verisinin uzunluğu girilen veriye göre değişirken char verinin uzunluğu sabittir, 
-- veri girilmeyen karakterler boşluk olarak tutulur.

-- Eğer veritabanının collation'ı (verileri saklamak için kullandığı dil) Türkçe (TURKISH_CI_AS) olarak tanımlanmamışsa metinsel
-- veri tiplerinin başına n konularak (nvarchar, nchar, ntext) bu verilerin unicode karakter kümesi kullanılarak saklanması 
-- sağlanır ki Türkçe veriler için bir sorun olmasın. Bu şekilde tanımlanan sütunlara veri girilirken de başına N eklenir.

-- null: Veri girişi yapılan sütunda hiç bir verinin saklanmaması için kullanılır, özel bir boş veri olarak düşünülebilir.

-- Ondalık veriler için genel olarak float veri tipi kullanılır.

-- Ondalık sayılarda tam kısım ile ondalıklı kısım özelleştirmeleri için decimal veri tipi kullanılabilir.
-- Örneğin decimal(9, 2) bize sayının nokta ile beraber 9 hane olacağını, 2 ise noktadan sonraki hane sayısını belirtir.

-- Para verisi de ondalık sayı olduğundan money veri tipi ile özelleştirilmiş ve kullanımımıza sunulmuştur.

-- Tarih verilerinde sadece tarih için date veri tipi, tarih ve saat içinse datetime veri tipi tanımlanabilir.
-- T-SQL tarih formatı: yıl-ay-gün saat:dakika:saniye.milisaniye (Örnek: 2021-09-07 17:25:50.123)

-- Metinsel olmayan yani ikilik sistemde oluşturulmuş imaj gibi veriler image, varbinary(uzunluk) veya binary(uzunluk) veri tipleriyle saklanabilir.

-- alter komutu veritabanı dahil herhangi bir veritabanı yapısının değiştirilmesi için kullanılır.
-- Örneğin database, table, column ve view'ler için kullanılabilir.

-- drop komutu veritabanı dahil herhangi bir veritabanı yapısının silinmesi için kullanılır.
-- Örneğin database, table, column ve view'ler için kullanılabilir.

use master
go
if exists (select name from sys.databases where name = 'Filmler')
begin
	alter database Filmler set single_user with rollback immediate -- veritabanı bağlantısını koparmak için özel sorgu
	drop database Filmler -- veritabanını silen esas sorgu
end
go
create database Filmler
go
use Filmler
go
create table Film -- Yonetmen ile 1 to many tablosu, Tur ile many to many tablosu, FilmDetay ile 1 to 1 tablosu
(
	Id int primary key identity(1, 1), -- 1. primary key tanımlama yöntemi
	Adi varchar(300) not null,
	YapimYili char(4),
	YonetmenId int null, -- null: Herhangi bir filmin yönetmeni olmayabilir, not null: Her filmin bir yönetmeni olmalıdır.
						 -- Yonetmen tablosundan taşındığı için foreign key'dir.
						 -- Eğer sütunda null verilere izin verilecekse null yazmaya gerek yoktur.
	Gisesi money,
	HataliSutun int -- örnek için silinecek sütun
)
create table FilmDetay -- Film ile 1 to 1 tablosu
(
	FilmId int primary key,
	Maliyeti decimal(9, 2) not null,
	Aciklamasi varchar(MAX)
)
create table Yonetmen
(
	Id int primary key identity(1, 1),
	Adi varchar(50) not null,
	Soyadi varchar(50) not null,
	DogumTarihi date,
	EmekliMi bit
)
create table Tur
(
	Id int primary key identity(1, 1),
	Adi varchar(1) -- örnek için düzeltilecek sütun
)
create table FilmTur -- Film ve Tur için many to many tablosu
(
	FilmId int not null, -- Film tablosundan taşındığı için foreign key'dir.
	TurId int not null, -- Tur tablosundan taşındığı için foreign key'dir.
	constraint PK_FilmTur PRIMARY KEY (FilmId, TurId) -- 2. primary key tanımlama yöntemi, 
													  -- burada olduğu gibi birden çok sütun primary key olarak tanımlanabilir.
)
create table Hatalitablo -- örnek için silinecek tablo
(
	Id int primary key
)

alter table Tur alter column Adi varchar(25) not null -- örnek için Tur tablosundaki adi sütununun veri tipini 
												      -- null girilemeyecek şekilde varchar(25) olarak değiştiriyoruz.
alter table Film drop column HataliSutun -- örnek için Film tablosundaki hatalı sütunu siliyoruz.

drop table Hatalitablo -- örnek için hatalı oluşturduğumuz tabloyu siliyoruz.

-- Tablolar arası ilişkiler:

-- Film ile Yonetmen arasındaki 1 to many ilişki için Film tablosuna bir foreign key constraint (kısıtlama) ekleyerek
-- bu constraint'in Film tablosundaki yonetmenid ile Yonetmen tablosundaki id sütunları için olduğunu belirtiyoruz.
alter table Film add constraint FK_Film_Yonetmen foreign key (YonetmenId) references Yonetmen(Id)

-- Dolayısıyla Film ile Yonetmen tabloları arasında 1 to many ilişki oluşturmuş oluyoruz.

-- Film ile FilmTur arasındaki 1 to many ilişki için FilmTur tablosuna bir foreign key constraint ekleyerek
-- bu constraint'in FilmTur tablosundaki filmid ile Film tablosundaki id sütunları için olduğunu belirtiyoruz.
alter table FilmTur add constraint FK_FilmTur_Film foreign key (FilmId) references Film(Id)

-- Tur ile FilmTur arasındaki 1 to many ilişki için FilmTur tablosuna bir foreign key constraint ekleyerek
-- bu constraint'in FilmTur tablosundaki turid ile Tur tablosundaki id sütunları için olduğunu belirtiyoruz.
alter table FilmTur add constraint FK_FilmTur_Tur foreign key (TurId) references Tur(Id)

-- Dolayısıyla Film ile Tur tabloları arasında many to many ilişki oluşturmuş oluyoruz.

-- Film ile FilmDetay arasındaki 1 to 1 ilişki için FilmDetay tablosuna bir foreign key constraint ekleyerek
-- bu constraint'in Film tablosundaki id ile FilmDetay tablosundaki filmid sütunları için olduğunu belirtiyoruz.
alter table FilmDetay add constraint FK_FilmDetay_Film foreign key (FilmId) references Film(Id)