SQL Çalışma Notları: Birleştirmeler ve T-SQL

1. Birleştirmeler (JOIN)

Soru: 2 tablodaki (personeller ve departman) ortak alanları birleştiren (Inner Join) sorgusunu yazalım.

SELECT * FROM tbl_personeller
INNER JOIN tbl_departman
ON tbl_personeller.departman_id = tbl_departman.departman_id

Soru: Sol taraftaki tabloya (personeller) göre birleştirme yapan (Left Join) sorgusunu yazalım.

SELECT * FROM tbl_personeller
LEFT JOIN tbl_departman
ON tbl_personeller.departman_id = tbl_departman.departman_id

Soru: Sağ taraftaki tabloya (departman) göre birleştirme yapan (Right Join) sorgusunu yazalım.

SELECT * FROM tbl_personeller
RIGHT JOIN tbl_departman
ON tbl_personeller.departman_id = tbl_departman.departman_id

Soru: Hem Left Join hem Right Join işlemini bir arada gerçekleştiren (Full Outer Join) sorgusunu yazalım.

SELECT * FROM tbl_personeller
FULL OUTER JOIN tbl_departman
ON tbl_personeller.departman_id = tbl_departman.departman_id

2. T-SQL Değişken Tanımlama

Soru: Şehir isminde bir değişken oluşturalım. Bu değişkene ‘Ankara’ değerinin atamasını yapalım ve listeleyelim.

DECLARE @sehir VARCHAR(20)
SET @sehir = 'Ankara'
SELECT @sehir

Soru: Değişken olarak tanımlanan iki sayıyı toplayan sorguyu yazalım.

DECLARE @sayi1 INT, @sayi2 INT, @sonuc INT
SET @sayi1 = 16
SET @sayi2 = 57
SET @sonuc = @sayi1 + @sayi2
SELECT @sonuc AS 'Toplam'

Soru: Değişken olarak tanımlanan üç sayının (10, 20, 30) ortalamasını alan sorguyu yazalım.

DECLARE @sayi1 INT, @sayi2 INT, @sayi3 INT, @ortalama FLOAT;
SET @sayi1 = 10;
SET @sayi2 = 20;
SET @sayi3 = 30;
SET @ortalama = (@sayi1 + @sayi2 + @sayi3) / 3.0;
SELECT @ortalama AS 'Ortalama';

Soru: Değişken olarak tanımlanan 200 sayısının %15’ini alan sorguyu yazalım.

DECLARE @sayi FLOAT, @yuzde FLOAT, @sonuc FLOAT;
SET @sayi = 200;
SET @yuzde = 15;
SET @sonuc = @sayi * (@yuzde / 100);
SELECT @sonuc AS 'Yüzde 15';

Soru: Ürünler tablosundaki toplam stok miktarını bir değişkene atayıp, değişken üzerinden listeleyen sorguyu yazalım.

DECLARE @toplamurun INT
SET @toplamurun = (SELECT SUM(stok_miktari) FROM tbl_urunler)
SELECT @toplamurun AS 'Toplam Ürün Sayısı-Stok Toplam'

Soru: 0 ile 100 arasında rastgele sayı üreten sorguyu yazalım.

DECLARE @random INT;
SET @random = RAND() * 100;
SELECT @random AS 'Rastgele Sayı';

Soru: Stok Miktarı 210’dan çok olan ürünlere %15 indirim yapan T-SQL sorguyu yazalım.

DECLARE @IndirimOrani FLOAT = 0.85;
UPDATE tbl_urunler
SET birim_fiyat = birim_fiyat * @IndirimOrani
WHERE stok_miktari > 210;

Soru: Satış fiyatı 200 TL olan bir ürüne %10 zam yapan sorguyu yazalım.

DECLARE @urunFiyati FLOAT, @zamOrani FLOAT, @zamliFiyat FLOAT;
SET @urunFiyati = 200.0;
SET @zamOrani = 10;
SET @zamliFiyat = @urunFiyati + (@urunFiyati * @zamOrani / 100);
SELECT @zamliFiyat AS 'Zamlı Fiyat';

3. T-SQL Kontrol Yapıları (IF - ELSE)

Soru: Ürünler tablomuzdaki toplam kayıt sayısının 16’dan büyük olup olmadığını kontrol eden sorguyu yazalım.

IF (SELECT COUNT(*) FROM tbl_urunler) > 16
    PRINT 'Toplam Kayıt Sayısı 16 dan Fazla'
ELSE
    PRINT 'Toplam Kayıt Sayısı 16 dan Az'

Soru: Personeller tablomuzda maaşı 100.000’den büyük personel olup olmadığını kontrol eden sorguyu yazalım.

IF EXISTS (SELECT * FROM tbl_personeller WHERE maas > 100000)
    PRINT 'Maaşı 100000 den fazla olan personel var'
ELSE
    PRINT 'Maaşı 100000 den fazla olan personel yok'

Soru: ‘Ayşe’ isimli bir personelimizin olup olmadığını kontrol eden sorguyu yazalım.

IF EXISTS (SELECT * FROM tbl_personeller WHERE ad = 'Ayşe')
    PRINT 'Ayşe isimli personelimiz var'
ELSE
    PRINT 'Ayşe isimli personelimiz yok'

Soru: ‘Aslı’ isimli bir personelimizin olup olmadığını kontrol eden ve varsa ekrana bilgilerini getiren sorguyu yazalım.

IF EXISTS (SELECT * FROM tbl_personeller WHERE ad = 'Aslı')
BEGIN
    SELECT 'Aslı isimli personelimiz var' AS Mesaj;
    SELECT * FROM tbl_personeller WHERE ad = 'Aslı';
END
ELSE
BEGIN
    SELECT 'Aslı isimli personelimiz yok' AS Mesaj;
END

Soru: Ürün id değeri 1 olan ürünün stok değeri 10’un altında ise ekrana ‘stok azaldı’, değilse ‘Stok yeterli’ yazan sorguyu yazalım.

DECLARE @StokMiktari INT;
SET @StokMiktari = (SELECT Stok_Miktari FROM tbl_urunler WHERE urun_id = 1);
IF @StokMiktari < 10
    PRINT 'Stok azaldı, sipariş verilmeli.';
ELSE
    PRINT 'Stok yeterli seviyede.';

Soru: Ürün id değeri 5 olan ürünün fiyatı 50 TL’nin üzerinde ise ekrana ‘fiyat yüksek’, değilse ‘fiyat uygun’ yazan sorguyu yazalım.

DECLARE @Fiyat DECIMAL(10, 2);
SET @Fiyat = (SELECT birim_fiyat FROM tbl_urunler WHERE urun_id = 5);
IF @Fiyat > 50
    PRINT 'Ürünün fiyatı yüksek.';
ELSE
    PRINT 'Ürünün fiyatı uygun.';

Soru: Ürün id değeri 2 olan ürünün kategorisini (Kalem, Kırtasiye veya Defter) kontrol eden sorguyu yazalım.

DECLARE @Kategori VARCHAR(50);
SET @Kategori = (SELECT Kategori FROM tbl_urunler WHERE urun_id = 2);
IF @Kategori = 'Kalem'
    PRINT 'Bu ürün kalem kategorisindedir.';
ELSE IF @Kategori = 'Kırtasiye'
    PRINT 'Bu ürün kırtasiye kategorisindedir.';
ELSE
    PRINT 'Bu ürün defter bir kategorisindedir.';

4. T-SQL Döngüler (WHILE)

Soru: 100’e kadar olan sayıları toplamak için bir döngü yazalım.

DECLARE @sayi INT = 1;
DECLARE @toplam INT = 0;
WHILE @sayi <= 100
BEGIN
    SET @toplam = @toplam + @sayi;
    SET @sayi = @sayi + 1;
END
SELECT @toplam AS '1-100 Arası Toplam';

Soru: Ekrana 5 kere ‘SQL Öğreniyoruz’ yazdıran döngüyü yazalım.

DECLARE @sayac INT = 1
WHILE (@sayac <= 5)
BEGIN
    PRINT 'SQL Öğreniyoruz'
    SET @sayac += 1
END

Soru: Ekrana 1 ile 10 arasındaki sayıları yazdıran döngüyü yazalım.

DECLARE @sayac INT = 1
WHILE (@sayac <= 10)
BEGIN
    PRINT @sayac
    SET @sayac += 1
END

Soru: Ekrana 1 ile 20 arasındaki 3’e tam bölünen sayıları yazdıran döngüyü yazalım.

DECLARE @sayac INT = 1
WHILE (@sayac <= 20)
BEGIN
    IF (@sayac % 3 = 0)
        PRINT @sayac
    SET @sayac += 1
END

Soru: Ürünlerin stok ortalaması 180’in üzerine çıkana kadar stoklara %30 artış uygulayan döngüyü yazalım.

WHILE (SELECT AVG(stok_miktari) FROM tbl_urunler) <= 180
BEGIN
    UPDATE tbl_urunler
    SET stok_miktari = stok_miktari + (stok_miktari * 30 / 100)
END

Soru: Girilen metnin (‘SQL Öğreniyorum’) her harfini ayrı satırda yazan döngüyü yazalım.

DECLARE @metin NVARCHAR(100) = 'SQL Öğreniyorum';
DECLARE @uzunluk INT = LEN(@metin);
DECLARE @i INT = 1;
WHILE (@i <= @uzunluk)
BEGIN
    PRINT SUBSTRING(@metin, @i, 1);
    SET @i += 1;
END;