JOIN

Kategori: SQL , 01 Ağustos 2019 , JanFranco


Elimizde USER_ tablosundan çekeceğimiz müşterilerin dataları mevcut. Ve bu tablo ADDRES tablosu ile ilişkili. İki tabloda da ID kısımları ortak. Hem USER_ tablosundan seçeceğim müşterinin bilgilerini hem de aynı müşterinin ADDRES tablosundaki adres bilgilerini çekip konsolda gösterebiliriz. Bunun için JOIN komutunu, anahtar kelimesini kullanırız.


SELECT USER_.USERNAME_, USER_.NAMESURNAME, USER_.EMAIL, USER_.TELNR1, USER_.TELNR2, ADDRES.ADDRESSTEXT
FROM ETRADE.dbo.USER_
JOIN ETRADE.dbo.ADDRES ON USER_.ID = ADDRES.USERID
WHERE USER_.ID = 1
Bu sorguyu çalıştırdığımızda, konsolda kullanıcı adını, ismini, mailini, telefon numaralarını ve 4 adet adresini aynı anda göstermiş oluruz. Sütunların başına normalde tablo isimlerini yazmayız ancak iki tabloyu birbirine bağlayıp göstermek istersek, güvenlik açısından tablo isimlerini de ekleriz. Çünkü aynı sütun iki tabloda da olabilir. Bu durumda sorgu hata verir.

JOIN kullanırken, bir müşterinin hiç adresi olmadığı halde, müşteriyi ve adresini bastırmak istiyorsak ekrana 0 satır gelir. Çünkü iki tablonun yani iki kümenin bir kesişimi yok. Ancak yine de null değer gösterecek de olsa adres kısmının ve müşterinin basılmasını istiyorsak RIGHT, LEFT ya da FULL JOIN kullanabiliriz.


SELECT USER_.ID, USER_.USERNAME_, USER_.NAMESURNAME, USER_.EMAIL, USER_.TELNR1, USER_.TELNR1, ADDRES.ADDRESSTEXT
FROM ETRADE.dbo.USER_ 
LEFT JOIN ETRADE.dbo.ADDRES ON ADDRES.USERID = USER_.ID
WHERE USER_.ID IN (100, 101, 102)
Burada 100,101 ve 102 ID'li kullanıcıları ve onların adreslerini INNER JOIN ile getirdik. 100 numaralı ID'ye sahip kullanıcının adres bilgilerini silelim. Tekrar INNER JOIN kullanarak ekrana getirirsek ID'si 100 olan kullanıcı var olmasına rağmen adresi olmadığı için ekrana basılmaz. Çünkü 100 ID'li müşterinin adresi silindi ve artık bir kesişim yok. Ama LEFT JOIN kullanarak basarsak 100 ID'li müşteri de ekrana gelirdi ve adresText kısmı null olarak ekrana yazılırdı. LEFT JOIN, öyle bir data olmasa bile sol kümeyi komple dahil et anlamına denk geliyor.

LEFT, RIGHT JOIN kullanarak sağ ve sol kümeleri dahil edebiliriz. İki kümeyi komple dahil etmek için FULL JOIN kullanırız. JOIN komutunu birden çok kez kullanabiliriz:


SELECT U.USERNAME_, U.NAMESURNAME, U.EMAIL, U.TELNR1, U.TELNR2,
	   C.CITY, T.TOWN, D.DISTRICT, A.ADDRESSTEXT	 
FROM ETRADE.dbo.USER_ AS U
JOIN ETRADE.dbo.ADDRES AS A ON A.USERID = U.ID
JOIN ETRADE.dbo.CITY AS C ON C.ID = A.CITYID
JOIN ETRADE.dbo.TOWN AS T ON T.ID = A.TOWNID
JOIN ETRADE.dbo.DISTRICT AS D ON D.ID = A.DISTRICTID
WHERE U.ID = 1
JOIN ve GROUP BY komutlarını birlikte kullanabiliriz:

SELECT U.USERNAME_, U.NAMESURNAME, U.EMAIL, U.TELNR1, U.TELNR2,
COUNT(A.ID) AS ADRESSAYISI
FROM ETRADE.dbo.USER_ AS U
JOIN ETRADE.dbo.ADDRES AS A ON A.USERID = U.ID
JOIN ETRADE.dbo.CITY AS C ON C.ID = A.CITYID
JOIN ETRADE.dbo.TOWN AS T ON T.ID = A.TOWNID
JOIN ETRADE.dbo.DISTRICT AS D ON D.ID = A.DISTRICTID
--WHERE U.ID = 1
GROUP BY U.USERNAME_, U.NAMESURNAME, U.EMAIL, U.TELNR1, U.TELNR2
ORDER BY ADRESSAYISI DESC

SELECT U.USERNAME_, U.NAMESURNAME, U.EMAIL, U.TELNR1, U.TELNR2,
COUNT(A.ID) AS ADRESSAYISI
FROM ETRADE.dbo.USER_ AS U
JOIN ETRADE.dbo.ADDRES AS A ON A.USERID = U.ID
JOIN ETRADE.dbo.CITY AS C ON C.ID = A.CITYID
JOIN ETRADE.dbo.TOWN AS T ON T.ID = A.TOWNID
JOIN ETRADE.dbo.DISTRICT AS D ON D.ID = A.DISTRICTID
--WHERE U.ID = 1
GROUP BY U.USERNAME_, U.NAMESURNAME, U.EMAIL, U.TELNR1, U.TELNR2
HAVING COUNT(A.ID) IN (1,2)

SELECT C.CITY, COUNT(U.ID)
FROM ETRADE.dbo.USER_ AS U
JOIN ETRADE.dbo.ADDRES AS A ON A.USERID = U.ID
JOIN ETRADE.dbo.CITY AS C ON C.ID = A.CITYID
JOIN ETRADE.dbo.TOWN AS T ON T.ID = A.TOWNID
JOIN ETRADE.dbo.DISTRICT AS D ON D.ID = A.DISTRICTID
GROUP BY C.CITY

SELECT U.USERNAME_, U.NAMESURNAME, U.EMAIL, U.TELNR1, U.TELNR2,
COUNT(A.ID) AS ADRESSAYISI, COUNT(DISTINCT C.CITY) AS SEHIRSAYISI
FROM ETRADE.dbo.USER_ AS U
JOIN ETRADE.dbo.ADDRES AS A ON A.USERID = U.ID
JOIN ETRADE.dbo.CITY AS C ON C.ID = A.CITYID
JOIN ETRADE.dbo.TOWN AS T ON T.ID = A.TOWNID
JOIN ETRADE.dbo.DISTRICT AS D ON D.ID = A.DISTRICTID
--WHERE U.ID = 1
GROUP BY U.USERNAME_, U.NAMESURNAME, U.EMAIL, U.TELNR1, U.TELNR2
HAVING COUNT(A.ID)<>COUNT(DISTINCT C.CITY)
ORDER BY ADRESSAYISI DESC


Sonraki Yazı: Subquery
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın