Limbajul de interogare structurat (sql)

Capitolul 3. Interogări utilizând mai multe tabele

În literatură se arată că compușii sunt subseturi ale unui produs cartezian. Deoarece produsul cartezian a n tabele - un tabel care conține toate posibile r rând, astfel încât r este orice rânduri de ambreiaj din primul tabel, al doilea rând al tabelului. și linia mesei n-lea (așa cum am învățat deja să se facă distincția cu SELECT orice subset al unui tabel relațional), atunci veți găsi numai dacă puteți utiliza SELECT pentru a obține produsul cartezian. Pentru produsul cartezian a mai multor tabele trebuie să fie specificate în clauza FROM lista de tabele multiplicate, iar în clauza SELECT - toate coloanele lor.







Deci, pentru a obține produsul Cartesian Viewfish și Meals, trebuie să emiteți o interogare

SELECT Vizualizare *, Masă. *
FROM Видь_блюд, Трапезы;

Obținem o tabelă care conține 5 x 3 = 15 rânduri:

SELECT Meniu. *, Mese. *, View_Special *, Vesela. *
Din meniu, masă, vedere, sânge, vase;

se creează o masă (figura 3.1), care conține 21 x 3 x 5 x 33 = 10 395 rânduri.

Din primele 39 de linii din această masă, doar două topicuri (marcate cu "*"): coincid cu numărul de feluri de mâncare din meniuri și feluri de mâncare. În rest - nonsens complet: gustări includ băuturi și supă, mic dejun este oferit supa neplanificate, etc

Dacă eliminați rânduri și coloane inutile dintr-un produs cartezian, puteți obține tabelele reale care corespund oricăreia dintre legături.

Fig. 3.1. Ilustrație a produsului cartezian

Evident, selectarea rândurilor reale este asigurată prin intrarea în clauza WHERE a frazei, în care se stabilește o corespondență între:

  • codurile meselor (T) în tabelele meniului și al mesei (Menu.Т = Meals .T),
  • coduri de tipuri de feluri de mâncare (B) în tabelele Menu și View_Bad (Menu.V = View_Bad.V),
  • numărul de vase (BL) din tabelele meniului și vase (Menu.БЛ = Блюда.БЛ).

O astfel de interogare ajustată

SELECT Meniu. *, Mese. *, View_Special *, Vesela. *
Din meniu, masă, vedere, sânge, vase
WHERE Menu.T = Masa .T
Și meniul.
ȘI meniul.BL = Bucate.BL;

vă va permite să obțineți un Equi-join al meselor Meniu, Mese, View_fish și Vase:

Carne cu garnitură

Este ușor de observat că tabelele echidistant au inclus coloane duplicate, peste care a fost realizată conexiunea (T, B și BL). Pentru a exclude aceste duplicate, puteți crea o conexiune firească a acelorași tabele:







SELECT T, B, BL, masa, vedere, mâncare, baza, ieșire, muncă
Din meniu, masă, vedere, sânge, vase
WHERE Menu.T = Masa .T
Și meniul.
ȘI meniul.BL = Bucate.BL;

Implementarea intrării naturale a tabelelor are forma

Carne cu garnitură

Pentru a exclude toate coloanele prin care sunt conectate tabelele, trebuie să creați o compoziție

SELECT masa, vizualizare, varianta, baza, ieșire, lucru
Din meniu, masă, vedere, sânge, vase
WHERE Menu.T = Masa .T
Și meniul.
ȘI meniul.BL = Bucate.BL;

Carne cu garnitură

În baza de date, este dificil să găsiți un exemplu simplu care să ilustreze tabelele de conexiuni theta. Prin urmare, vom construi o astfel de cerere îndepărtată:

SELECT Vizualizare *, Masă. *
FROM View_Blood, mese
WHERE Tip> Masa;

permițând să selecteze din compusul obținut în secțiunea 3.2.1 a produsului cartezian tabele Vid_blyud Meal și numai acele rânduri în cazul în care masa de la „mai puțin decât“ (alfabetic) valori formează preparate

selectarea compusului rânduri relevant (WHERE frază), ordonarea rezultatului (ORDER BY frază) și datele de agregare (SQL-funcție și GROUP BY fraza): foaia de lucru, aplicabile care toate operațiile discutate în Capitolul 2 este generat atunci când se formează compus.

De exemplu, pentru a obține o listă de feluri de mâncare oferite în meniu pentru micul dejun, puteți genera o cerere bazată pe compoziție (paragraful 3.2.4):

SELECT Vizualizare, Paine, Bază, Ieșire, 'Număr -', BL
Din meniu, masă, vedere, sânge, vase
WHERE Menu.T = Masa .T
Și meniul.
ȘI Menu.BL = Dishes.BL
ȘI mese = 'Mic dejun';

Carne cu garnitură

În paragraful 3.6, vă puteți familiariza cu un exemplu destul de complet de conectare a tabelelor cu diverse fraze suplimentare.

Într-un număr de aplicații, devine necesar să se proceseze simultan datele unui tabel și unul sau mai multe dintre copiile sale create în momentul executării interogării.

De exemplu, atunci când creați liste de elevi (Tabelul Studenții) pot reintroduce datele oricărui student prin atribuirea el a doua problema record de carte. Pentru a detecta astfel de erori se pot alătura un tabel cu elevii ei o copie temporară a setării în egalitatea clauza WHERE a valorilor tuturor coloanelor din tabelele de același nume, cu excepția coloanei cu numărul de înregistrare-carte (pentru acesta din urmă, este necesar să se stabilească valorile stării de inegalitate).

O copie temporară a tabelului poate fi generată prin specificarea numelui aliasului după numele tabelului din clauza FROM. Deci, cu ajutorul fraza

Din farfuria X, feluri de mâncare Y, feluri de mâncare Z

se vor forma trei copii ale mesei Dish cu numele X, Y și Z.

Ca un exemplu, tabelul de compus pentru a se forma cererea de retragere a acestor perechi tave tabele care coincid bază, precum și numele primei perechi de mese mai mici (în ordine alfabetică) decât numărul de a doua pereche de feluri de mâncare. Pentru a face acest lucru, puteți crea o interogare cu o copie a tabelului Dish (Cc):

SELECT Dish, Copy.Dish, Basis
Din feluri de mâncare, feluri de mâncare
WHERE Basis = Copiați
Și mâncare <Копия.Блюдо;

sau cele două exemplare (primul și al doilea):

SELECT Prima Dish, Second.Dish, Basis
Din primele feluri de mâncare, feluri de mâncare Al doilea
WHERE First.Base = Second.Found
Și prima dată <Вторая.Блюдо;







Trimiteți-le prietenilor: