Sākums » Datubāzes

SQL Rokasgrāmata 2. daļa [JOIN]

07.04.2009 16:37 664 skatījumi Nav komentāru

Š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.

VN:F [1.2.3_620]
Rating: 5.0/5 (4 votes cast)

Ir ko teikt?

Vari izmantot:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Raksta komentāru RSS