SQL ile Veri Dünyasına Yolculuk: Veritabanı Yönetiminin Temel Adımları-3

Serkan Topkan
9 min readJun 24, 2023

--

SQL Nedir, temel kullanım pratikleri ile öğreniyoruz?

SQL Scripts

SQL komut dosyası, tek bir işlemde yürütebileceğiniz SQL deyimlerinin bir koleksiyonudur.

Insert, select, delete, update, vb. gibi her türlü SQL komutunu kullanabilirsiniz.

Ayrıca değişkenler tanımlayıp kullanabilir ve If-E gibi program akışlarını da kullanabilirsiniz.

Comments

SQL kodunuzda yorum kullanmak, kodun okunmasını ve anlaşılmasını kolaylaştırmak için önemlidir.
SQL’de 2 farklı türde yorum kullanabiliriz:
- Tek satırlık yorum
- Çok satırlı yorum

Yorumlamak istediğiniz metinden önce “ — “ kullanarak her seferinde bir satır yorumlayabiliriz.

Sözdizimi:

-- Yorum metni

Yorumun başında “/*” ve yorumun sonunda “*/” kullanarak birkaç satırı yorumlayabiliriz.

Sözdizimi:

/*
Yorum metni
Yorum metni
*/

Variables

SQL’de değişken kullanma yeteneği güçlü bir özelliktir. Değişkenleri tanımlamak istediğinizde DECLARE anahtar sözcüğünü kullanmanız gerekir.

Yerel değişkenler önek olarak “@” sembolüne sahip olmalıdır. Ayrıca değişkeniniz için bir veri türü belirtmeniz gerekir (int, varchar(x), vb.).
Değişkenleri bildirmek için sözdizimi:

declare @local_variable data_type

Bildirmek istediğiniz birden fazla değişken varsa:

declare
@myvariable1 data_type,
@myvariable2 data_type,

Değişkene değer atamak istediğinizde, bir SET veya SELECT deyimi kullanmanız gerekir.

Örnek:

declare @myvariable int
set @myvariable=4

Eğer bir değişkenin değerini görmek istiyorsanız, örneğin PRINT komutunu aşağıdaki gibi kullanabilirsiniz:

declare @myvariable int
set @myvariable=4
print @myvariable

Değişkenlere SELECT deyiminden bir değer atamak çok kullanışlıdır.

Bir select deyiminden değişkene aşağıdaki gibi bir değer atayabilirsiniz:

declare @mylastname varchar(50)
select @mylastname=LastName from CUSTOMER where CustomerId=2
print @mylastname

WHERE cümlesinde bir değişken de kullanabilirsiniz LIKE, örneğin, this:

declare @find varchar(30)
set @find = 'S%'
select * from CUSTOMER
where LastName LIKE @find

Global Variables

SQL, sorgularda ve komut dosyalarında kullanmak için çok yararlı olan çok sayıda yerleşik değişkene sahiptir.

@@IDENTITY

Bir INSERT, SELECT INTO veya toplu kopyalama deyimi tamamlandıktan sonra, @@IDENTITY deyim tarafından oluşturulan son kimlik değerini içerir.

Deyim, kimlik sütunları olan herhangi bir tabloyu etkilemediyse, @@IDENTITY NULL döndürür.

Birden fazla satır eklenir ve birden fazla kimlik değeri oluşturulursa, @@IDENTITY oluşturulan son kimlik değerini döndürür.

Uygulama:

SCHOOL tablosuna yeni bir Okul eklemek istiyoruz ve COURSE tablosuna eklediğimiz Okula ait 2 yeni Kurs eklemek istiyoruz. “SchoolId “yi bulmak için şunları kullanabiliriz.

@@IDENTITY değişkeni:

declare @SchoolId int
-- Insert Data into SCHOOL table
insert into SCHOOL(SchoolName) values ('Tekirdağ Üniversitesi')
select @SchoolId = @@IDENTITY
-- Insert Courses for the specific School above in the COURSE table
insert into COURSE(SchoolId,CourseName) values (@SchoolId, 'Programlama')
insert into COURSE(SchoolId,CourseName) values (@SchoolId, 'İşletme')

Akış Kontrolü

Diğer programlama dillerinde olduğu gibi, çok kullanışlı olan IFELSE, WHILE, vb. gibi farklı akış kontrolü türlerini kullanabilirsiniz.

IF — ELSE

IF-ELSE çok kullanışlıdır, aşağıda bir örnek görüyoruz:

declare @customerNumber int
52 SQL Scripts
Structured Query Language (SQL)
select @customerNumber=CustomerNumber from CUSTOMER
where CustomerId=2
if @customerNumber > 1000
print 'Customer Number 1000den büyüktür.'
else
print 'Customer Number 1000den küçüktür.'

BEGIN…END

Bir EĞER cümlesi içinde birden fazla kod satırı çalıştırılacaksa BEGIN…END kullanmanız gerekir.

Örnek:

select @customerNumber=CustomerNumber from CUSTOMER where
CustomerId=2
if @customerNumber > 1000
begin
print 'Customer Number 1000den büyüktür.'
update CUSTOMER set AreaCode=46 where CustomerId=2
end
else
print 'Customer Number 1000den büyük değildir.'

WHILE

Diğer programlama dillerinden bilinen WHILE özelliğini de kullanabiliriz.

Örnek:

while (select AreaCode from CUSTOMER where CustomerId=1) < 20
begin
update CUSTOMER set AreaCode = AreaCode + 1
end
select * from CUSTOMER

Gördüğünüz gibi WHILE döngüsü içindeki kod, CustomerId=1 için “AreaCode” 20'den küçük olduğu sürece çalıştırılır.
Her yineleme için o müşterinin “AreaCode” değeri 1 ile artırılır.

CASE

CASE deyimi bir koşul listesini değerlendirir ve birden fazla olası sonuç ifadesinden birini döndürür.

Farklı kurslardaki her öğrenci için notları içeren bir “GRADE” tablomuz var:

select GradeId, StudentId, CourseId, Grade from GRADE

“GRADE” tablosunda notlar sayı olarak saklanır, ancak öğrenciler notları A..F harfleri (A=5, B=4, C=3, D=2, E=1, F=0), tablodaki değerleri dönüştürmek istiyoruz CASE deyimini kullanarak harflere dönüştürün:

select
GradeId,
StudentId,
CourseId,
case Grade
when 5 then 'A'
when 4 then 'B'
when 3 then 'C'
when 2 then 'D'
when 1 then 'E'
when 0 then 'F'
else '-'
end as Grade
from
GRADE

CURSOR

İlerleme komut dosyalarında CURSOR’lar çok yararlı olabilir. Bir CURSOR, bir veya daha fazla tablodaki kayıtlar arasında yineleme yapmak için kullandığımız gelişmiş bir WHILE döngüsü gibi çalışır.

CURSOR’lar çoğunlukla saklı yordamlarda, tetikleyicilerde ve SQL komut dosyalarında kullanılır.

Örnek:

Örnek olarak CUSTOMER tablosunu kullanacağız:

CUSTOMER tablosundaki tüm kayıtları yineleyen ve Telefon numarasının 8 basamaktan oluşup oluşmadığını kontrol eden bir CURSOR oluşturacağız, değilse komut dosyası geçersiz Telefon numarasını “Telefon numarası geçerli değil” metniyle değiştirecektir.
İşte bir CURSOR kullanan SQL Script:

DECLARE
@CustomerId int,
@phone varchar(50)
DECLARE db_cursor CURSOR
FOR SELECT CustomerId from CUSTOMER
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @CustomerId
WHILE @@FETCH_STATUS = 0
BEGIN
select @phone=Phone from CUSTOMER where CustomerId=@CustomerId
if LEN(@phone) < 8
update CUSTOMER set Phone='Telefon numarası geçerli değil'
where CustomerId=@CustomerId
FETCH NEXT FROM db_cursor INTO @CustomerId
END
CLOSE db_cursor
DEALLOCATE db_cursor

Bir CURSOR oluşturmak ve kullanmak aşağıdaki adımları içerir:
- İmleç tarafından döndürülen verileri içerecek SQL değişkenlerini bildirin. Her sonuç kümesi sütunu için bir değişken bildirin.
- DECLARE CURSOR deyimini kullanarak bir SQL imlecini SELECT deyimiyle ilişkilendirin. DECLARE CURSOR deyimi, imleç adı ve imlecin salt okunur mu yoksa salt ileri mi olduğu gibi imlecin özelliklerini de tanımlar.
- SELECT deyimini çalıştırmak ve imleci doldurmak için OPEN deyimini kullanın.
- Satırları tek tek almak ve her sütuna ait verilerin belirli bir değişkene taşınmasını sağlamak için FETCH INTO deyimini kullanın. Diğer SQL deyimleri daha sonra getirilen veri değerlerine erişmek için bu değişkenlere başvurabilir.
- İmleçle işiniz bittiğinde CLOSE deyimini kullanın. Bir imleci kapatmak, imlecin sonuç kümesi ve geçerli satır üzerindeki kilitleri gibi bazı kaynakları serbest bırakır.
DEALLOCATE deyimi, imleç adı da dahil olmak üzere imlece ayrılmış tüm kaynakları tamamen serbest bırakır.

Views

Görünümler, birden fazla tabloda depolanan verilere daha kolay erişim için sanal tablolardır.

Görünüm oluşturmak için sözdizimi:

CREATE VIEW <ViewName>
AS

… ancak bunu SQL’de yerleşik olarak bulunan grafik görünüm tasarımcısında yapmak daha kolay olabilir.

Görünüm kullanımı için sözdizimi:

select * from <MyView> where …

Yukarıda gösterildiği gibi, sıradan bir tabloyu kullandığımız gibi bir VIEW kullanırız.

Örnek:

Görünümümüz için örnek olarak SCHOOL ve CLASS tablolarını kullanıyoruz.

Mevcut tüm okulları ve ait oldukları sınıfları listeleyen bir Görünüm oluşturmak istiyoruz.

CREATE VIEW komutunu kullanarak VIEW oluşturuyoruz:

CREATE VIEW SchoolView
AS
SELECT
SCHOOL.SchoolName,
CLASS.ClassName
FROM
SCHOOL
INNER JOIN CLASS ON SCHOOL.SchoolId = CLASS.SchoolId

Not! Birden fazla tablodan bilgi almak için, tabloları bir JOIN kullanarak birbirine bağlamamız gerekir.

Stored Procedure

Saklı Yordam, SQL deyimlerinin önceden derlenmiş bir koleksiyonudur. Bir saklı yordamda şunları yapabilirsiniz, if cümlesi kullanabilir, değişkenler bildirebilir vb.

Saklı Yordam oluşturmak için söz dizimi:

CREATE PROCEDURE <ProcedureName>
@<Parameter1> <datatype>

declare
@myVariable <datatype>
… Kodunuzu buraya yazın

Not! Değişken adlarından önce “@” sembolünü kullanmanız gerekir.

Saklı Yordam kullanmak için sözdizimi:

EXECUTE <ProcedureName(…)>

Örnek:

Stored Procedure’ümüz için örnek olarak SCHOOL ve CLASS tablolarını kullanacağız. Mevcut tüm okulları ve ait oldukları sınıfları listeleyen bir Stored Procedure oluşturmak istiyoruz.

Stored Procedure’ü aşağıdaki gibi oluşturuyoruz:

CREATE PROCEDURE GetAllSchoolClasses
AS
select
SCHOOL.SchoolName,
CLASS.ClassName
from
SCHOOL
inner join CLASS on SCHOOL.SchoolId = CLASS.SchoolId
order by SchoolName, ClassName

Stored Procedure’ü oluşturduğumuzda, execute komutunu kullanarak Stored procedure’ü aşağıdaki gibi çalıştırabiliriz (veya yürütebiliriz):

execute GetAllSchoolClasses

Ayrıca giriş parametreleri ile bir Store Procedure de oluşturabiliriz.

Örnek:

Bu örnekte de aynı tabloları kullanıyoruz (OKUL ve SINIF) ancak şimdi belirli bir okul için tüm sınıfları listelemek istiyoruz.
Saklı Yordam şöyle olur:

CREATE PROCEDURE GetSpecificSchoolClasses
@SchoolName varchar(50)
AS
select
SCHOOL.SchoolName,
CLASS.ClassName
from
SCHOOL
inner join CLASS on SCHOOL.SchoolId = CLASS.SchoolId
where SchoolName=@SchoolName
order by ClassName

Stored Procedure’ü çalıştırırız (veya yürütürüz):

execute GetSpecificSchoolClasses 'TUC'

Zaten var olan bir Stored Procedure oluşturmaya çalıştığımızda aşağıdaki hata mesajını alıyoruz:
There is already an object named ‘GetSpecificSchoolClasses’ in the database.
Bu durumda, yeniden oluşturmadan önce eski Stored Procedure’ü silmemiz (veya DROP etmemiz) gerekir.

Functions

SQL ve SQL Server ile birçok yerleşik fonksiyon kullanabilir veya kendi fonksiyonlarınızı oluşturabilirsiniz. Burada en çok kullanılan yerleşik fonksiyonlardan bazılarını kullanmayı öğreneceğiz.

Built-in Functions

SQL, veriler üzerinde hesaplamalar yapmak için birçok yerleşik fonksiyona sahiptir.
Toplama fonksiyonları ve scalar fonksiyonlar olmak üzere 2 fonksiyon kategorimiz vardır.
Toplama fonksiyonları bir sütundaki değerlerden hesaplanan tek bir değer döndürürken, sayısal fonksiyonlar giriş değerine dayalı olarak tek bir değer döndürür.
Toplama fonksiyonları , örnekler:
- AVG() — Ortalama değeri döndürür
- STDEV() — Standart sapma değerini döndürür
- COUNT() — Satır sayısını döndürür
- MAX() — En büyük değeri döndürür
- MIN() — En küçük değeri döndürür
- SUM() — Toplamı döndürür
- vb.
Scalar fonksiyonlar, örnekler:
- UPPER() — Bir alanı büyük harfe dönüştürür
- LOWER() — Bir alanı küçük harfe dönüştürür
- LEN() — Bir metin alanının uzunluğunu döndürür
- ROUND() — Sayısal bir alanı belirtilen ondalık sayısına yuvarlar
- GETDATE() — Geçerli sistem tarihini ve saatini döndürür
- vb.

String Functions

İşte SQL Server’da dizelerle işlem yapmak için kullanılan bazı yararlı işlevler:

- CHAR
- CHARINDEX
- DEĞİŞTİR
- SUBSTRING
- LEN
- TERS
- SOL
- DOĞRU
- AŞAĞI
- ÜST
- LTRIM
- RTRIM

Date and Time Functions

İşte SQL Server’daki bazı yararlı Tarih ve Saat fonksiyonları:

- DATEPART
- GETTARİHİ
- TARİH EKLE
- DATEDIFF
- GÜN
- AY
- YIL
- ISDATE

Mathematics and Statistics Functions

İşte SQL Server’da matematik ve istatistik için bazı yararlı fonksiyonlar:

- COUNT
- MİN, MAKS
- COS, SIN, TAN
- SQRT
- STDEV
- ANLAMI
- AVG

AVG()
AVG() fonksiyonu, sayısal bir sütunun ortalama değerini döndürür.
Sözdizimi:

SELECT AVG(column_name) FROM table_name

COUNT()
COUNT() fonksiyonu, belirtilen bir kriterle eşleşen satır sayısını döndürür.
COUNT(column_name) fonksiyonu, belirtilen sütunun değer sayısını döndürür (NULL değerler sayılmaz):

SELECT COUNT(column_name) FROM table_name

COUNT(*) fonksiyonu bir tablodaki kayıt sayısını döndürür:

GROUP BY Deyimi

Toplama fonksiyonları genellikle ek bir GROUP BY deyimine ihtiyaç duyar.
GROUP BY deyimi, sonuç kümesini bir veya daha fazla sütuna göre gruplandırmak için toplama işlevleriyle birlikte kullanılır.
Sözdizimi:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

HAVING Cümlesi

HAVING cümlesi SQL’e WHERE anahtar sözcüğünün toplama işlevleriyle birlikte kullanılamaması nedeniyle eklenmiştir.
Sözdizimi:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

Kullanıcı Tanımlı Fonksiyonlar
SQL’de, kullanıcı tanımlı fonksiyonlar olarak adlandırılan kendi fonksiyonlarımızı da oluşturabiliriz. Kullanıcı tanımlı bir fonksiyon, parametreleri kabul eden, karmaşık bir hesaplama gibi bir eylem gerçekleştiren ve bu eylemin sonucunu bir değer olarak döndüren bir rutindir.

Dönüş değeri scalar (tek) bir değer ya da bir tablo olabilir. Diğer sorgularda kullanılabilecek yeniden kullanılabilir bir rutin oluşturmak için bu deyimi kullanın.

SQL veritabanlarında, kullanıcı tanımlı bir işlev, SQL deyimlerinde değerlendirilebilecek bir işlev ekleyerek veritabanı sunucusunun işlevselliğini genişletmek için bir mekanizma sağlar. SQL standardı scalar ve tablo fonksiyonları arasında ayrım yapar.

Bir scalar fonksiyon yalnızca tek bir değer (veya NULL) döndürürken, bir tablo fonksiyonu her satırda bir veya daha fazla sütun bulunan sıfır veya daha fazla satırdan oluşan bir (ilişkisel) tablo döndürür.
Saklı Yordamlar ve İşlevler:
- Yalnızca fonksiyonlar bir değer döndürebilir (RETURN anahtar sözcüğünü kullanarak).
- Saklı yordamlar RETURN anahtar sözcüğünü kullanabilir ancak herhangi bir değer aktarılmaz[1]
- Fonksiyonlar, herhangi bir veri manipülasyonu yapmamaları ve ayrıca herhangi bir OUT veya IN OUT parametresine sahip olmamaları koşuluyla SELECT deyimlerinde kullanılabilir.
- Fonksiyonlar bir değer döndürmelidir, ancak saklı yordamlar için bu zorunlu değildir.
- Bir fonksiyon sadece IN parametrelerine sahip olabilirken, saklı prosedürler OUT veya IN OUT parametrelerine sahip olabilir.
- Bir fonksiyon, belirli hesaplamaları gerçekleştirmek ve tek bir değer döndürmek için yazılmış bir alt programdır.
- Saklı yordam, bir dizi eylemi gerçekleştirmek için yazılmış bir alt programdır ve OUT parametresini kullanarak birden fazla değer döndürebilir veya hiç değer döndürmeyebilir.
SQL’de kullanıcı tanımlı fonksiyonlar CREATE FUNCTION deyimi kullanılarak bildirilir.
Fonksiyonu oluşturduğumuzda, fonksiyonu yerleşik fonksiyonları kullandığımız şekilde kullanabiliriz.

Triggers
Bir veritabanı tetikleyicisi, bir veritabanındaki belirli bir tabloda belirli olaylara yanıt olarak otomatik olarak yürütülen koddur.

Tetikleyici oluşturmak için sözdizimi:

CREATE TRIGGER <TriggerName> on <TableName>
FOR INSERT, UPDATE, DELETE
AS
… Kodunuzu buraya yazın
GO

Tetikleyici, Tetikleyici başlığında belirtildiği şekilde tabloya veri eklendiğinde, güncellendiğinde veya silindiğinde otomatik olarak yürütülür.

INSERTED ve DELETED:
Tetikleyicilerin içinde iki özel tablo kullanabiliriz: DELETED tablosu ve INSERTED tabloları.

SQL Server bu tabloları otomatik olarak oluşturur ve yönetir. Belirli veri değişikliklerinin etkilerini test etmek için bu geçici, bellekte yerleşik tabloları kullanabilirsiniz. Bu tablolardaki verileri değiştiremezsiniz.
DELETED tablosu, DELETE ve UPDATE deyimleri sırasında etkilenen satırların kopyalarını saklar. Bir DELETE veya UPDATE deyiminin yürütülmesi sırasında satırlar tetikleyici tablosundan silinir ve DELETED tablosuna aktarılır.

INSERTED tablosu, INSERT ve UPDATE deyimleri sırasında etkilenen satırların kopyalarını depolar. Bir ekleme veya güncelleme işlemi sırasında, hem INSERTED tablosuna hem de tetikleyici tablosuna yeni satırlar eklenir. INSERTED tablosundaki satırlar, tetikleyici tablosundaki yeni satırların kopyalarıdır.

Uzun uzun bir yazı daha bitti :)

Kaynalar:

--

--