PHP դասեր - դաս 3.6 - Աշխատանք MySQL տվյալների բազայի հետ։ JOIN օպերատորի տեսակները։
MySQL-ում ընտրությունը JOIN-ի օգնությամբ կարող է կատարվել տարբեր եղանակներով։ Մենք կփորձենք դիտարկել այս հարցումների բոլոր տեսակները։ Ահա JOIN-ի մասնակցությամբ հարցումների ցանկը․
- INNER JOIN
- LEFT JOIN
- LEFT JOIN առանց խաչաձևումների աջ աղյուսակի հետ
- RIGHT JOIN
- RIGHT JOIN առանց խաչաձևումների ձախ աղյուսակի հետ
- FULL OUTER
- FULL OUTER, երբ ձախ կամ աջ աղյուսակն է դատարկ
Իսկ ահա նկարազարդում այս JOIN-ների տեսակների համար․
Ես կցել եմ join.php ֆայլը մեր կայքի փաթեթին, որտեղ կցուցադրեմ բոլոր գրառումները տարբեր JOIN օպերատորների օգնությամբ։
INNER JOIN
Սկսենք INNER JOIN օպերատորից, քանի որ այն օգտագործվում է լռելյայն, եթե պարզապես գրում եք JOIN։ Այս օպերատորը ընտրում է բոլոր գրառումները երկու աղյուսակներից, որտեղ կատարվում է ON օպերատորից հետո նշված պայմանը։ Մեզ մոտ կան երկու աղյուսակ՝ Files և Messages․
Աղյուսակ Messages
mid | bodytext | fid |
1 | Test | NULL |
2 | Hi | 2 |
3 | Hello | NULL |
ԱղյուսակFiles:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
JOIN-ի միջոցով հարցումը կլինի հետևյալը.
SELECT * FROM Messages INNER JOIN Files ON Messages.fid=Files.fid
Արդյունքում կցուցադրվեն հետևյալ գրառումները
mid | bodytext | fid | path |
2 | Hi | 2 | /files/2.png |
Այսինքն այնտեղ, որտեղ fid-ը համընկնում է, mysql-ը դուրս է բերում այդ տողերը։
LEFT JOIN
LEFT JOIN-ի դեպքում դուրս ենք բերում բոլոր այն գրառումները, որոնք կան ձախ կողմի աղյուսակում (մեզ մոտ Messages), այդ թվում նաև այն գրառումները, որոնց fid արժեքը առկա է Files աղյուսակում։
Messages աղյուսակ՝
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Files աղյուսակ՝
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
LEFT JOIN հարցումը կլինի հետևյալը՝
SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid
Արդյունքում կստանանք հետևյալ տվյալները՝
mid | bodytext | fid | path |
1 | Test | 2 | /files/2.png |
2 | Hi | NULL | NULL |
3 | Hello | 3 | /files/3.png |
LEFT JOIN-ը պետք կգա այն ժամանակ, երբ դուրս ենք բերում բոլոր հաղորդագրությունները, իսկ կցված ֆայլը կա, թե ոչ՝ ստուգում ենք PHP-ով։
LEFT JOIN առանց համընկնողների աջ աղյուսակում
LEFT JOIN-ը դուրս է բերում ձախ աղյուսակի բոլոր գրառումները, բացի այն տողերից, որոնց fid-ն համընկնում է աջ աղյուսակի հետ։
Messages աղյուսակ՝
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Files աղյուսակ՝
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
LEFT JOIN առանց համընկնողների հարցումը կլինի՝
SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid WHERE Files.fid IS NULL
Արդյունքում կստանանք հետևյալ ընտրությունը՝
mid | bodytext | fid | path |
2 | Hi | NULL | NULL |
LEFT JOIN առանց համընկնողների պետք կգա, երբ ցանկանում ենք ցուցադրել բոլոր գրառումները առանց կցված ֆայլերի։
RIGHT JOIN
RIGHT JOIN-ը դուրս է բերում բոլոր գրառումները աջ աղյուսակից, եթե կան համընկնումներ, ապա նաև տվյալները ձախ աղյուսակից։
Messages աղյուսակ՝
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Files աղյուսակ՝
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
RIGHT JOIN հարցումը՝
SELECT * FROM Messages RIGHT JOIN Files ON Messages.fid=Files.fid
Արդյունքը՝
mid | bodytext | fid | path |
NULL | NULL | 1 | /files/1.png |
1 | Test | 2 | /files/2.png |
3 | Hello | 3 | /files/3.png |
RIGHT JOIN-ը պետք է, երբ ցանկանում ենք ցուցադրել բոլոր ֆայլերը՝ անկախ դրանց կցված լինելուց։
RIGHT JOIN առանց համընկնողների
RIGHT JOIN առանց համընկնողների դուրս է բերում բոլոր գրառումները աջ աղյուսակից, բացառությամբ նրանց, որոնք համապատասխանում են ձախ աղյուսակին։
Հարցումը՝
SELECT * FROM Messages RIGHT JOIN Files ON Messages.fid=Files.fid WHERE Messages.fid IS NULL
Արդյունքը՝
mid | bodytext | fid | path |
NULL | NULL | 1 | /files/1.png |
Օգտագործվում է, երբ ցանկանում ենք տեսնել այն ֆայլերը, որոնք ոչ մի հաղորդագրության կցված չեն։
FULL OUTER JOIN
Չնայած SQL-ում կա FULL OUTER JOIN, MySQL-ում այդ օպերատորը բացակայում է։ Բայց հնարավոր է էմուլացնել այս հարցումը՝ օգտագործելով LEFT JOIN և RIGHT JOIN և դրանք միացնելով UNION-ով։
SELECT * FROM Messages LEFT JOIN Files ON Messages.fid = Files.fid UNION SELECT * FROM Messages RIGHT JOIN Files ON Messages.fid = Files.fid
Արդյունքը՝
mid | bodytext | fid | path |
1 | Test | 2 | /files/2.png |
2 | Hi | NULL | NULL |
3 | Hello | 3 | /files/3.png |
NULL | NULL | 1 | /files/1.png |
FULL OUTER JOIN առանց համընկնողների
Այս հարցումը միավորում է երկու՝ LEFT JOIN և RIGHT JOIN առանց համընկնողների։ Օգտագործվում է, երբ ցանկանում ենք տեսնել բոլոր հաղորդագրությունները առանց ֆայլի և բոլոր ֆայլերը առանց հաղորդագրության։
SELECT * FROM Messages LEFT JOIN Files ON Messages.fid = Files.fid WHERE Files.fid IS NULL UNION SELECT * FROM Messages RIGHT JOIN Files ON Messages.fid = Files.fid WHERE Messages.fid IS NULL
Արդյունքը՝
mid | bodytext | fid | path |
2 | Hi | NULL | NULL |
NULL | NULL | 1 | /files/1.png |
Ահա և վերջ։ Հաջորդ դասերում մենք կսկսենք գրել ավելի բարդ հարցումներ մի քանի աղյուսակների վրա միաժամանակ։