SQL Rokasgrāmata 2. daļa [JOIN]
Šis raksts ir turpinājums rakstam SQL Rokasgrāmata 1. daļa
JOIN izmanto lai iegūtu datus no divām vai vārāk tabulām, kurām ir kāda saite savā starpā
SQL JOIN
Bieži veidojot sarežģītākas pakāpes datubāžu struktūru jau automātiski veidojam tabulas, kuras savā starpā tiks tieši vai netieši saistītas viss triviālākais piemērs ir Raksti un komentāri.
Izmantosim piemēru ar pasūtījumiem un pasūtītājiem, kas pašā pamatā ir tas pats kas raksti un komentāri ir pasūtījumi tiek piesaistīti personām.
“Persons” tabula un tās saturs
| P_Id | LastName | FirstName | Address | City |
|---|---|---|---|---|
| 1 | Hansen | Ola | Timoteivn 10 | Sandnes |
| 2 | Svendson | Tove | Borgvn 23 | Sandnes |
| 3 | Pettersen | Kari | Storgt 20 | Stavanger |
P_id ir Unikāls katrai personai (primary key)
“Orders” tabula un tās saturs
| O_Id | OrderNo | P_Id |
|---|---|---|
| 1 | 77895 | 3 |
| 2 | 44678 | 3 |
| 3 | 22456 | 1 |
| 4 | 24562 | 1 |
| 5 | 34764 | 15 |
O_id ir Unikāls katram pasūtījuma (primary key), savukārt P_id ir saite uz “Persons” tabulu, kā redzams dažas personas (personu ID) pievienotas vairākas reizes.
Vienkārša, bet saprotama relācija abu tabulu starpā
Dažādi JOIN tipi un to pielietojums
- JOIN (INNER JOIN): Atgriež rezultātus, ja abām pusēm (tabulām) tika atrasti sasitoši ieraksti
- LEFT JOIN: Atgriež datus ja tie ir pieejami kreisajā pusē, neskatoties uz to vai dati ir pieejami labajā pusē
- RIGHT JOIN: Atgriež datus ja tie ir pieejami labajā pusē, neskatoties uz to vai dati ir pieejami kreisajā pusē
- FULL JOIN: Atgriež datus ja dati ir pieejami kādā no pusēm
SQL JOIN (INNER JOIN)
Atgriež rezultātus, ja tika atrasts vismaz viens kopīgs ieraksts abās tabulās
SQL JOIN Sintakse
SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name
SQL JOIN Piemērs
Izmantosim augstāk minētās tabulas
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.P_Id=Orders.P_Id ORDER BY Persons.LastName
Izpildot šo SQL vaicājumu iesustam šādus rezultātus
| LastName | FirstName | OrderNo |
|---|---|---|
| Hansen | Ola | 22456 |
| Hansen | Ola | 24562 |
| Pettersen | Kari | 77895 |
| Pettersen | Kari | 44678 |
Tika alasīti rezutāti, kuriem ir saikne abās tabulās, tādēļ arī tika atrasti tikai 4 ieraksti nevis 5 kā tas ir redzams “Orders” tabulā.
LEFT JOIN, RIGHT JOIN
LEFT JOIN atgriež visus datus, kuri tika atrasti table_name1 pat tad ja nav saiknes ar table_name2
LEFT JOIN, RIGHT JOIN
Sintakse
SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
PS: Dažās datubāžu sistēmās LEFT JOIN tiek saukts par LEFT OUTER JOIN.
SQL LEFT JOIN Piemērs
Izmantosim augstāk minētās tabulas
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.P_Id=Orders.P_Id ORDER BY Persons.LastName
Iegūtais rezultāts:
| LastName | FirstName | OrderNo |
|---|---|---|
| Hansen | Ola | 22456 |
| Hansen | Ola | 24562 |
| Pettersen | Kari | 77895 |
| Pettersen | Kari | 44678 |
| Svendson | Tove |
Tika atgriezti visi lauki no “Persons” pat tad ja nav saiknes “Orders” tabulā, kā redzams pēdējā ailē trūkst lauka OrderNo vērtības no Orders tabulas
PS. Right JOIN darbības princips ir gandrīz identisks LEFT JOIN, vienīgā atšķirība ir tā, ka ignorēta saikne tiek labajā pusē
SQL RIGHT JOIN Piemērs
Izmantosim augstāk minētās tabulas
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.P_Id=Orders.P_Id ORDER BY Persons.LastName
Iegūtais rezultāts:
| LastName | FirstName | OrderNo |
|---|---|---|
| Hansen | Ola | 22456 |
| Hansen | Ola | 24562 |
| Pettersen | Kari | 77895 |
| Pettersen | Kari | 44678 |
| 34764 |
Tika atlasīti visi ieraksti, kuri atradās labajā pusē, “Orders” tabulā, bet tika ignorēta saiknes esamība ar kreiso pusi, “Persons” tabulu.
SQL FULL JOIN
Tiks atriesti rezultāti, neskatoties uz to vai saikne starp sīm abām tabulām eksistē
SQL FULL JOIN Sintakse
SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name
SQL FULL JOIN Piemērs
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.P_Id=Orders.P_Id ORDER BY Persons.LastName
Iegūtais rezultāts:
| LastName | FirstName | OrderNo |
|---|---|---|
| Hansen | Ola | 22456 |
| Hansen | Ola | 24562 |
| Pettersen | Kari | 77895 |
| Pettersen | Kari | 44678 |
| Svendson | Tove | |
| 34764 |
Kā redzams tika atgriesti dati no abām FULL JOIN pusēm neskatoties uz to saikni.
Autors: Roberts Mozgis (rob)
Web izstrādātājs ar vairāku gadu pieredzi. Esmu strādājis pie daudziem interesantiem projektiem Latvijā un ārpus tās. Specializācija PHP, JavaScript, CSS, Html, kā viss ap datubāzēm.






Ir ko teikt?