JO I N Bu d ərsimizdə Əlaqəli Verilənlər bazasının “ Relational Database ” əsas mövzularından olan Join-lər haqqında danışacağıq . SQL Server-də neçə JOIN növləri var, bu növlərin birbirindən fərqi nədir və s suallara cavab tapacağıq. JOIN ifadəsi hətda əvvəlki dərs nümunələrində qarşımıza çıxmışdı və SELECT, INSERT SELECT , SELECT INTO , UPDATE və DELETE komandaları ilə yanaşı FROM ifadəsi ilə birlikdə də istifadə olunmuşdu. JOIN-l ərin məntiqi iki və ya daha çox cədvəlləri birləşdirərək eyni anda sorğulamaq üçündür. İndi isə JOİN-lər ilə işləmək üçün cədvəllərimizi yaradaq və JOİN-ləri tətbiq edək.
--Tələbələr olan cədvəlimiz CREATE TABLE Student( StudentId int, AdSoyad varchar(100) ) --Müəllimlər olan cədvəlimiz CREATE TABLE Teacher( TeacherId int, AdSoyad varchar(100) ) --Tələbə Müəllim cədvəli CREATE TABLE StudentAndTeacher( StudentTeacherId int, StudentId int, TeacherId int )
-- Student cədvəlinə 4 nəfər tələbə əlavə edirik INSERT Student VALUES(1,'Student_1') INSERT Student VALUES(2,'Student_2') INSERT Student VALUES(3,'Student_3') INSERT Student VALUES(4,'Student_4') --Teacher cədvəlinə 4 nəfər müəllim əlavə edirik INSERT Teacher VALUES(1,'Teacher_1') INSERT Teacher VALUES(2,'Teacher_2') INSERT Teacher VALUES(3,'Teacher_3') INSERT Teacher VALUES(4,'Teacher_4') --Müəllimi olan tələbələr üçün, uyğun sətirlər daxil edirik. --1 nömrəli tələbənin müəllimi, 2 nömrəli müəllimdir. INSERT INTO StudentAndTeacher(StudentTeacherId,StudentId,TeacherId ) VALUES(1,1,2) --3 nömrəli tələbənin müəllimi, 2 nömrəli müəllimdir. INSERT INTO StudentAndTeacher(StudentTeacherId,StudentId,TeacherId ) VALUES(2,3,2) --4 nömrəli tələbənin müəllimi, 1 nömrəli müəllimdir. INSERT INTO StudentAndTeacher(StudentTeacherId,StudentId,TeacherId ) VALUES(3,4,1)
JO I N Types SQL Serverdə JO IN-l ər birləşdirmə formalarına görə bir neçə tipə bölünür. Inner Joins Outer Joins Left Join Right Join Full Join Cross Joins Self-Joins
Inner Joins SQL Serverdə iki c ədvəlin birləşməsi zamanı, birləşməni müəyyən edən sütun və ya sütunların dəyərlərinin hər iki cədvəldən bir-birinə bərabər olanların sorğulanmasına INNER JO IN deyilir. Yəni, birləşdirmədə təyin olunmuş sütun və ya sütunlara görə hər iki cədvəlin ortaq sətirləri sorğulanır.
Inner Join M əsələn iki cədvəli birləşdirək. Tapaq ki, hansı tələbələrin müəllimləri var. Bunu etmək üçün Student və StudentAndTeacher cədvəlini birləşdirəcəyik. Birləşdirəcəyimiz sütunların əvvəlində ON ifadəsini yazmaq lazımdır. Sorğu yazarkən I NNER JO I N əvəzində sadəcə JO IN ifad əsini də yaza bilərsiniz. SELECT S.* FROM AdventureWorks2014.dbo.Student AS S INNER JOIN AdventureWorks2014.dbo.StudentAndTeacher AS ST ON S.StudentId=ST.StudentID Burada S.* yazdığımız zaman, Student cədvəlində bütün sütunları sorğulamış oluruq.
Left Outer Join Bu join n övüdə eyni ilə İNNER JOİN-lər kimi istifadə olunur. Fərqi odurki, Adı sol tərəfdə yazılmış cədvəli əsas götürür və onun bütün sətirlərini qaytarır. Sağ tərəfdəki cədvəli isə uyğun sütunlara görə soldakına birləşdirir. Sorğu yazarkən LEFT OUTER J O I N əvəzində sadəcə LEFT JO IN ifad əsini də yaza bilərsiniz. SELECT S.StudentId as [StudentNum], S.AdSoyad as [StudentName], ST.TeacherID as [TeacherNum] FROM AdventureWorks2014.dbo.Student AS S LEFT OUTER JOIN AdventureWorks2014.dbo.StudentAndTeacher AS ST ON S.StudentId=ST.StudentID
Bu join n övüdə eyni ilə Left Join kimi istifadə olunur amma onun əksini icra edir. Adı sağ tərəfdə yazılmış cədvəli əsas götürür və onun bütün sətirlərini qaytarır. Sol tərəfdəki cədvəli isə uyğun sütunlara görə sağdakına birləşdirir. Sorğu yazarkən R IGHT OUTER J O I N əvəzində sadəcə RIGHT JO IN ifad əsini də yaza bilərsiniz. SELECT S.StudentId as [StudentNum], S.AdSoyad as [StudentName], ST.TeacherID as [TeacherNum] FROM AdventureWorks2014.dbo.Student AS S RIGHT OUTER JOIN AdventureWorks2014.dbo.StudentAndTeacher AS ST ON S.StudentId=ST.StudentID Right Outer Join
Bu join n övüdə eyni ilə Left Join v ə Right Join kimi istifadə olunur amma onlardan fərqli olaraq Full Join hər iki cədvəldə təyin edilmiş sütunlara uyğun olan və ya olmayan bütün sətirləri qaytarır. Sol tərəfdə yazılmış cədvəlin bütün sətirlərini götür, daha sonra uyğun sütunlarla sağdakı cədvələ birləşdirir və daha sonra da sağdakı cədvəldəki uyğun olmayan sətirləridə götürüb join edir. Sorğu yazarkən FULL OUTER J O I N əvəzində sadəcə FULL JO IN ifad əsini də yaza bilərsiniz. SELECT S.*, ST.* FROM AdventureWorks2014.dbo.Student AS S FULL OUTER JOIN AdventureWorks2014.dbo.StudentAndTeacher AS ST ON S.StudentId=ST.StudentID Full Outer Join
Bu J oin n övünə Azərbaycanca desək, Çarpaz Birləşdirmə deyəcəyik. Burada cədvəllər arasında uyğun sütun təyin edilmir. Birinci cədvəlin bir sətirinə ikinci cədvəlin bütün sətirləri birləşdirilir. Və birləşmə bucür davam edir. İki cədvəl birləşdiyi zaman onda yaranan sətir sayı, birinci cədvəlin sətir sayı ilə ona birləşən ikinci cədvəlin sətir saylarının hasilinə bərabərdir . A şağıdakı kimi bənzətmə etmək olar. TableJoin_AB ( rowcount ) = T able _ A(ro wcount ) * T able _B (ro wcount ) SELECT S.*, ST.* FROM AdventureWorks2014.dbo.Student AS S CROSS JOIN AdventureWorks2014.dbo.StudentAndTeacher AS ST Cross Joi n
JOIN əməliyyatlarını sadəcə SELECT ifadəsi ilə yox, DELETE və UPDATE ilə birlikdə də istifadə edə bilərsiniz. Bu sizin işlərinizdə sizə çox rahat imkanlar verəcəkdir. Misal olaraq, hərhansısa bir müəllimi olmayan tələbələri silmək istədiyimizdə istifadə edə bilərik. Əvvəlcə bizə müəllimi olmayan tələbələri gətirəcək sorğunu hazırlayaq. SELECT * FROM dbo.Student S LEFT JOIN dbo.StudentAndTeacher ST ON S.StudentId=ST.StudentId WHERE ST.StudentId IS NULL İndi isə bu sorğudan qayıdan nəticəni DELETE komandası ilə silək. DELETE S FROM dbo.Student S LEFT JOIN dbo.StudentAndTeacher ST ON S.StudentId=ST.StudentId WHERE ST.StudentId IS NULL Joi n s with DELETE Statement
Self Join cədvəli özü özünə birləşdirməyə deyirlər. Biz Self Join-dən istifadə edərək, eyni m əhsullardan hansıların fərqli qiymətlərə satıldığını tapacağıq. SELECT DISTINCT s1.ProductID,s1.UnitPrice,s 2 .UnitPrice FROM [AdventureWorks2014].[Sales].[ SalesOrderDetail ] s1 INNER JOIN [AdventureWorks2014].[Sales].[ SalesOrderDetail ] s2 ON s1.ProductID = s2.ProductID AND s1.UnitPrice <> s2.UnitPrice İki eyni cədvəli birləşdirən zaman onların Alias adlarını fərqli yazmaq lazımdır. Sütunları isə cədvəllərin Alias adları ilə ayırmaq rahat olacaqdır. Self Join
Bu komanda Oracle-da olan M INUS komandası ilə eynidir. Yəni birinci sorğudan qayıdan nəticələrdən , ikinci sorğudan qayıdan nəticələri çıxır və fərqi qaytarır. Sorğular arasından istifadə olunur. Sorğulardan qayıdan nəticələrdəki sütun sayları hər iki sorğuda da bərabər olamalıdır. Aşağıdakı nümunədə müəllimi olmayan tələbələrin Student Id –lərini tapırıq. SELECT StudentId FROM dbo.Student EXCEPT SELECT StudentId FROM dbo.StudentAndTeacher ; Bunu biz rahatlıqla etdik amma bunun bir pis cəhəti varki, biz burada aşağı sorğu ilə yuxarı sorğu arasında bir əlaqəlilik qura bilmirik. Eyni ilə UN ION ifad əsində olduğu kimi EXCEPT
Bu komanda birinci sorğudan qayıdan nəticələr il ə ikinci sorğudan qayıdan nəticələrin kəsişməsini tapmaq üçün istifadə olunur. Əgər Student cədvəlində olan Student Id -lər StudentAndTeacher c ədvəlində də varsa onda onlar seçilmiş olurlar. Aşağıdakı nümunədə müəllimi olan tələbələrin Student Id –lərini tapırıq . SELECT StudentId FROM dbo.Student INTERSECT SELECT StudentId FROM dbo.StudentAndTeacher ; INTERSECT