-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday8_join.sql
More file actions
232 lines (187 loc) · 9.49 KB
/
day8_join.sql
File metadata and controls
232 lines (187 loc) · 9.49 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
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
/*============================== JOIN İSLEMLERİ ===============================
foreıgn key id si ortakları yanyana yazıyordu bu bikaç tablodan istenilen
sütunları alır birleştirir. set istenilen sütunları tek sütunda birleştirir
Set Operatorleri (Union,Intersect,Minus) farklı tablolardaki sutunlari
birlestirmek için de kullanilir.
Join islemleri ise farklı Tablolari birlestirmek icin kullanilir. Diger
bir ifade ile farkli tablolardaki secilen sutunlar ile yeni bir tablo
olusturmak icin kullanilabilir.
JOIN islemleri Iliskisel Veritabanlari icin cok onemli bir ozelliktir. Çunku
Foreign Key'ler ile iliskili olan tablolardan istenilen sutunlari cekmek
icin JOIN islemleri kullanilabilir.
ORACLE SQL'de 4 Cesit Join islemi kullanilabilmektedir.
1) FULL JOIN: Tablodaki tum sonuclari gosterir
2) INNER JOIN: Tablolardaki ortak olan sonuc kumesini gosterir
3) LEFT JOIN: Ilk tabloda (Sol) olup digerinde olmayan sonuclari gosterir
4) RIGHT JOIN: Sadece Ikinci tabloda olan tum sonuclari gosterir
==============================================================================*/
CREATE TABLE sirketler
(
sirket_id NUMBER(9),
sirket_isim VARCHAR2(20)
);
INSERT INTO sirketler VALUES(100, 'Toyota');
INSERT INTO sirketler VALUES(101, 'Honda');
INSERT INTO sirketler VALUES(102, 'Ford');
INSERT INTO sirketler VALUES(103, 'Hyundai');
CREATE TABLE siparisler
(
siparis_id NUMBER(9),
sirket_id NUMBER(9),
siparis_tarihi DATE
);
INSERT INTO siparisler VALUES(11, 101, '17-04-2020');
INSERT INTO siparisler VALUES(22, 102, '18-04-2020');
INSERT INTO siparisler VALUES(33, 103, '19-04-2020');
INSERT INTO siparisler VALUES(44, 104, '20-04-2020');
INSERT INTO siparisler VALUES(55, 105, '21-04-2020');
SELECT * FROM siparisler;
SELECT * FROM sirketler;
/*=============================== FULL JOIN ==================================
FULL JOIN, Her iki tablo icin secilen sutunlara ait olan tum satirlari
getirmek icin kullanilir. ortaklar aynı satırda yazılır, extra fazla satır varsa o da yazılır.
Syntax
-----------
SELECT sutun1,sutun2....sutunN
FROM tablo1
FULL JOIN tablo2
ON tablo1.sutun = tablo2.sutun;
?
==============================================================================*/
/* -----------------------------------------------------------------------------
ORNEK1: sirketler ve siparisler adındaki tablolarda yer alan sirket_isim,
siparis_id ve siparis_tarihleri listeleyen bir sorgu yaziniz.
------------------------------------------------------------------------------*/
SELECT sirket_isim, siparis_id, siparis_tarihi,siparisler.sirket_id
FROM sirketler
FULL JOIN siparisler
ON siparisler.sirket_id= sirketler.sirket_id;
/* =============================== INNER JOIN ==================================
Iki tablonun kesisim kumesi ile yeni bir tablo olusturmak icin kullanilir.
Syntax
-----------
SELECT sutun1,sutun2....sutunN
FROM tablo1
INNER JOIN tablo2
ON tablo1.sutun = tablo2.sutun;
?
================================================================================*/
/* -----------------------------------------------------------------------------
ORNEK2: Iki Tabloda sirket_id’si ayni olanlarin (ortak) sirket_ismi, siparis_id ve
siparis_tarihleri listeleyen bir sorgu yaziniz. null olanlar çıkmıcak çünkü NULL
ortak değil(bir tabloda null iken diğerinde id null yok, 100, 101 vs var)
------------------------------------------------------------------------------*/
SELECT sirket_isim,siparis_id,siparis_tarihi,siparisler.sirket_id
FROM sirketler
INNER JOIN siparisler
ON sirketler.sirket_id = siparisler.sirket_id;
-- INNER JOIN ile sadece iki tablodaki ortak olan satirlar secilir.
-- Diger ifadeyle iki tablodaki ortak olan sirket_id degerleri icin ilgili sutunlar listenir.
/* =============================== LEFT JOIN ==================================
LEFT JOIN, 1. tablodan (sol tablo) SELECT ile ifade edilen sutunlara ait tum
satirlari getirir.
Ancak, diger tablodan sadece ON ile belirtilen 2.tablodan kosula uyan satirlari getirir.
-- ancak ortak olmayan kisimlar bos kalir. 2. tablodan 104,105 yok mesela.
Syntax
-----------
SELECT sutun1,sutun2....sutunN
FROM tablo1
LEFT JOIN tablo2
ON tablo1.sutun = tablo2.sutun;
burada from ve inner join full joinde sirlaama onemli degildi. burada solda kalacak olan froma join olacak saga yazilir.
?
==============================================================================*/
/* -----------------------------------------------------------------------------
ORNEK3: sirketler tablosundaki tum sirketleri ve bu sirketlere ait olan
siparis_id ve siparis_tarihleri listeleyen bir sorgu yaziniz.
------------------------------------------------------------------------------*/
select sirket_isim,siparis_id,siparis_tarihi,siparisler.sirket_id, sirketler.sirket_id
from sirketler
left JOIN siparisler
ON siparisler.sirket_id= sirketler.sirket_id;
/* ============================== RIGHT JOIN ==================================
RIGHT JOIN, 2. tablodan (sag tablo) SELECT ile ifade edilen sutunlara ait tum
satirlari getirir.
diger tablodan sadece ON ile belirtilen 1. tablodan kosula uyan (ortak) satirlari getirir.
ancak ortak olmayan kisimlar bos kalir.1. tablodaki Toyota yazılmaz, ortak olmadığı için
Syntax
-----------
SELECT sutun1,sutun2....sutunN
FROM tablo1
RIGHT JOIN tablo2
ON tablo1.sutun = tablo2.sutun;
?
==============================================================================*/
/* -----------------------------------------------------------------------------
ORNEK4: siparisler tablosundaki tum siparis_id ve siparis_tarihleri ile
bunlara karşılık gelen sirket_isimlerini listeleyen bir sorgu yaziniz.
------------------------------------------------------------------------------*/
select siparis_id, siparis_tarihi, sirket_isim, s.sirket_id,sp.sirket_id
from sirketler s
RIGHT JOIN siparisler sp
ON sp.sirket_id=s.sirket_id;
----ornekler
CREATE TABLE bolumler (
bolum_id NUMBER(2) ,
bolum_isim VARCHAR2(14),
konum VARCHAR2(13)
);
INSERT INTO bolumler VALUES (10,'MUHASABE','IST');
INSERT INTO bolumler VALUES (20,'MUDURLUK','ANKARA');
INSERT INTO bolumler VALUES (30,'SATIS','IZMIR');
INSERT INTO bolumler VALUES (40,'ISLETME','BURSA');
INSERT INTO bolumler VALUES (50,'DEPO', 'YOZGAT');
CREATE TABLE personel (
personel_id NUMBER(4) ,
personel_isim VARCHAR2(10),
meslek VARCHAR2(9),
mudur_id NUMBER(4),
ise_baslama DATE,
maas NUMBER(7,2),
bolum_id NUMBER(2)
);
SELECT * FROM bolumler;
INSERT INTO personel VALUES (7369,'AHMET','KATIP',7902,'17.12.1980',800,20);
INSERT INTO personel VALUES (7499,'BAHATTIN','SATIS',7698,'20.02.1981',1600,30);
INSERT INTO personel VALUES (7521,'NESE','SATIS',7698,'22.02.1981',1250,30);
INSERT INTO personel VALUES (7566,'MUZAFFER','MUDUR',7839,'02.04.1981',2975,20);
INSERT INTO personel VALUES (7654,'MUHAMMET','SATIS',7698,'28.09.1981',1250,30);
INSERT INTO personel VALUES (7698,'EMINE','MUDUR',7839,'01.05.1981',2850,30);
INSERT INTO personel VALUES (7782,'HARUN','MUDUR',7839,'09.06.1981', 2450,10);
INSERT INTO personel VALUES (7788,'MESUT','ANALIST',7566,'13.07.87',3000,20);
INSERT INTO personel VALUES (7839,'SEHER','BASKAN',NULL,'17.11.1981',5000,10);
INSERT INTO personel VALUES (7844,'DUYGU','SATIS',7698,'08.09.1981',1500,30);
INSERT INTO personel VALUES (7876,'ALI','KATIP',7788,'13.07.1987',1100,20);
INSERT INTO personel VALUES (7900,'MERVE','KATIP',7698,'03.12.1981',950,30);
INSERT INTO personel VALUES (7902,'NAZLI','ANALIST',7566,'03.12.1981',3000,20);
INSERT INTO personel VALUES (7934,'EBRU','KATIP',7782,'23.01.1982',1300,10);
INSERT INTO personel VALUES (7956,'SIBEL','MIMAR',7782,'29.01.1991',3300,60);
INSERT INTO personel VALUES (7933,'ZEKI','MUHENDIS',7782,'26.01.1987',4300,60);
SELECT * FROM personel;
commit; --- commit komutunu yazip RUN yapinca javaya aktariliyor.
-- ORNEK1: SATIS ve MUHASEBE bolumlerinde calisan personelin isimlerini ve
-- bolumlerini, once bolum sonra isim sıralı olarak listeleyiniz
-----------------------------------------------------------------
select personel_isim, bolum_isim
FROM personel p
FULL JOIN bolumler b
ON b.bolum_id =p.bolum_id
WHERE bolum_isim IN('SATIS','MUHASABE')
ORDER BY bolum_isim, personel_isim;
-- ORNEK2: SATIS,ISLETME ve DEPO bolumlerinde calisan personelin isimlerini,
-- bolumlerini ve ise_baslama tarihlerini bolum_isim sıralı olarak listeleyiniz.
-- NOT: calisani olmasa bile bolum ismi gosterilmelidir
select bolum_isim,personel_isim,ise_baslama
from bolumler b
left JOIN personel p
on b.bolum_ıd=p.bolum_ıd
where bolum_isim IN('SATIS','ISLETME','DEPO')
order by bolum_isim;
/*ORNEK3: Tüm bolumlerde calisan personelin isimlerini, bolum isimlerini ve
maaslarini bolum_id ve maas ters sirali listeleyiniz.
NOT: calisani olmasa bile bolum ismi gosterilmelidir.*/
select bolum_isim,personel_isim, concat('$' , maas),b.bolum_ıd
from bolumler b
left JOIN personel p
on p.bolum_id = b.bolum_id
order by b.bolum_ıd ASC , maas desc;