-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsql_the_end.sql
417 lines (281 loc) · 10.9 KB
/
sql_the_end.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
CREATE TABLE Musteriler(
MusteriID SERIAL PRIMARY KEY,
Isim VARCHAR(50),
Soyisim VARCHAR(50),
Email VARCHAR(50),
telefon VARCHAR(15),
Adres VARCHAR(250),
Sehir VARCHAR(50),
Ulke VARCHAR(50)
);
INSERT INTO Musteriler(Isim, Soyisim, Email, Telefon, Adres, Sehir, Ulke)
VALUES
('Ali', 'Yılmaz', 'ali.yilmaz@example.com','5551234567', 'Caddesi 123', 'Ankara', 'Türkiye'),
('Ayşe', 'Demir', 'ayse.demir@example.com','5552345678', 'Sokak 456', 'İstanbul', 'Türkiye'),
('Mehmet', 'Kaya', 'mehmet.kaya@example.com','5551234589', 'Caddesi 789', 'İzmir', 'Türkiye'),
('Fatma', 'Yıldız', 'fatma.yıldız@example.com','5554567123', 'Mahalle 987', 'Antalya', 'Türkiye'),
('Ahmet', 'Taylan', 'ahmet.taylan@example.com','5551236789', 'Sokak 654', 'Bursa', 'Türkiye'),
('Emine', 'Çelik', 'emine.celik@example.com','5552341112', 'Merkez 123', 'Adana', 'Türkiye'),
('Hasan', 'Şahin', 'hasan.sahin@example.com','5557890123', 'Daire 123', 'Trabzon', 'Türkiye'),
('Zeynep', 'Öztürk', 'zeynep.ozturk@example.com','5558901234', 'Mahalle 123', 'Konya', 'Türkiye'),
('Mustafa', 'Aydın', 'mustafa.aydin@example.com','5559012345', 'Caddesi 321', 'Mersin', 'Türkiye'),
('Hatice', 'Çetin', 'hatice.cetin@example.com','5550123456', 'Sokak 789', 'Eskişehir', 'Türkiye');
CREATE TABLE Urunler(
URUNID Serial PRIMARY KEY,
UrunAdi VARCHAR(100),
KategoriID INT,
Fiyat DECIMAL(10,2),
Stok INT
);
INSERT INTO Urunler(UrunAdi, KategoriID, Fiyat, Stok)
VALUES
('Laptop', 1, 75000.00, 50),
('Akıllı Telefon', 1, 35000.00, 150),
('Kulaklık', 2, 150.00,300),
('Tablet', 1, 2000.00, 100),
('Klavye', 2, 200.00, 200),
('Monitör', 1, 1200.00, 75),
('Fare', 2, 100.00, 250),
('Yazıcı', 3, 600.00, 50),
('Webcam', 2, 250.00, 150),
('Hard Disk', 3, 400.000, 100);
CREATE TABLE Siparisler (
SiparisID SERIAL PRIMARY KEY,
MusteriID INT,
SiparisTarihi DATE,
ToplamTutar DECIMAL(10, 2)
);
INSERT INTO Siparisler (MusteriID, SiparisTarihi, ToplamTutar) VALUES
(1, '2024-07-01', 850.00),
(2, '2024-07-02', 1500.00),
(3, '2024-07-03', 600.00),
(4, '2024-07-04', 2300.00),
(5, '2024-07-05', 1200.00),
(6, '2024-07-06', 750.00),
(7, '2024-07-07', 3000.00),
(8, '2024-07-08', 450.00),
(9, '2024-07-09', 800.00),
(10, '2024-07-10', 350.00);
CREATE TABLE SiparisDetaylari (
SiparisDetayID SERIAL PRIMARY KEY,
SiparisID INT,
UrunID INT,
Miktar INT,
BirimFiyat DECIMAL(10, 2)
);
INSERT INTO SiparisDetaylari (SiparisID, UrunID, Miktar, BirimFiyat) VALUES
(1, 1, 1, 7500.00),
(1, 4, 2, 2000.00),
(2, 2, 1, 3500.00),
(2, 5, 2, 200.00),
(3, 6, 1, 1200.00),
(3, 3, 1, 2000.00),
(4, 7, 1, 100.00),
(4, 8, 1, 600.00),
(4, 9, 2, 250.00),
(5, 10, 3, 400.00),
(6, 2, 1, 3500.00),
(7, 1, 1, 7500.00),
(8, 3, 1, 2000.00),
(9, 4, 1, 150.00),
(10, 5, 1, 200.00);
CREATE TABLE Kategoriler (
KategoriID SERIAL PRIMARY KEY,
KategoriAdi VARCHAR(50)
);
INSERT INTO Kategoriler (KategoriAdi) VALUES
('Elektronik'),
('Aksesuarlar'),
('Ofis Ekipmanları');
-- SELECT ve FROM
-- Müşteriden tüm müşterileri seçelim
SELECT *
FROM Musteriler;
SELECT UrunAdi, Fiyat
FROM urunler;
-- WHERE -> Filtreleme yöntemi
-- Ankara'daki müşteriyi getir
SELECT *
FROM Musteriler
WHERE Sehir = 'Ankara';
-- Fiyatı 2000'den büyük ürünleri gelsin
SELECT UrunAdi, Fiyat
FROM urunler
WHERE Fiyat > 2000.00;
-- LIMIT -> Sınırlandırma, python, r, head(), ilk belirli birkaç değerleri sınırlıyordu.
-- Müşteri tablosundan ilk 5 müşteriyi seçelim
SELECT *
FROM musteriler
LIMIT 5;
-- Ürün tablosundan fiyatı en yüksek 3 ürünü
SELECT UrunAdi
FROM Urunler
ORDER BY Fiyat DESC
LIMIT 3;
-- JOIN -- ON --> Birden fazla tabloyu birleştirmek ve daha anlamlı sonuçları elde etmek için kullanıyoruz.
-- Siparişler ve Müşteriler tablolalarını birleştirelim
SELECT Siparisler.SiparisID, Musteriler.Isim, Musteriler.Soyisim, Siparisler.ToplamTutar
FROM Siparisler
JOIN Musteriler ON Siparisler.MusteriID = Musteriler.MusteriID;
-- Ankara'da yaşayan müşterilerin verdiği siparisler
SELECT SiparisID, Musteriler.Isim, Musteriler.Soyisim, Siparisler.ToplamTutar
FROM Siparisler
JOIN Musteriler ON Siparisler.MusteriID = Musteriler.MusteriID
WHERE Musteriler.Sehir = 'Ankara';
-- Fiyatı 1000 TL'den yüksek olan ürünlerin sipariş detaylarını seçelim ve ilk 4 değeri gösterelim.
SELECT SiparisDetaylari.SiparisID, Urunler.UrunAdi, SiparisDetaylari.Miktar, SiparisDetaylari.BirimFiyat
FROM SiparisDetaylari
JOIN Urunler ON SiparisDetaylari.UrunID = Urunler.UrunID
WHERE Urunler.Fiyat > 1000
LIMIT 4;
-- DISTINCT --> Unique olan değerleri getirir.
SELECT DISTINCT BirimFiyat
FROM SiparisDetaylari;
-- AGGREGATE FUNCTIONS: COUNT, SUM, AVG, MİN, MAX, GROUP BY, HAVING
-- count
-- Toplam müşteri sayısını
SELECT COUNT(*) AS ToplamMusteri
FROM Musteriler;
-- Her kategorideki ürün sayısı
SELECT KategoriID, COUNT(*) AS Urun_Sayısı
FROM Urunler
GROUP BY KategoriID;
-- SUM
-- Tüm siparişlerin toplam tutarını bulalım
SELECT SUM(ToplamTutar) AS toplam_siparis_tutari
FROM Siparisler;
-- Her müşterinin toplam harcamasını bulalım
SELECT Musteriler.MusteriID, Musteriler.Isim, Musteriler.Soyisim, SUM(Siparisler.ToplamTutar) AS Toplam_Harcama
FROM Siparisler
JOIN Musteriler ON Siparisler.MusteriID = Musteriler.MusteriID
GROUP BY Musteriler.MusteriID
ORDER BY Toplam_Harcama DESC;
-- AVG -> Beklenen Değer --> Aritmetik Ortalama --> Ortalama --> Tüm değeri topla / kaç tane değer var
-- Ürünlerin ortalama fiyatını bulalım
SELECT AVG(Fiyat) As OrtalamaFiyat
FROM Urunler;
-- Her kategorideki ürünlerin ortalam fiyatını bulun
SELECT KategoriID, AVG(Fiyat) AS Ortalama_Fiyatı
FROM Urunler
GROUP BY KategoriID;
-- MAX - MIN : En büyük değer, En küçük değer
-- En yüksek fiyatlı ürünü bulalım
SELECT MAX(Fiyat) as max_fiyat
FROM Urunler;
-- Her kategorideki en yüksek fiyatlı ürünü bulalım
SELECT KategoriID, MAX(Fiyat) AS Max_Fiyatlar
FROM Urunler
GROUP BY KategoriID;
-- MIN
-- En düşük fiyatlı ürünü bulalım
SELECT MIN(Fiyat) as max_fiyat
FROM Urunler;
-- Her kategorideki en düşük fiyatlı ürünü bulalım
SELECT KategoriID, MIN(Fiyat) AS Min_Fiyatlar
FROM Urunler
GROUP BY KategoriID;
-- GROUP BY: Verilerimizi Gruplandırmamızı sağlıyor.
--Şehir bazında Müşteri Sayılarını bulalım
SELECT Sehir, COUNT(*) as musteri_sayisi
FROM Musteriler
GROUP BY sehir;
-- HAVING : WHERE'e benzer bir ifadedir. GROUP BY ile birlikte kullanıldığında gruplar üzerinde filtreleme işlem yapar.
-- HEr kategorideki ort. fiyatı 194 TL'den yüksek olan kategorileri bulalım
SELECT KategoriID, AVG(Fiyat) AS Ort_Fiyat
FROM Urunler
GROUP BY KategoriID
HAVING AVG(Fiyat) > 194.00;
-- JOIN
-- Veritabanında ilişkili tabloları birleştirmek için kullanılır.
-- INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN
-- INNER JOIN
-- İki tabloyu ortak sütunlarına göre birleştirir ve eşleşen kayıtları döndürür.
-- Müşteriler ve Siparişler Tablolarını birleştirerek her müşterinin siparişlerini bulalım
SELECT Musteriler.MusteriID, Musteriler.Isim, Musteriler.Soyisim, Siparisler.SiparisID, Siparisler.ToplamTutar
FROM Musteriler
INNER JOIN Siparisler ON Musteriler.MusteriID = Siparisler.MusteriID;
-- ÖDEV
-- Siparis Detayları ve Ürünler tablolarını birleştirin ve her sipraişte hangi ürünlerin olduğunu seçin.
-- LEFT JOIN
-- Sol tablodaki tüm kayıtları ve sağ tablodaki eşleşen kayıtları döndürür. Eşleşmeyen sağ tablodaki kayıtları NULL olarak yazar.
-- Tüm müşterileri ve vasa siparişlerini seçelim
SELECT Musteriler.MusteriID, Musteriler.Isim, Musteriler.Soyisim, Siparisler.SiparisID, Siparisler.ToplamTutar
FROM Musteriler
LEFT JOIN Siparisler ON Musteriler.MusteriID = Siparisler.MusteriID;
-- ÖDEV
-- Tüm ürünleri ve varsa sipariş detaylarını seçelim.
-- RIGHT JOIN
-- Sağ tablodaki tüm kayıtları ve sol tablodaki eşleşen kayıtları döndürür. Eşleşmeyen sol tablodaki kayıtları NULL olarak yazar.
-- Tüm sipariş detaylarını ve varsa ürünlerini seçelim
SELECT SiparisDetaylari.SiparisDetayID, SiparisDetaylari.Miktar, Urunler.UrunID, Urunler.UrunAdi
FROM SiparisDetaylari
RIGHT JOIN Urunler ON SiparisDetaylari.UrunID = Urunler.UrunID;
-- FULL OUTER JOIN
-- Her iki tablodaki tüm kayıtları döndürür. Eşlemeyen kayıtlar için NULL değerler döndürür.
-- ÖDEV
-- Tüm müşterileri ve tüm siparişleri eşleştirin
SELECT
FROM
FULL OUTER JOIN ON
-- ÖDEV
-- Tüm ürünleri ve tüm siparişleri eşleştirin
-- CASE
-- SQL'de koşullu mantık yürütmek ve verilerimizi belirli koşullara göre değiştirmek için kullanıyoruz.
-- Müşterilerin şehirlerine göre bölgesel olarak sınıflandıralım
SELECT MusteriID, Isim, Soyisim, Sehir,
CASE Sehir
WHEN 'Ankara' THEN 'İç Anadolu'
WHEN 'İstanbul' THEN 'Marmara'
WHEN 'İzmir' THEN 'Ege'
WHEN 'Antalya' THEN 'Akdeniz'
ELSE 'Diğer'
END AS Bolge
FROM Musteriler;
-- Siparişlerin Toplam Tutarına göre bir indirim durumu hesaplayalım
SELECT SiparisID, MusteriID, toplamtutar,
CASE
WHEN toplamtutar >= 5000 THEN 'Büyük İndirim'
WHEN toplamtutar >= 3000 THEN 'Orta İndirim'
WHEN toplamtutar >= 500 THEN 'Küçük İndirim'
ELSE 'İndirim Yok'
END AS IndirimDurumu
FROM Siparisler;
-- ÖDEV
-- Sipariş Detayları ve ürünler tablosunu birleştirip ürün kategorilerine göre farklı vergilendirme oranlarını hesaplayalım
-- -> Elektronik 0.18
-- -> Aksesuar 0.08
-- -> Ofis Ekipmanı 0.10
SELECT
CASE
WHEN
ELSE
END
FROM
JOIN ON
-- Window Fonksiyonları
-- SQL'de veri analizini daha esnek ve güçlü hale getiren fonksiyonlardır.
-- ROW_NUMBER(): Bir başlar sonuna kadar durmadan gider, 1,...,n
-- Ürünlerin fiyatlarına göre sıralama yapalım
SELECT Urunler.UrunID, Urunler.UrunAdi, Urunler.Fiyat,
ROW_NUMBER() OVER(ORDER BY Urunler.Fiyat DESC) AS FiyatSirasi
FROM Urunler;
-- RANK(): Başlar eğer aynı sayıyı görürse değerini atar, sonrasında eklemeli olarak devam eder. 1,2,3,4,5,6,6,8 veya 1,2,3,3,3,5 gibi.
-- Ürünlerin fiyatlarına göre sıralama yapalım
SELECT Urunler.UrunID, Urunler.UrunAdi, Urunler.Fiyat,
RANK() OVER(ORDER BY Urunler.Fiyat DESC) AS FiyatSirasi
FROM Urunler;
-- DENSE_RANK() Perfect Just Perfect. 1,2,3,4,5,6,6,7,8,9,10,10,11 gibi
SELECT Urunler.UrunID, Urunler.UrunAdi, Urunler.Fiyat,
DENSE_RANK() OVER(ORDER BY Urunler.Fiyat DESC) AS FiyatSirasi
FROM Urunler;
-- NTILE() : Gruplara böler
SELECT Urunler.UrunID, Urunler.UrunAdi, Urunler.Fiyat,
NTILE(5) OVER(ORDER BY Urunler.Fiyat DESC) AS FiyatSirasi
FROM Urunler;
-- LAG ve LEAD tekrarını bu örneklerden bir tanesini seçip deneyiniz.
-- Her müşterinin bir önceki siparişinin tarihini ve tutarını gösterelim
-- Her müşterinin bir sonraki siparişinin tarihini ve tutarını gösterelim
-- Ayrı Örnekler
-- SUM + OVER kullanılan örnek: -- Her müşterinin kümülatif toplam sipariş tutarını hesaplayalım
-- AVG + OVER kullanılan örnek: -- Her müşterinin kümülatif ortalama sipariş tutarını hesaplayalım
-- Window Functions