-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathi08_join.sql
268 lines (219 loc) · 10.8 KB
/
i08_join.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
use sys;
/*============================== JOIN İSLEMLERİ ===============================
Set Operatorleri (Union,Union All, {oracle->Intersect,Minus}) farklı tablolardaki sutunlari
birlestirmek 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.
mySQL'de 3 Cesit Join islemi kullanilabilmektedir.
1) INNER JOIN: Tablolardaki ortak olan sonuc kumesini gosterir
2) LEFT JOIN: Ilk tabloda (Sol) olan sonuclari gosterir
3) RIGHT JOIN: Ikinci tabloda (sağ) olan tum sonuclari gosterir
full JOIN=(left join + union + right join) Tablodaki tum sonuclari gosterir
==============================================================================*/
CREATE TABLE sirketler
(
sirket_id int,
sirket_isim VARCHAR(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 int,
sirket_id int,
siparis_tarihi DATE
);
INSERT INTO siparisler VALUES(11, 101, '2020-04-17');
INSERT INTO siparisler VALUES(22, 102, '2020-04-18');
INSERT INTO siparisler VALUES(33, 103, '2020-04-19');
INSERT INTO siparisler VALUES(44, 104, '2020-04-20');
INSERT INTO siparisler VALUES(55, 105, '2020-04-21');
/*=============================== 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;
================================================================================
/* -----------------------------------------------------------------------------
ORNEK1: Iki Tabloda sirket_id’si ayni olanlarin sirket_ismi, siparis_id ve
siparis_tarihleri listeleyen bir sorgu yaziniz.
------------------------------------------------------------------------------*/
select sir.sirket_isim, sip.siparis_id,sip.siparis_tarihi,sip.sirket_id
from sirketler sir
inner join siparisler sip
on sir.sirket_id=sip.sirket_id;
-- INNER JOIN ile sadece iki tablodaki ortak olan satirlar secilir.
-- Diger bir ifadeyle iki tablodaki ortak olan sirket_id degerleri icin
-- ilgili sutunlar listenir.
-- INNER anahtar kelimesi opsiyoneldir.
/*=============================== LEFT JOIN ==================================
LEFT JOIN, 1. tablodan (sol tablo) SELECT ile ifade edilen sutunlara ait tum
satirlari getirir.
Ancak, diger tablodan sadece ON ile belirtilen kosula uyan satirlari getirir.
Syntax
-----------
SELECT sutun1,sutun2....sutunN
FROM tablo1
LEFT JOIN tablo2
ON tablo1.sutun = tablo2.sutun;
==============================================================================*/
/* -----------------------------------------------------------------------------
ORNEK2: sirketler tablosundaki tum sirketleri ve bu sirketlere ait olan
siparis_id ve siparis_tarihleri listeleyen bir sorgu yaziniz.
------------------------------------------------------------------------------*/
select sir.sirket_isim, sip.siparis_id, sip.siparis_tarihi, sir.sirket_id
from sirketler sir
left join siparisler sip
on sir.sirket_id=sip.sirket_id;
select sir.sirket_isim, sip.siparis_id, sip.siparis_tarihi, sir.sirket_id
from siparisler sip
right join sirketler sir
on sir.sirket_id=sip.sirket_id;
-- Left Join’de ilk tablodaki (fromdan sonra gelen)tum satirlar gosterilir.
-- Ilk tablodaki satirlara 2.tablodan kosula uyan ortak satirlar
-- gosterilir, ancak ortak olmayan kisimlar bos kalir
/*=============================== RIGHT JOIN ==================================
RIGHT JOIN, 2. tablodan (sag tablo) SELECT ile ifade edilen sutunlara ait tum
satirlari getirir.
Ancak, diger tablodan sadece ON ile belirtilen kosula uyan satirlari getirir.
Syntax
-----------
SELECT sutun1,sutun2....sutunN
FROM tablo1
RIGHT JOIN tablo2
ON tablo1.sutun = tablo2.sutun;
==============================================================================*/
/* -----------------------------------------------------------------------------
ORNEK3: siparisler tablosundaki tum siparis_id ve siparis_tarihleri ile
bunlara karşılık gelen sirket_isimlerini listeleyen bir sorgu yaziniz.
------------------------------------------------------------------------------*/
select sir.sirket_isim, sip.siparis_id,sip.siparis_tarihi
from sirketler as sir right join siparisler as sip
on sir.sirket_id=sip.sirket_id;
-- Right Join’de 2. tablodaki tum satirlar gosterilir.
-- 2 tablodaki satirlara 1.tablodan kosula uyan ortak satirlar gosterilir
-- ancak ortak olmayan kisimlar bos kalirir.
/*=============================== full JOIN ==================================
full JOIN: (left join + union + right join)
full JOIN, Her iki tablo icin secilen sutunlara ait olan tum satirlari
getirmek icin kullanilir.
Syntax
-----------
SELECT sutun1,sutun2....sutunN
FROM tablo1
left JOIN tablo2
ON tablo1.sutun = tablo2.sutun
union all
SELECT sutun1,sutun2....sutunN
FROM tablo1
right JOIN tablo2
ON tablo1.sutun = tablo2.sutun
==============================================================================*/
/* -----------------------------------------------------------------------------
ORNEK4: sirketler ve siparisler adındaki tablolarda yer alan sirket_isim,
siparis_id ve siparis_tarihleri listeleyen bir sorgu yaziniz.
------------------------------------------------------------------------------*/
select sir.sirket_isim, sip.siparis_id,sip.siparis_tarihi, sir.sirket_id
from sirketler sir
left join siparisler sip
on sir.sirket_id=sip.sirket_id
union
select sir.sirket_isim, sip.siparis_id,sip.siparis_tarihi,sip.sirket_id
from sirketler sir
right join siparisler sip
on sir.sirket_id=sip.sirket_id;
-- **********************************************
CREATE TABLE bolumler (
bolum_id int PRIMARY KEY,
bolum_isim VARCHAR(14),
konum VARCHAR(13)
);
INSERT INTO bolumler VALUES (10,'MUHASEBE','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 int PRIMARY KEY,
personel_isim VARCHAR(10),
meslek VARCHAR(9),
mudur_id int,
maas int,
bolum_id int
);
SELECT * FROM personel;
INSERT INTO personel VALUES (7369,'AHMET','KATIP',1111,800,20);
INSERT INTO personel VALUES (7499,'BAHATTIN','SATISE',1222,1600,30);
INSERT INTO personel VALUES (7521,'NESE','SATISE',1222,1250,30);
INSERT INTO personel VALUES (1111,'MUZAFFER','MUDUR',7839,2975,20);
INSERT INTO personel VALUES (7654,'MUHAMMET','SATISE',1222,1250,30);
INSERT INTO personel VALUES (1222,'EMINE','MUDUR',7839,2850,30);
INSERT INTO personel VALUES (1333,'HARUN','MUDUR',7839, 2450,10);
INSERT INTO personel VALUES (7788,'MESUT','ANALIST',1111,3000,20);
INSERT INTO personel VALUES (7839,'SEHER','BASKAN',NULL,5000,10);
INSERT INTO personel VALUES (7844,'DUYGU','SATISE',1222,1500,30);
INSERT INTO personel VALUES (7876,'ALI','KATIP',1111,1100,20);
INSERT INTO personel VALUES (7900,'MERVE','KATIP',1222,950,30);
INSERT INTO personel VALUES (7902,'NAZLI','ANALIST',1111,3000,20);
INSERT INTO personel VALUES (7934,'EBRU','KATIP',1333,1300,10);
INSERT INTO personel VALUES (7956,'SIBEL','MIMAR',1333,3300,60);
INSERT INTO personel VALUES (7933,'ZEKI','MUHENDIS',1333,4300,60);
/* -----------------------------------------------------------------------------
ORNEK1: SATIS ve MUHASEBE bolumlerinde calisan personelin isimlerini ve
bolumlerini, once bolum sonra isim sıralı olarak listeleyiniz
------------------------------------------------------------------------------*/
select p.personel_isim, b.bolum_isim
from bolumler b
join personel p
on p.bolum_id=b.bolum_id
where bolum_isim in('satis','muhasebe')
order by b.bolum_isim,p.personel_isim;
-- bağlama işi join lerde on keyword ü ile yapilir
/* -----------------------------------------------------------------------------
ORNEK2: SATIS,ISLETME ve DEPO bolumlerinde calisan personelin isimlerini,
bolumlerini isim sıralı olarak listeleyiniz.
NOT: calisani olmasa bile bolum ismi gosterilmelidir.
------------------------------------------------------------------------------*/
select b.bolum_isim, p.personel_isim
from bolumler b left join personel p
on p.bolum_id=b.bolum_id
where b.bolum_id in(30,40,50)
order by b.bolum_isim;
/* -----------------------------------------------------------------------------
ORNEK3: Tüm bolumlerde calisan personelin isimlerini, bolum isimlerini ve
maaslarini bolum ters ve maas sirali listeleyiniz.
NOT: calisani olmasa bile bolum ismi gosterilmelidir.
------------------------------------------------------------------------------*/
select b.bolum_isim, p.personel_isim, p.maas
from bolumler b left join personel p
on p.bolum_id=b.bolum_id
ORDER BY b.bolum_isim desc,p.maas ;
/* -----------------------------------------------------------------------------
ORNEK4: SATIS ve MUDURLUK bolumlerinde calisan personelin maaslari 2000'den
buyuk olanlarinin isim,bolum ve maas bilgilerini bolume ve isme gore
siralayarak listeleyiniz.
------------------------------------------------------------------------------*/
select b.bolum_isim, p.personel_isim,p.maas
from bolumler b join personel p
on p.bolum_id=b.bolum_id
where b.bolum_isim in('satis','mudurluk') and p.maas>2000
order by b.bolum_isim, p.personel_isim;
/* -----------------------------------------------------------------------------
ORNEK5: MUDUR'u Harun veya Emine olan personelin bolumlerini,isimlerini,
maaslarini ve ayrica MUDUR isimlerini
(emine kimin müdürüyse onun satirinda yazsin)
------------------------------------------------------------------------------*/
select b.bolum_isim, p.personel_isim, p.maas, (select personel_isim from personel
where p.mudur_id=personel_id ) mudur
from bolumler b right join personel p
on p.bolum_id=b.bolum_id
where p.mudur_id in(1222,1333);