Tabulu kombinēšana (Join) – termini

For english speaking only check SQL join types.

SQL JOIN klauza kombinē ierakstus no divām tabulām. Tabulu kombinēšanām ir vairāki varianti un klasifikācija pēc vairākiem veidiem. Tā visa rezultātā pirmajā brīdī var nebūt īsti skaidrs kurš kombinēšanas veids ko īsti dara un kurā brīdī jāizmanto. SQL tabulu kombinēšanas veidi un to savsarpējā saistība ir parādīta ER diagrammā. Jāklikšķina uz tās, lai attēlu palielinātu un varētu visu salasīt.

SQL tabulu kombinēšanas veidi

Šajā rakstā ieskicēšu kombinēšanas klasificēšanas veidus.

Atkarība no kombinēšanas ierobežojuma esamības

Atkarībā no tā, vai kombinēšanai tiek uzlikts kāds ierobežojums vai nē, iegūst:

  • CROSS JOIN (saukts arī par CARTESIAN PRODUCT, CARTESIAN JOIN) – nav nekādu ierobežojumu. Latviski to sauc arī par Dekarta reizinājumu. Visi pārējie kombinēšanas veidi degradējas uz Dekarta reizinājumu, ja kombinēšanas nosacījums vienmēr ir spēkā (patiess).
  • NATURAL JOIN, NAMED COLUMNS JOIN, CONDITIONAL JOIN – tabulu kombinēšana ar ierobežojumu, kas klasificēti atkarībā no tā, kā tas sintaktiski pierakstīts. NATURAL JOIN un NAMED COLUMNS JOIN sintaktiskais pieraksts vienmēr dod tikai un vienīgi EQUI JOIN, tur nav iespējas izvēlēties nekādu citu operatoru kā vienādību. CONDITIONAL JOIN pieraksts ļauj izvēlēties vai nu lietot vienādību, vai arī kādu citu operatoru.

ER diagrammā attēloti dzeltenā krāsā.

Atkarība no ierakstu atlases

Atkarībā no tā, vai tiek atlasīti tikai tie ieraksti, kas apmierina nosacījumu (attiecīgi CROSS JOIN šis iedalījums nav piemērojams, jo tam nekāda ierobežojuma nav), vai arī pārējie ieraksti no iesaistītajām tabulām, iegūst:

ER diagrammā attēloti zaļā krāsā. Tātad šeit uzskaitītie kombinēšanas veidi – INNER vai kāds no OUTER var tikt izmantoti jebkuram no uzskaitītajiem pārējiem kombinēšanas veidiem, izņemot CROSS JOIN.

Atkarība no operatora izmantošanas

Atkarībā no tā, kāds operators tiek izmantots kombinēšanas nosacījumā, iedalījums ir:

  • EQUI JOIN – kombinēšanas nosacījumā tiek izmantota vienādība.
  • NONEQUI (THETA, θ) JOIN – kombinēšanas nosacījumā netiek izmantota vienādība, bet kāds cits operators.

ER diagrammā attēloti gaiši zilā krāsā. Tā kā NATURAL JOIN un NAMED COLUMNS JOIN operators netiek norādīts un tas noklusēti ir vienādība, tad tie vienmēr ir EQUI JOIN. Šis iedalījums nav piemērojams CROSS JOIN, jo tam nekāda nosacījuma nav.

Atkarība no iesaistītajām tabulām kombinēšanā

Atkarībā no tā, ar ko tabula tiek kombinēta:

  • SELF JOIN – tabula tiek kombinēta pati ar sevi.

ER diagrammā attēloti oranžā krāsā. SELF JOIN var būt reizē arī jebkurš no pārējiem kombinēšanas veidiem.

Tālākā lasāmviela

Sintakse, piemēri un viss pārējais sekos…

7 Responses to Tabulu kombinēšana (Join) – termini

  1. MārtiņšŠ saka:

    Vislabākais ir CARTESIAN JOIN 🙂 pāris reizes esmu iekritis un ilgi domājis, kāpēc tas parādās Explain plānā, lai saprastu, ka patiesībā viss ir kārtībā – optimizators izdomājis, ka tā būs ātrāk… 😉

  2. asdfg saka:

    Kādi ir plusi, vai mīnusi inner join vietā lietojot vienkāršu where nosacījumu, kas join gadījumā tiek lietots pie on?
    Vienīgā reize, kad inner join jēgu saskatu ir, ja nepieciešams pievienot vairākiem laukiem vienu un to pašu tabulu.

  3. Gints Plivna saka:

    Daži plusi un mīnusi ir minēti pie raksta par Inner Join sadaļā Alternatīvā sintakse. Tur ir arī mans personīgais viedoklis par to 🙂
    >Vienīgā reize, kad inner join jēgu saskatu ir, ja nepieciešams pievienot vairākiem
    >laukiem vienu un to pašu tabulu.
    Hmm šito es īsti nesapratu. Tas ir domāts gadījumā, ja kombinēšanas nosacījums nav tikai a.id = b.id bet
    a.id1 = b.id1 and a.id2 = b.id2, t.i., sastāv no vairākām izteiksmēm? Principā arī where klauzā nekas nekavē tādu rakstīt.

  4. asdfg saka:

    Nē. Es to domāju apmēram tā.
    SELECT name_data.value, surname_data.value FROM tabula1 INNER JOIN tabula2 as name_data ON tabula1.name_id=name_data.id INNER JOIN tabula2 as surname_data ON tabula1.surname_id=surname_data.id

    Doma, tāda, ka tabula2 glabā, gan vārdus, gan arī uzvārdus uz kuriem ir atsauces no tabulas1. Un lai atlasītu cilvēka vārdu un uzvārdu ar where nepietiks.
    Lai gan tagad sāku domāt, ka maldos. 🙂 Kaut kas šāds arī tak nostrādātu – FROM tabula1, tabula2 as a, tabula2 as b?

  5. Gints Plivna saka:

    Jā nostrādātu gan. Pie Inner joiniem 9tajā piemērā kā reiz ir kaut kas uz to modi, tur tikai ir pilnīgs Self joins un viena tabula tiek ņemta 3 instancēs, nevis divās kā šeit vajadzētu. Galvenais atcerēties, ka joinot var da jebko, tas var būt apakšvaicājums, vairākas tabulas, viena un tā pati tabula n reizes utt. tātad kaut kas, kas dod ārā ierakstus. Ja runājam par nosacīto ANSI sintaksi un to, ka kombinēšanas nosacījumus raksta where klauzā, tad Outer joniem ir gadījums, kad ar where klauzu vien nepietiek, bet tas būs nākošajā rakstā. Tā kā drīz būs 🙂

  6. […] Daudz JOINu ar visa veida pierakstiem (+), OUTER, ķer uz USING un ON atšķirībām, uz aliasu izmantošanas niansēm […]

  7. […] FROM – norāda tabulu/tabulas no kuras dati jāiegūst. Ja ņemsim datus no vairākā tabulām, FROM norādīsim apakšnosacījumu JOIN, lai precizētu noteikumus tabulu savienošanai. Vairumā gadījumu es teiktu INNER JOIN un miers, bet varat palasīt vairāk par tiem noteikumiem šeit. […]

Komentēt