ADIM ADIM SQL-3

Esin Çağla Kıral
13 min readMar 25, 2024

--

Merhabalar arkadaşlar, Bu içerik başlatmış olduğum adım adım SQL serimin üçüncü içeriği olacaktır. Bu içerik, çok önemli olan bir çok konuyu barındıran oldukça uzun bir içeriktir. Bu içerikten önce eğer SQL temeliniz yoksa önce “Adım Adım SQL-1“ ve ardından “Adım Adım SQL-2” yazımı okumanızı öneriyorum. Çünkü bu yazımda bahsedeceğim konuları iyi anlayabilmeniz için SQL de sorgu temelimizin olması gerekmektedir.

SQL öğrenirken almış olduğum notlarımı daha kapsamlı, detaylı ve bol örnekli hale getirerek edinmiş olduğum bilgilerle sizlere de aktarmak istedim. Bu yazımda birkaç farklı konu başlığından bahsedeceğim. Öncelikle işleyeceğimiz konu başlıklarını sıralamak isterim ki, sizler dilerseniz içeriğimin tamamını okur dilerseniz de ihtiyacınız dahilinde ilgili olan kısımlara bakabilirsiniz.

Bu içerikte yer alacak olan konu başlıkları (sırasıyla);

  • SQL ‘de Join Türleri (Inner Join, Left Join, Right Join)
  • SQL’ de Matematiksel, Metinsel ve Aritmatiksel Fonksiyonlar
  • SQL ‘de Prosedür Kullanımı
  • SQL ‘de Date Sorguları

O halde hadi başlayalım :)

SQL Injection Prevention: A Comprehensive Guide with Code Examples” | by  Abhinav | Stackademic

SQL ‘de Join Türleri (Inner Join, Left Join, Right Join, Full Join ve Union)

SQL’de INNER JOIN, LEFT JOIN ve RIGHT JOIN, ilişkisel veri tabanlarında tablolar arasında ilişki kurmak için kullanılan birleştirme işlemleridir. Bu JOIN türleri, farklı tablolardan veri alarak belirli koşullara göre bu verileri birleştirir. Aşağıda konun daha detaylı anlaşılması ve pekiştirilmesi adına her bir JOIN türü için örnekleri vermek istedim. Örnekleri inceleyecek olursak;

INNER JOIN

INNER JOIN, birleştirilecek tablolardaki her iki tablodaki sütunlar arasında eşleşen değerlere dayalı olarak verileri birleştirir. Bu, sadece eşleşen satırları içeren bir sonuç kümesi döndürür.

Örnek: Diyelim ki bir şirketin çalışanları ve departmanları hakkında bilgi içeren iki tablosu olmasını istiyoruz: “employees” (çalışanlar) ve “departments” (departmanlar). İki tabloyu önce oluşturalım:

CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(50)
);

CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(50),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

INSERT INTO departments (department_id, department_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT'),
(4, 'Marketing');

INSERT INTO employees (employee_id, name, department_id) VALUES
(101, 'John Miller', 1),
(102, 'Jane Smith', 2),
(103, 'Michael Johnson', 1),
(104, 'Emily Davis', 3),
(105, 'David Brown', NULL),
(106, 'Justin Wincent', NULL),
(107, 'Sarah Brown', 4);

Bu sorgu sonucunda oluşan tablolarımıza bir göz atalım:

employees tablosu
departments tablosu

Şimdi bu iki tablo için inner join işlemi uygulayalım ve sonuçları görelim:

SELECT employees.employee_id, employees.name AS employee_name, departments.department_id, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

-- INNER JOIN sonucunda sadece eşleşen departmanlar ve çalışanlar görünecektir
Inner Join Sonuç Tablosu

Görüldüğü gibi INNER JOIN sonucunda sadece eşleşen departmanlar ve çalışanlar görünmektedir.

LEFT JOIN

LEFT JOIN, sol tablodaki tüm satırları ve eşleşen satırları sağ tablodan birleştirir. Eğer sağ tabloda eşleşen bir satır yoksa, sol tablonun ilgili sütunları NULL değeri alır.

Örnek: Yine çalışanlar ve departmanlar örneğinden devam edelim, ancak bu sefer tüm çalışanların departman bilgisini alalım, eğer bir çalışan bir departmana atanmamışsa da onu alalım:

SELECT employees.employee_id, employees.name AS employee_name, departments.department_id, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

-- LEFT JOIN sonucunda ise tüm çalışanlar ve eşleşen departmanlar veya eşleşmeyen çalışanlar (NULL değeri ile) gösterilmektedir.
Left Join Sonuç Tablosu

Görüldüğü gibi LEFT JOIN onucunda ise tüm çalışanlar ve eşleşen departmanlar veya eşleşmeyen çalışanlar (NULL değeri ile) gösterilmektedir.

RIGHT JOIN

RIGHT JOIN, RIGHT OUTER JOIN olarak da adlandırılır ve LEFT JOIN’in tersidir. Sağ tablodaki tüm satırları ve eşleşen satırları sol tablodan birleştirir. Eğer sol tabloda eşleşen bir satır yoksa, sağ tablonun ilgili sütunları NULL değeri alır.

Örnek: Aynı örneği kullanarak, bu sefer tüm departmanların çalışan bilgisini alalım, eğer bir departmanda hiç çalışan yoksa da o departmanı alalım:

SELECT employees.employee_id, employees.name AS employee_name, departments.department_id, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

--RIGHT JOIN sonucunda ise tüm departmanlar ve eşleşen çalışanlar veya eşleşmeyen departmanlar (NULL değeri ile) gösterilecektir.
Right Join Sonuç Tablosu

Görüldüğü gibi RIGHT JOIN sonucunda ise tüm departmanlar ve eşleşen çalışanlar veya eşleşmeyen departmanlar (NULL değeri ile) gösterilmektedir.

FULL JOIN

Full Join, sol ve sağ tablodaki tüm satırları birleştirir. Eşleşen satırlar normal birleştirmede olduğu gibi birleştirilirken, eşleşmeyen satırlar da NULL değeri ile doldurulur.

Örnek: Departmanlar ve çalışanlar arasında bir tam birleştirme gerçekleştirelim:

SELECT employees.name AS employee_name, departments.department_name
FROM employees
FULL JOIN departments ON employees.department_id = departments.department_id;
Full Join Sonuç Tablosu

UNION

Union, iki ayrı sorgunun sonuçlarını birleştirir. Her iki sorgunun sonuçları aynı sütunlara sahip olmalıdır. Sonuçlar tekrarlı satırları kaldırarak birleştirilir.

Örnek: Departmanlar ve çalışanlar tablolarından departman adlarını ve çalışan isimlerini alarak birleştirelim:

SELECT department_name FROM departments
UNION
SELECT name FROM employees;
Union Sonuç Tablosu

Bu sorguları çalıştırdıktan sonra, Full Join’un sağladığı tüm departman ve çalışan bilgilerini içeren sonuçları görebilirsiniz. Union ise iki sorgunun sonuçlarını birleştirerek, tekrarlanan satırları kaldırarak tek bir sonuç kümesi olarak sunar bizlere.

Basitçe kavramları açıkladım şimdi ise bir örnek daha yaparak konuyu pekiştirelim istiyorum.

SELECT DERSAD, SINAV1, SINAV2, SINAV3, ORTALAMA, DURUM 
FROM TBLNOTLAR
INNER JOIN TBLDERSLER
ON TBLNOTLAR.DERS= TBLDERSLER.DERSID
WHERE OGRENCI=(SELECT OGRID FROM TBLOGRENCILER WHERE OGRAD='Ceren' AND OGRSOYAD='Karmış')

Bu SQL sorgusu, ‘Ceren’ adındaki bir öğrencinin notlarını ve ders bilgilerini getirir. İlk olarak, ‘Ceren’ adındaki öğrencinin ID’sini TBLOGRENCILER tablosundan bulmalıyız:

SELECT OGRID FROM TBLOGRENCILER WHERE OGRAD='Ceren' AND OGRSOYAD='Karmış';

Bu alt sorgu, ‘Ceren’ adındaki öğrencinin ID’sini bulur.

Sonrasında, bulunan öğrenci ID’si ile TBLNOTLAR ve TBLDERSLER tablolarını birleştirerek notları ve ders bilgilerini çekiyoruz.

SELECT DERSAD, SINAV1, SINAV2, SINAV3, ORTALAMA, DURUM 
FROM TBLNOTLAR
INNER JOIN TBLDERSLER ON TBLNOTLAR.DERS = TBLDERSLER.DERSID
WHERE OGRENCI = (SELECT OGRID FROM TBLOGRENCILER WHERE OGRAD='Ceren' AND OGRSOYAD='Karmış');

Bu sorgu, ‘Ceren’ adındaki öğrencinin aldığı derslerin adlarını (DERSAD), bu derslerdeki üç sınavın notlarını (SINAV1, SINAV2, SINAV3), notların ortalamasını (ORTALAMA) ve durumunu (DURUM) getirir. TBLNOTLAR tablosundaki derslerin DERS sütunu ile TBLDERSLER tablosundaki derslerin DERSID sütunu birleştirilir. Bu şekilde derslerin adlarına erişilir ve öğrencinin notlarıyla birlikte getirilir.

Bu şekilde basit bir örnekle tablo görüntüleri ve SQL sorgularıyla SQL de Join kavramını işlemiş olduk.

SQL’ de Matematiksel, Metinsel ve Aritmatiksel Fonksiyonlar

SQL’de aritmetik fonksiyonlar, aritmetik işlemler ve matematiksel fonksiyonlar veri tabanı işlemlerinde sıkça kullanılan ve hesaplamalarda büyük kolaylık sağlayan özelliklerdir. Bu fonksiyonlarla verileri işleyebilir, manipüle edebilir ve istenilen sonuçları elde edebiliriz. Sıkça kullanılan bir durumdur. Bu fonksiyonlar, veri analizi, raporlama ve işlem gereksinimlerinizi karşılamak için çok çeşitli senaryolarda kullanılabilir.

SQL ’de Aritmetik İşlemler

Aritmetik işlemler temel matematiksel işlemleri ifade eder. Bunlar, toplama, çıkarma, çarpma ve bölme işlemleridir. SQL’de bu işlemleri kolayca gerçekleştirebiliriz.

-- Toplama işlemi
SELECT column1, column2, column1 + column2 AS sum_result
FROM table_name;

-- Çıkarma işlemi
SELECT column1, column2, column1 - column2 AS subtraction_result
FROM table_name;

-- Çarpma işlemi
SELECT column1, column2, column1 * column2 AS multiplication_result
FROM table_name;

-- Bölme işlemi
SELECT column1, column2, column1 / column2 AS division_result
FROM table_name;

Matematiksel Fonksiyonlar

SQL’de matematiksel fonksiyonlar, trigonometrik fonksiyonlar, karekök alma, üs alma gibi matematiksel işlemleri gerçekleştirmemize olanak tanır.

-- Karekök alma
SELECT column1, SQRT(column1) AS square_root
FROM table_name;

-- Üs alma
SELECT column1, POWER(column1, 2) AS power_result
FROM table_name;

-- Mutlak değer alma
SELECT column1, ABS(column1) AS absolute_value
FROM table_name;

-- Trigonometrik fonksiyonlar (Örneğin, SIN, COS, TAN)
SELECT column1, SIN(column1) AS sine_value
FROM table_name;

AVG ve SUM Fonksiyonları

Bu fonksiyonlar genellikle bir sütundaki değerlerin ortalama veya toplamını hesaplamak için kullanılır.

-- Bir sütundaki değerlerin ortalaması
SELECT AVG(column1) AS average_value
FROM table_name;

-- Bir sütundaki değerlerin toplamı
SELECT SUM(column1) AS sum_value
FROM table_name;

-- Grup bazında ortalama hesaplama
SELECT category, AVG(column1) AS average_value
FROM table_name
GROUP BY category;

FLOOR Fonksiyonu ile Yuvarlama

-- Bir sütundaki değerlerin en yakın küçük tam sayıya yuvarlanması
SELECT column1, FLOOR(column1) AS rounded_down_value
FROM table_name;

Bu sorgu, column1 adlı sütundaki her bir değeri en yakın küçük tam sayıya yuvarlayarak yeni bir sütun olan rounded_down_value içine yerleştirir.

CEILING Fonksiyonu ile Yuvarlama

-- Bir sütundaki değerlerin en yakın büyük tam sayıya yuvarlanması
SELECT column1, CEILING(column1) AS rounded_up_value
FROM table_name;

Bu sorgu, column1 adlı sütundaki her bir değeri en yakın büyük tam sayıya yuvarlayarak yeni bir sütun olan rounded_up_value içine yerleştirir.

Basitçe kavramları açıkladım şimdi ise bir örnek daha yaparak konuyu pekiştirelim istiyorum.

Örnek:

SELECT SUM(SINAV1) FROM TBLNOTLAR WHERE OGRENCI=1 
-- TBLNOTLAR tablosunda öğrenci numarası 1 olan öğrencinin tüm SINAV1 notlarının toplamını hesaplar.

SELECT SINAV1, DERS FROM TBLNOTLAR WHERE OGRENCI=1
--TBLNOTLAR tablosunda öğrenci numarası 1 olan öğrencinin aldığı tüm derslerin notlarını ve derslerin adlarını getirir.

SELECT DERSAD, SINAV1 FROM TBLNOTLAR INNER JOIN TBLDERSLER
ON TBLNOTLAR.DERS= TBLDERSLER.DERSID WHERE OGRENCI=1
--TBLNOTLAR ve TBLDERSLER tablolarını birleştirerek öğrenci numarası 1 olan öğrencinin aldığı tüm derslerin adlarını ve notlarını getirir.
--TBLNOTLAR tablosunda derslerin DERS sütunu ile TBLDERSLER tablosundaki derslerin DERSID sütunu birleştirilir

Bu örnekte SQL sorgusu, bir öğrencinin notlarını ve derslerini çekmek için kullanılır. TBLNOTLAR tablosu öğrenci notlarını saklarken, TBLDERSLER tablosu derslerin bilgilerini içerir. İki tablo arasında DERS sütunu ile birleştirme yapılarak ders adlarına erişilir.

METİNSEL FONKSİYONLAR

  • UPPER: Bir metni büyük harfe dönüştürür.
  • LOWER: Bir metni küçük harfe dönüştürür.
  • SUBSTRING: Belirli bir metin dizisinden bir alt dizesi alır.
  • LEFT, RIGHT: Metnin belirli bir başlangıç veya bitiş kısmını alır.
  • LEN: Bir metnin uzunluğunu verir.
  • LTRIM, RTRIM: Soldan veya sağdan boşlukları kaldırır.
  • REPLACE: Belirli bir metin içindeki belirli bir alt dizesini başka bir alt dizeyle değiştirir.
  • CHARINDEX: Belirli bir karakter dizisinin başlangıç pozisyonunu döndürür.
  • REVERSE: Bir metnin karakterlerini tersine çevirir.

Bu fonksiyonları aşağıdaki gibi kullanabiliriz.

SELECT UPPER(product_name) AS uppercase_name FROM products;
-- products tablosunda yer alan product_name sütunundaki verileri büyük harfe dönüştürür.


SELECT SUBSTRING(product_name, 1, 3) AS short_name FROM products;
-- products tablosundaki her product_name değerinin ilk 3 karakterini alır
-- ve bunları short_name adlı bir sütunda döndürür.
-- Yani, ürün adlarının kısaltılmış bir versiyonunu elde edersiniz.


SELECT LEFT(product_name, 5) AS left_part FROM products;
-- products tablosundaki her product_name değerinin solundan başlayarak ilk 5 karakterini seçer
-- ve left_part adında bir sütunda döndürür.
-- Bu, ürün adlarının başlangıcından ilk 5 karakteri almak için kullanılır.


SELECT LEN(product_description) AS description_length FROM products;
-- products tablosundaki her bir product_description sütununun uzunluğunu (karakter sayısını) hesaplar
-- ve bu uzunluğu description_length adlı bir sütunda döndürür.


SELECT RTRIM('Hello ') AS trimmed_string;
-- verilen string ifadenin (bu örnekte 'Hello ') sağ tarafındaki boşlukları siler
-- ve sonucu trimmed_string adında bir sütunda döndürür.
-- Sonuç, sağ tarafındaki fazla boşluklardan arındırılmış 'Hello' stringidir.


SELECT REPLACE('Hello, World!', 'World', 'SQL') AS replaced_string;
-- verilen string içindeki bir alt stringi (bu örnekte 'World') başka bir alt string ile değiştirir
-- (bu örnekte 'SQL'). Sonuç, replaced_string adında bir sütunda döndürülür ve 'Hello, SQL!' olur.


SELECT CHARINDEX('or', 'Hello World') AS position;
-- ikinci verilen string içinde (bu örnekte 'Hello World') ilk stringin (bu örnekte 'or')
-- başladığı konumun indeksini bulur. İndeks 1'den başlar. or ifadesi 8. pozisyonda başladığı için sonuç 8'dir.


SELECT REVERSE('Hello') AS reversed_string;
-- verilen stringin (bu örnekte 'Hello') ters çevrilmiş halini döndürür ve sonuç reversed_string adında
-- bir sütunda döndürülür. Bu durumda, ters çevrilmiş string 'olleH' olacaktır.

Şimdi bir tablo oluşturalım, tabloya veriler ekleyelim ve bu fonksiyonları nasıl kullanabiliriz onu görelim:

Örneğimiz bir e-ticaret veritabanı olsun. İki ana tablomuz olsun: “Ürünler (Products)” ve “Siparişler (Orders)”. Ürünler tablosunda ürünlerin ID’si, adı, fiyatı gibi bilgiler olsun. Siparişler tablosunda ise siparişlerin ID’si, ürün ID’si, miktarı, müşteri bilgileri gibi bilgiler bulunsun.

Öncelikle tabloları oluşturalım ve verileri ekleyelim:

CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(50),
Price DECIMAL(10, 2)
);

CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
ProductID INT,
Quantity INT,
CustomerName VARCHAR(100)
);

-- Ürünler tablosuna veri ekleme
INSERT INTO Products (ProductID, ProductName, Price)
VALUES
(1, 'Laptop', 1200.00),
(2, 'Akıllı Telefon', 800.00),
(3, 'Tablet', 400.00),
(4, 'Kulaklık', 50.00),
(5, 'Klavye', 80.00);

-- Siparişler tablosuna veri ekleme
INSERT INTO Orders (OrderID, ProductID, Quantity, CustomerName)
VALUES
(1, 1, 2, 'Ahmet Kaya'),
(2, 2, 1, 'Ayşe Yılmaz'),
(3, 3, 3, 'Fatma Demir'),
(4, 4, 2, 'Mehmet Öz'),
(5, 5, 1, 'Zeynep Can');

-- Ürünler tablosuna birkaç yeni ürün ekleme
INSERT INTO Products (ProductID, ProductName, Price)
VALUES
(6, 'Masa', 150.00),
(7, 'Fare', 30.00);

-- Birkaç sipariş daha ekleyelim
INSERT INTO Orders (OrderID, ProductID, Quantity, CustomerName)
VALUES
(6, 1, 1, 'Deniz Yıldız'),
(7, 4, 3, 'Canan Toprak');

Oluşturulan tablolarımızın son haline bir göz atalım:

Product Tablosu
Orders Tablosu

Şimdi bu tablolar üzerinden sorgularımızla işlemleri yapmaya başlayalım:

Belirli bir Müşteriye Ait Siparişler ve Toplam Harcama:

SELECT Orders.OrderID, Products.ProductName, Orders.Quantity, Orders.Quantity * Products.Price AS TotalPrice, Orders.CustomerName
FROM Orders
JOIN Products ON Orders.ProductID = Products.ProductID
WHERE Orders.CustomerName = 'Ahmet Kaya';
Sonuç Tablosu

Ürün İsimlerini Büyük Harfe Çevirme:

SELECT UPPER(ProductName) AS UpperProductName
FROM Products;
Sonuç Tablosu

Müşteri İsimlerini Küçük Harfe Çevirme:

SELECT LOWER(CustomerName) AS LowerCustomerName
FROM Orders;
Sonuç Tablosu

Ürün İsimlerinden Belirli Bir Parçayı Almak:

-- 'Laptop' kelimesinin ilk 3 harfini alalım
SELECT ProductName, SUBSTRING(ProductName, 1, 3) AS SubstrProductName
FROM Products
WHERE ProductID = 1;
Sonuç Tablosu

Müşteri İsimlerinin İlk 5 Karakterini Almak:

SELECT CustomerName, LEFT(CustomerName, 5) AS LeftCustomerName
FROM Orders;
Sonuç Tablosu

Müşteri İsimlerinin Sağdan İlk 4 Karakterini Almak:

SELECT CustomerName, RIGHT(CustomerName, 4) AS RightCustomerName
FROM Orders;
Sonuç Tablosu

Müşteri İsimlerinin Uzunluğunu Bulmak:

SELECT CustomerName, LEN(CustomerName) AS NameLength
FROM Orders;
Sonuç Tablosu

Müşteri İsimlerindeki Boşlukları Temizlemek (Varsa):

SELECT LTRIM(RTRIM(CustomerName)) AS TrimmedCustomerName
FROM Orders;
Sonuç Tablosu

Bir Ürün İsmindeki Bir Kelimeyi Değiştirmek:

-- 'Akıllı Telefon' yerine 'Cep Telefonu' kullanalım
SELECT ProductName, REPLACE(ProductName, 'Akıllı', 'Cep') AS ReplacedProductName
FROM Products
WHERE ProductID = 2;
Sonuç Tablosu

Bir Müşteri İsmi İçinde ‘a’ Harfinin İlk Konumunu Bulmak:

SELECT CustomerName, CHARINDEX('a', CustomerName) AS PositionOfA
FROM Orders;
Sonuç Tablosu

Bir Müşteri İsmini Tersine Çevirmek:

SELECT CustomerName, REVERSE(CustomerName) AS ReversedCustomerName
FROM Orders;
Sonuç Tablosu

Toplam Sipariş Miktarını Bulmak:

SELECT SUM(Quantity) AS TotalQuantity
FROM Orders;
Sonuç Tablosu

Ortalama Ürün Fiyatını Hesaplamak:

SELECT AVG(Price) AS AveragePrice
FROM Products;
Sonuç Tablosu

Sql ‘de matematiksel ve metinsel fonksiyonlarının kullanımı ise bu şekildedir. oldukça detaylı örneklerle konuyu iyice pekiştirdiğimizi düşünüyorum.

SQL ‘de Prosedür Kullanımı

SQL’de prosedürler (stored procedures), veritabanı işlemlerini yapmak için kullanılan önemli araçlardır. Prosedürler, bir veya daha fazla SQL ifadesini içeren ve veritabanında saklanan adlandırılmış bloklardır. Bu bloklar, bir işlemi gerçekleştirmek için birden çok SQL ifadesini bir araya getirebilir, parametre alabilir ve işlemleri tekrar kullanılabilir hale getirebilir.

SQL’de prosedür kullanımı, prosedür silme ve güncelleme (DROP & ALTER), parametreli prosedür kullanımı hakkında daha detaylı bilgilere sahip olabilmemiz adına yine örneklemeli bir şekilde anlatacağım.

Tabloların Oluşturulması

CREATE TABLE Category (
CategoryID INT PRIMARY KEY,
CategoryName NVARCHAR(100)
);

CREATE TABLE Customer (
CustomerID INT PRIMARY KEY,
Name NVARCHAR(100),
Email NVARCHAR(100)
);

CREATE TABLE Employee (
EmployeeID INT PRIMARY KEY,
FirstName NVARCHAR(100),
LastName NVARCHAR(100),
Position NVARCHAR(100)
);

CREATE TABLE Product (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(100),
Price DECIMAL(10, 2),
CategoryID INT,
FOREIGN KEY (CategoryID) REFERENCES Category(CategoryID)
);

Prosedürlerin Oluşturulması

Müşteri Ekleme Prosedürü:

CREATE PROCEDURE AddCustomer
@Name NVARCHAR(100),
@Email NVARCHAR(100)
AS
BEGIN
INSERT INTO Customer (Name, Email) VALUES (@Name, @Email);
END;

Personel Ekleme Prosedürü:

CREATE PROCEDURE AddEmployee
@FirstName NVARCHAR(100),
@LastName NVARCHAR(100),
@Position NVARCHAR(100)
AS
BEGIN
INSERT INTO Employee (FirstName, LastName, Position) VALUES (@FirstName, @LastName, @Position);
END;

Ürün Ekleme Prosedürü:

CREATE PROCEDURE AddProduct
@ProductName NVARCHAR(100),
@Price DECIMAL(10, 2),
@CategoryID INT
AS
BEGIN
INSERT INTO Product (ProductName, Price, CategoryID) VALUES (@ProductName, @Price, @CategoryID);
END;

Kategoriye Göre Ürünleri Listeleme Prosedürü:

CREATE PROCEDURE GetProductsByCategory
@CategoryID INT
AS
BEGIN
SELECT * FROM Product WHERE CategoryID = @CategoryID;
END;

Müşteri Güncelleme Prosedürü:

CREATE PROCEDURE UpdateCustomerEmail
@CustomerID INT,
@NewEmail NVARCHAR(100)
AS
BEGIN
UPDATE Customer SET Email = @NewEmail WHERE CustomerID = @CustomerID;
END;

Prosedürleri Çalıştırma

Prosedürleri çalıştırmak için EXEC veya EXECUTE komutunu kullanabilirsiniz. Mesela, bir müşteri eklemek için:

EXEC AddCustomer @Name = 'Esin Kıral', @Email = 'esin.kiral@example.com';

Microsoft SQL Server’ da prosedürler bu şekilde oluşturulur ve kullanılır.

SQL ‘de Date Sorguları

Şimdi bu konuyu direk sorgular üzerinden anlatacağım. Aşağıdaki örnek sorguları inceleyelim:

-- SELECT sorgusu kullanarak tüm çalışanların adlarını ve soyadlarını listeleme
SELECT first_name, last_name
FROM Employees;

-- Tüm çalışanların adlarını ve işe alındıkları tarihi listeleyen bir sorgu
SELECT first_name, last_name, hire_date
FROM Employees;

-- İşe alınan en son kişinin adını ve soyadını bulma
SELECT TOP 1 first_name, last_name
FROM Employees
ORDER BY hire_date DESC;

-- İşe alındıkları tarihten itibaren 5 yıl veya daha fazla çalışanları bulma
SELECT first_name, last_name, hire_date
FROM Employees
WHERE DATEDIFF(year, hire_date, GETDATE()) >= 5;

-- Yaşları 30 ile 40 arasında olan çalışanları bulma
SELECT first_name, last_name, birth_date
FROM Employees
WHERE DATEDIFF(year, birth_date, GETDATE()) BETWEEN 30 AND 40;

-- İşe alındıkları tarihten itibaren 10 yıl geçmiş olan çalışanların adlarını ve işe alındıkları tarihleri bulma
SELECT first_name, last_name, hire_date
FROM Employees
WHERE DATEDIFF(year, hire_date, GETDATE()) >= 10;

-- Tüm çalışanların adlarını ve doğum tarihlerini listeleyen bir sorgu
SELECT first_name, last_name, birth_date
FROM Employees;

-- Doğum tarihi 1980 yılından önce olan çalışanları bulma
SELECT first_name, last_name, birth_date
FROM Employees
WHERE YEAR(birth_date) < 1980;

-- İşe alındıkları tarihten itibaren 5 yıl sonra doğum günü olan çalışanları bulma
SELECT first_name, last_name, birth_date, DATEADD(year, DATEDIFF(year, birth_date, GETDATE()) + 5, birth_date) AS next_birthday
FROM Employees
WHERE DATEADD(year, DATEDIFF(year, birth_date, GETDATE()) + 5, birth_date) = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0);

-- Tüm çalışanların adlarını, işe alındıkları tarihleri ve şu anki yaşlarını gösteren bir sorgu
SELECT first_name, last_name, hire_date, DATEDIFF(year, birth_date, GETDATE()) AS age
FROM Employees;

Bu sorgular, Employees adlı bir tablodan çalışanlarla ilgili bilgileri çıkarmak için kullanılabilir. hire_date ve birth_date alanları tarih veri türünde olduğu için, DATEDIFF, DATEADD ve tarih aralıklarını bulmak için diğer tarih işlevleri kullandım.

Bir diğer sorgu örneğinde ise Datapart ve Dataname sorgularının ne işe yaradığına bir göz atalım:

-- DATAPART ve DATANAME işlevlerinin kullanımı
DECLARE @date datetime = '2024-03-25 15:30:45';

-- Örnek 1: Tarih değerinden yılı alırız
SELECT DATAPART(year, @date) AS 'Year', DATANAME(year) AS 'Year_Name';

-- Örnek 2: Tarih değerinden ayı alırız
SELECT DATAPART(month, @date) AS 'Month', DATANAME(month) AS 'Month_Name';

-- Örnek 3: Tarih değerinden günü alırız
SELECT DATAPART(day, @date) AS 'Day', DATANAME(day) AS 'Day_Name';

-- BETWEEN kullanarak belirli bir tarih aralığında olan verileri seçeriz
SELECT *
FROM Employees
WHERE first_name BETWEEN '2024-01-01' AND '2024-03-31';

Bu örneklerde, DATAPART işleviyle tarih değerinin belirli bir bölümü alınırken, DATANAME işlevi o bölümün adını döndürmektedir. BETWEEN ifadesi ise belirli bir tarih aralığında olan verileri seçmek için kullandım.

Oldukça uzun ama bir o kadar da önemli konuları barındıran bir blog olduğuna inanıyorum. Bol örneklemeli bir şekilde sizlerin de uygulayabileceği örneklerle ve açıklamalarıyla konuları iyi özümsemenizi sağlamak istedim. Aynı zamanda benim içinde güzel bir tekrar oldu. İlk 3 yazımla sql ile alakalı bir çok konuyu ele aldık. yalnızca bir kaç konu kaldı. Onları da bu içeriğe sığmayacağını (çok aşırı uzun olacaktı zaten uzun :D) düşündüğüm için bir sonraki yazıma saklıyorum.

O zamaan bir sonraki yazımda görüşmek üzereee :)

Keyifli kodlamalar… :)

--

--