-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday5_existOrderFetch.sql
More file actions
191 lines (146 loc) · 8.01 KB
/
day5_existOrderFetch.sql
File metadata and controls
191 lines (146 loc) · 8.01 KB
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
CREATE TABLE mart_satislar
(
urun_id number(10),
musteri_isim varchar2(50),
urun_isim varchar2(50)
);
CREATE TABLE nisan_satislar
(
urun_id number(10),
musteri_isim varchar2(50),
urun_isim varchar2(50)
);
INSERT INTO mart_satislar VALUES (10, 'Mark', 'Honda');
INSERT INTO mart_satislar VALUES (10, 'Mark', 'Honda');
INSERT INTO mart_satislar VALUES (20, 'John', 'Toyota');
INSERT INTO mart_satislar VALUES (30, 'Amy', 'Ford');
INSERT INTO mart_satislar VALUES (20, 'Mark', 'Toyota');
INSERT INTO mart_satislar VALUES (10, 'Adem', 'Honda');
INSERT INTO mart_satislar VALUES (40, 'John', 'Hyundai');
INSERT INTO mart_satislar VALUES (20, 'Eddie', 'Toyota');
INSERT INTO nisan_satislar VALUES (10, 'Hasan', 'Honda');
INSERT INTO nisan_satislar VALUES (10, 'Kemal', 'Honda');
INSERT INTO nisan_satislar VALUES (20, 'Ayse', 'Toyota');
INSERT INTO nisan_satislar VALUES (50, 'Yasar', 'Volvo');
INSERT INTO nisan_satislar VALUES (20, 'Mine', 'Toyota');
select * FROM MART_SATISLAR ms ;
SELECT * FROM NISAN_SATISLAR ns ;
--ORNEK1: MART VE NİSAN aylarında aynı URUN_ID ile satılan ürünlerin
--URUN_ID’lerini listeleyen ve aynı zamanda bu ürünleri MART ayında alan
--MUSTERI_ISIM 'lerini listeleyen bir sorgu yazınız.
SELECT urun_id, musteri_isim FROM MART_SATISLAR ms
WHERE EXISTS (SELECT URUN_ID FROM NISAN_SATISLAR ns WHERE ns.URUN_ID=ms.URUN_ID);
-- SELECT urun_id, musteri_isim FROM MART_SATISLAR ms WHERE urun_id IN (SELECT URUN_ID FROM NISAN_SATISLAR ns WHERE MART_SATISLAR.URUN_ID=nisan_satislar.urun_id); --IN daha yavas
--ORNEK2: Her iki ayda da satılan ürünlerin URUN_ISIM'lerini ve bu ürünleri
--NİSAN ayında satın alan MUSTERI_ISIM'lerini listeleyen bir sorgu yazınız.
SELECT urun_isim, musteri_isim FROM NISAN_SATISLAR ns
WHERE EXISTS (SELECT URUN_ISIM FROM MART_SATISLAR ms WHERE ms.URUN_ISIM =ns.URUN_ISIM);
--ORNEK3: Her iki ayda da ortak olarak satılmayan ürünlerin URUN_ISIM'lerini
--ve bu ürünleri NİSAN ayında satın alan MUSTERI_ISIM'lerini listeleyiniz.
SELECT urun_isim, musteri_isim FROM NISAN_SATISLAR ns
WHERE NOT EXISTS (SELECT URUN_ISIM FROM MART_SATISLAR ms WHERE ms.URUN_ISIM=ns.URUN_ISIM);
/*===================== IS NULL, IS NOT NULL, COALESCE(kulesk=birleşmek) ========================
IS NULL, ve IS NOT NULL BOOLEAN operatörleridir. Bir ifadenin NULL olup
olmadığını kontrol ederler.
==============================================================================*/
CREATE TABLE insanlar
(
ssn CHAR(9),
isim VARCHAR2(50),
adres VARCHAR2(50)
);
INSERT INTO insanlar VALUES('123456789', 'Ali Can', 'Istanbul');
INSERT INTO insanlar VALUES('234567890', 'Veli Cem', 'Ankara');
INSERT INTO insanlar VALUES('345678901', 'Mine Bulut', 'Izmir');
INSERT INTO insanlar (ssn, adres) VALUES('456789012', 'Bursa');
INSERT INTO insanlar (ssn, adres) VALUES('567890123', 'Denizli');
INSERT INTO insanlar (adres) VALUES('Sakarya');
INSERT INTO insanlar (ssn) VALUES('999111222');
SELECT * FROM insanlar;
--Ismi null olanlari sorgula
SELECT * FROM insanlar WHERE ISIM IS NULL;
--Ismi null olmayanlari sorgula
SELECT * FROM insanlar WHERE ISIM IS NOT NULL;
--Ismi null olan kisilerin ismine no-name atayiniz
UPDATE INSANLAR SET isim='NO NAME' WHERE isim IS NULL;
UPDATE INSANLAR SET isim=null WHERE isim='NO NAME'; --Alttaki soruyu yapabilmek icin noname'i tekrar null'a cevirdim
-------------------------------------------------------------------------------------------------
/* COALESCE (birleşmek) ise bir fonksiyondur ve içerisindeki parameterelerden NULL olmayan
ilk ifadeyi döndürür. Eğer aldığı tüm ifadeler NULL ise NULL döndürürür.
*** select COALESCE (sütun1,sütun2,...) from tabloAdı;
Birden fazla null koşuluna göre değer atamak istiyorsak COALESCE deyimini kullanabiliriz.
COALESCE aslında case mantığında çalışır ve birden fazla kolon arasında kontrol sağlayabilirsiniz.
Bir koşul gerçekleşmez ise diğerine bakar, oda gerçekleşmez ise bir sonraki.
Deyim bitene kadar
-- CASE
WHEN (expression1 IS NOT NULL) THEN expression1
WHEN (expression2 IS NOT NULL) THEN expression2
...
ELSE expressionN
END --gibi*/
SELECT COALESCE (isim,ssn,adres) FROM INSANLAR i ; --siraya gore yazdirir. Isim NULL ise ssn'i yazdirir. O da NULL ise adres'i yazdirir.
--Ornek tablodaki null verileri guzel birer kelime ile degistirin.
UPDATE INSANLAR SET ISIM=COALESCE (ISIM,'Henuz isim girilmedi'), ADRES=COALESCE (ADRES, 'henuz adres belirtilmedi'), SSN = COALESCE (SSN,'no SSN');
SELECT * FROM insanlar;
/*================================ ORDER BY ===================================
ORDER BY cümleciği bir SORGU deyimi içerisinde belli bir SUTUN’a göre
SIRALAMA yapmak için kullanılır.
Syntax
-------
ORDER BY sutun_adi ASC -- ARTAN -- genelde asc yazmaya gerek yoktur. zaten order by yazildiginda artan ascending siralama yapar.
ORDER BY sutun_adi DESC -- AZALAN
=========================================*/
CREATE TABLE kisiler
(
ssn CHAR(9) PRIMARY KEY,
isim VARCHAR2(50),
soyisim VARCHAR2(50),
maas NUMBER,
adres VARCHAR2(50)
);
INSERT INTO kisiler VALUES(123456789, 'Ali','Can', 3000,'Istanbul');
INSERT INTO kisiler VALUES(234567890, 'Veli','Cem', 2890,'Ankara');
INSERT INTO kisiler VALUES(345678901, 'Mine','Bulut',4200,'Ankara');
INSERT INTO kisiler VALUES(256789012, 'Mahmut','Bulut',3150,'Istanbul');
INSERT INTO kisiler VALUES (344678901, 'Mine','Yasa', 5000,'Ankara');
INSERT INTO kisiler VALUES (345458901, 'Veli','Yilmaz',7000,'Istanbul');
SELECT * FROM kisiler;
--ORNEK1: kisiler tablosunu adres'e göre sıralayarak sorgulayınız.
SELECT * FROM kisiler ORDER BY adres;
--Ornek2: kisiler tablosunda maas'a gore ters siralayarak sorgulayiniz
SELECT * FROM kisiler ORDER BY maas DESC;
--Ornek3: ismi Mine olanları, SSN'e göre AZALAN(DESC) sırada sorgulayınız.
SELECT * FROM kisiler WHERE isim='Mine' ORDER BY ssn DESC ;
--ORNEK5: soyismi 'i Bulut olanları isim sıralı olarak sorgulayınız.
SELECT * FROM kisiler WHERE soyisim='Bulut' ORDER BY 2; --isim yerine tablodaki sirasi olan 2'yi de kullabiliriz. (Orn: soyisim => 3)
/*====================== FETCH NEXT, OFFSET (12C VE ÜSTÜ oracle larda çalışır, daha altsanız çalışmaz) ======================
FETCH cümleciği ile listelenecek kayıtları sınırlandırabiliriz. İstersek
satır sayısına göre istersek de toplam satır sayısının belli bir yüzdesine
göre sınırlandırma koymak mümkündür. (şu kadar satırı getir)
Syntax
---------
FETCH NEXT satir_sayisi ROWS ONLY;
FETCH NEXT satir_yuzdesi PERCENT ROWS ONLY;
OFFSET Cümleciği ile de listenecek olan satırlardan sırasıyla istediğimiz
kadarını atlayabiliriz.
Syntax
----------
OFFSET satır_sayisi ROWS;
==============================================================================*/
--ORNEK1: MAAŞ'ı en yüksek 3 kişinin bilgilerini listeleyen sorguyu yazınız.
-- SELECT * FROM kisiler ORDER BY maas DESC FETCH NEXT 3 ROWS ONLY; (bu yeni versiyonlarda calisiyor.)
SELECT * FROM (SELECT * FROM kisiler
ORDER BY maas DESC)--(1) kişilerde maasa göre ters sırala
WHERE ROWNUM < 4;
-- ORNEK2: MAAs'i en DÜŞÜK 2 kişinin bilgilerini listeleyen sorguyu yazınız.
--SELECT * FROM kisiler Order By maas FETCH NEXT 2 ROWS ONLY; (bu yeni versiyonlarda calisiyor.)
select * from (SELECT * from kisiler order by maas) where ROWNUM<3;
--ORNEK3: MAAŞ'a göre sıralamada 4. 5. ve 6. kişilerin bilgilerini listeleyen sorguyu yazınız.
--SELECT * FROM kisiler ORDER BY maas DESC OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY; (bu yeni versiyonlarda calisiyor.)
SELECT * FROM(SELECT * FROM(SELECT *FROM kisiler ORDER BY maas DESC)
WHERE ROWNUM <=6)
WHERE ROWNUM <=3; -- eski versiyon cozumu
-- DIGER COZUM
SELECT * FROM (SELECT * FROM kisiler WHERE ROWNUM <=6 ORDER BY maas DESC) WHERE ROWNUM <=3;
--- UYARI ---
-- yeni verisyonlarda row ve fetch komutları eklenmis eski versiyonlarda yok.