Kontakty

MySQL pripojte dve tabuľky

Čo sa vykonáva skôr - pripojiť sa alebo skupiny? Táto implicitná otázka odo mňa nevyskytla, kým sa odpoveď na to nevyskytla vo forme chybných údajov vrátených mojou požiadavkou. Samozrejme, pripojte sa skôr, je tiež zapísaný do skupiny v otázkach. Ale čo keď potrebujem kombinované tabuľky už po zoskupení? Zvážte jednoduchý príklad, keď to bude potrebné.

Predstavme si nie príliš pohodlné, ale veľmi jednoduchý účtovný systém pozostávajúci z dvoch tabuliek: Príjem. - tabuľka príjmov a. \\ t Výdavka - Nákladový stôl. V oboch tabuľkách pre 3 polia: id (Int), Čas. (Dátum Čas), suma. (INT):

# Príjem (Príjmy) # Outlay (výdavky) ID Time Suma ID Time sume 1 2014-01-01 00:00:00 100 02 2014-01-01 00:00:00 100 2 2014-01-01-01 23:59: 59 100 2 2014-01-02 23:59:59 100 3 2014-01-02 00:00:00 500

Ako vidíte, 1. januára sme mali dva predaje 100 rubľov a 2. januára - predaj o 500 a dva výdavky 100 rubľov.

Kombinujeme, agregát, skupinu

Predstavte si, že uľahčujeme úlohu, aby sme mohli priniesť denný stôl z príjmov. Všetko je jednoduché, musíme zložiť sumu vykonaním skupiny podľa dátumu:

# Sumarizujeme príjmy a zoskupenia ich podľa dátumu dátumu (`príjem`.`ti") `Dátum`, suma (` príjem`.`sum`) `Insum`` príjmový``" insum`` príjmy "Cont 'Group podľa dátumu (" príjem ". `rTime`); # Výsledok výsledkov - množstvo výnosov podľa Denne Insomesm 2014-01-01 200 2014-01-02 500

No, teraz pred každom dátumu som chcel stiahnuť výšku výdavkov. A to je to, čo som, naivný, napísal:

# Kombinuje tabuľku príjmov a výdavkov podľa dátumu, sumarizovať príjmy a výdavky, zoskupenie podľa dnešného dňa, takže nemusí písať: vyberte dátum (`` `Time`) `Dátum`, suma (" príjem ". `sumu") `Insum`, súčet (` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ``s "outsum` out`` `` `` `` `` `` `` `` `` `` `` `` `` dňom (`príjem`.`ti) \u003d dátum (` ` `` `TIME ") Skupina podľa dátumu (` príjem`.`ti); # Stromové tyčinky! Zisk za 2. januára sa zvýšil 2 krát! Dátum Insome Outsum 2014-01-01 200 NULL 2014-01-02 1000 (!) 200

Ako vidíte, absolútny hrôza sa vrátil do odpovede - príjmy za 2 januára sa zvýšili o 2 krát. Ako už bolo uvedené na začiatku článku, \\ t Pripojiť sa k skupinám V dôsledku toho, vzhľadom k tomu, že 2. januára sme mali dve výdavkové položky, príjmy boli duplikované kombinujúcimi tabuľkami, ktoré viedli k jurisdikcii príjmu pri summovaní. Logika naznačuje, že na opravu problému musíme kombinovať tabuľky už zoskupené podľa dátumu.

Skoré zoskupenie pri kombinácii MySQL tabuľky pomocou investovanej žiadosti

V rámci jednej žiadosti nemôžeme najprv skupiny, a potom kravatu tabuliek, ale môžeme implementovať odložená zväzok s výsledkom investovanej žiadosti, \\ t A zoskupenie sa vykonáva vopred. Toto sa robí takto:

# Predbežné údaje v tabuľke výboru, potom vykonajte kombináciu s príjmami Vyberte tabuľku dátumu dátumu (`príjem`.`ti'Time`)` dátum`, súčet (`príjem`.`sum`)` Insum`, `` outlaygroup` , `outsum` z "príjmu" príjmy "Ľavé pripojenie (# Naše investované vybrané súčtové zoskupenie (` `` `` `` `)` outsum`, dátum (`` `` `` `)` outdate` z` Outlay`` `Skupina podľa dátumu (` `` `` ``)) `` `` `` `` ``) \u003d `` `` `` `outlaygroup`. Zisk je určite menší ako naposledy, ale čísla sú správne :) Dátum Insome Outsum 2014-01-01-01 200 null 2014-01-02 500 200

Typicky takéto implicitné problémy vyžadujú ako implicitné riešenia v dvoch prípadoch - keď úloha nie je úplne správna, alebo keď sa projektová architektúra ponechá veľa požadovať. V tomto prípade, samozrejme, štruktúra databázy je priťahovaná u uši kvôli príkladu.

No, nezabudnime, že investované požiadavky nie sú vždy dobré, pretože sa vykonávajú samostatne a bez ohľadu na externé. Preto, ktorí pracujú s niektorými hlavnými štatistík, nezabudnite ich optimalizovať a zdvihnúť limity. A ešte lepšie - premýšľajte o svojich vlastných :)

Prevádzkovateľ SQL Pripojiť je navrhnutý tak, aby pripojil dve alebo viac databázových tabuliek na zhode. Tento prevádzkovateľ existuje len v relačných databázach. Je to vďaka pripojení relačných databáz, ktoré majú také silné funkcie, ktoré vám umožní viesť nielen skladovanie dát, ale aj najmenej najjednoduchšie, analýzy pomocou dotazov. Analyzujeme hlavné nuansy písania SQL dotazov s operátorom Pripojiť, ktoré sú spoločné pre všetky DBMS (databázové správy systémov). Na pripojenie dvoch tabuliek má operátor SQL Spojka Nasledujúca syntax:

Vyberte NÁZVY_LBS (1..N) z mena_table_1 pripojiť meno_table_2 na stav

Po jednom alebo viacerých odkazoch môže operátor Spojka nasledovať voliteľné, kde alebo má časť, v ktorej, ako aj v jednoduchej žiadosti o výber, je stav vzorky nastavený. Všeobecne pre všetky DBMS je, že v tomto dizajne namiesto spojenia môže byť indikovaný vnútorný pripojenie, ľavý vonkajší pripojenie, pravý vonkajší pripojenie, plné vonkajšie pripojenie, krížový pripojenie (alebo ako čiarka).

Vnútorné pripojenie (vnútorné pripojenie)

Vnútorná žiadosť o pripojenie je navrhnutá tak, aby pripojila tabuľky a výstupu výslednú tabuľku, v ktorej sa údaje úplne pretínajú podľa stavu zadanému po zapnutom stave.

To isté robí to len pripojiť. Teda slovo vnútorné nie je povinné.

Príklad 1. K dispozícii je databáza port. Má tabuľku kategórií (kategórie reklamy) a časti (časti, alebo inak - rubriky, ktoré sa týkajú kategórií). Napríklad časti apartmánu, chaty sa vzťahujú na kategóriu nehnuteľností a častí automobilov, motocyklov - do kategórie dopravy. Tieto tabuľky s vyplnenými údajmi sú nasledovné.

Časti tabuľky:

Všimnite si, že v tabuľkách tabuliek majú mačku - odkaz na kategóriu, ktorá nie je v tabuľke kategórií, a tabuľka kategórie má CAT_ID - primárny kľúč, ktorý nie je v tabuľke dielov. Musíte pripojiť údaje týchto dvoch tabuliek tak, že vo výslednej tabuľke boli polia v teréne (časť), mačka (kategória) a cena AD) a že údaje sú kompletne prevodené podľa stavu. Stav - Kategória Identifikácia zhody v tabuľke kategórií a odkazy na kategóriu v tabuľke dielov. Ak to chcete urobiť, napíšte nasledujúci dotaz:

Vybrať časti.Part, Kategórie.Cat_Id ako mačka, Kategórie.Price od dielcov Inner Pripojiť Kategórie na časti.Cat \u003d Kategórie.Cat_ID

ČasťMačka.cena
Apartmány505 210,00
Automatický205 160,00
Dosky10 105,00
Skrinka30 77,00

V výslednej tabuľke nie sú žiadne knihy, pretože tento záznam odkazuje na kategóriu, ktorá nie je v tabuľke kategórií a technológie, pretože táto položka má externý kľúč v tabuľke kategórií, ktorý nie je uvedený v tabuľke dielov.

V niektorých prípadoch, keď sú tabuľky pripojené, je možné použiť menej objemných požiadaviek existuje predikát A bez použitia pripojenia.

K dispozícii je databáza "divadlo". Play Tabuľka obsahuje údaje o výrobe. Tabuľkový tím - o role hercov. TABUĽKA HECTOR - O HECKOCH. Riaditeľská tabuľka - O riaditeľoch. Tabuľkové polia, primárne a externé tlačidlá je možné vidieť na obrázku nižšie (pre priblíženie pre priblíženie ľavého tlačidla myši).


Príklad 3. Zoznam aktérov, ktorí hrajú viac ako jednu úlohu v jednej hre, a počet ich rolí.

Spojte operátora, aby ste použili 1 čas. Použitie Skupina .

Výzva. Prevádzkovateľ, ktorý má aplikovaný na počet rolí počítaných funkciou agregátu počítania.

Ľavý vonkajší pripojenie (ľavé externé pripojenie)

Žiadosť s operátorom ľavého vonkajšieho pripojenia je navrhnutá tak, aby pripojila tabuľky a výstupu výslednú tabuľku, v ktorej sa údaje úplne pretínajú podľa stavu zadaného po zapnutí, a sú doplnené vstupmi z prvého k objednávke (ľavého) tabuľky, aj keď Nesúrujte stav. Položky ľavého stola, ktoré nezodpovedajú stavu, hodnota stĺpca z pravého stola budú null (nedefinovateľné).

Príklad 4. Databáza a tabuľky sú rovnaké ako v príklade 1.

Ak chcete získať výslednú tabuľku, v ktorej sú údaje z dvoch tabuliek úplne pretínajú podľa stavu a sú doplnené všetkými údajmi z tabuľky časť, ktoré sa nezhodujú s podmienkou, napíšte nasledujúci dotaz:

Vybrať časti.Part, Kategórie.Cat_Id ako mačka, Kategórie.Price od dielov Ľaví vonkajšie KATEGÓRIE KATEGÓRIE ON

Výsledkom dotazu bude nasledujúca tabuľka:

ČasťMačka.cena
Apartmány505 210,00
Automatický205 160,00
Dosky10 105,00
Skrinka30 77,00
Knihy160 NULOVÝ

Vo výslednej tabuľke, na rozdiel od tabuľky z príkladu 1, sú tu knihy, ale hodnota cenového stĺpca (cena) je , pretože táto položka má identifikátor kategórie, ktorý nie je v tabuľke kategórií.

Správne vonkajšie pripojenie (správne externé pripojenie)

Žiadosť o správny vonkajší spojovacia operátor je navrhnutý tak, aby pripojil tabuľky a výstupu výslednú tabuľku, v ktorej sú údaje úplne pretínať podľa stavu zadanému po zapnutí, a sú doplnené vstupmi z druhej tabuľky (vpravo), aj keď oni nespĺňajte stav. Vo vstupoch správneho stola, ktoré nie sú v súlade s podmienkou, hodnota stĺpca z ľavého stola bude null (neurčito).

Príklad 5.

Ak chcete získať výslednú tabuľku, v ktorej sú údaje z týchto dvoch tabuliek pretínajú podľa stavu a sú doplnené všetkými údajmi z tabuľky kategórií, ktoré nespĺňajú stav, napíšte nasledujúci dopyt:

Vybrať časti.Part, Kategórie.Cat_Id AS CAT, Kategórie.Price od častí Spojovacia jednotka Pripojte sa k karóziám na časti.Cat \u003d Kategórie.Cat_ID

Výsledkom dotazu bude nasledujúca tabuľka:

ČasťMačka.cena
Apartmány505 210,00
Automatický205 160,00
Dosky10 105,00
Skrinka30 77,00
NULOVÝ45 65,00

V výslednej tabuľke je na rozdiel od tabuľky z príkladu 1 záznam s kategóriou 45 a cenou 65,00, ale hodnota stĺpca časti (časť) má , pretože táto položka má identifikátor kategórie ktoré v tabuľke častí nie sú žiadne odkazy.

Plné vonkajšie pripojenie (plné externé pripojenie)

Požiadavka na plnú vonkajšiu spojovaciu operátora je určená na pripojenie tabuliek a výstupu výslednej tabuľky, v ktorom sú údaje úplne pretínať podľa stavu zadanému po zapnutom a sú doplnené záznamami z prvej (ľavej) a druhé (vpravo) tabuľky, Aj keď nespĺňajú stav. Záznamy, ktoré nespĺňajú stav, hodnota stĺpcov z inej tabuľky bude null (nedefinovateľná).

Príklad 6. Databáza a tabuľky sú rovnaké ako v predchádzajúcich príkladoch.

Ak chcete získať výslednú tabuľku, v ktorej údaje z týchto dvoch tabuliek úplne pretínajú pod podmienkou a sú doplnené všetkými údajmi z tabuľky častí a z tabuľky kategórií, ktoré sa nezhodujú s podmienkou, napíšte nasledujúci dotaz:

Vybrať časti.Part, Kategórie.Cat_Id ako mačka, Kategórie.Price od dielcov Full Outter Spojka Kategórie na dielci.Cat \u003d Kategórie.Cat_id

Výsledkom dotazu bude nasledujúca tabuľka:

ČasťMačka.cena
Apartmány505 210,00
Automatický205 160,00
Dosky10 105,00
Skrinka30 77,00
Knihy160 NULOVÝ
NULOVÝ45 65,00

Výsledná tabuľka má knižné záznamy (z ľavého stola) a kategórie 45 (z pravého stola) a prvá je neurčitá cena (stĺpec z pravého stola) a druhá je neurčitá časť (stĺpec z ľavého stola).

Pseudonyms pripojiteľných tabuliek

V predchádzajúcich dotazoch sme uviedli mená obnoviteľných stĺpcov z rôznych tabuliek plných mená týchto tabuliek. Takéto požiadavky vyzerajú cumbersome: Toto isté slovo sa niekoľkokrát opakuje. Je možné nejako zjednodušiť návrh? Ukazuje sa, že je to možné. Ak to chcete urobiť, použite tabuľku pseudonyms - ich skrátené názvy. Alias \u200b\u200bmôže pozostávať z jedného písmena. Snáď ľubovoľný počet písmen v pseudonym, hlavnou vecou je, že požiadavka po znížení je pre vás pochopiteľná. Všeobecné pravidlo: V sekcii dotazov, ktorý určuje pripojenie, to znamená, že okolo slova CIGHT musíte zadať úplné názvy tabuliek a každý názov musí nasledovať tabuľku alias.

Príklad 7. Prepíšte požiadavku z príkladu 1 pomocou aliass pripojených tabuliek.

Žiadosť bude nasledovná:

Vyberte P.PART, C.CAT_ID as CAT, C.PRICE Z DRIŽKOSTI POTREBNÉHO PRÍSTUPU PROSTREDIACI

Žiadosť sa vráti rovnaká ako žiadosť v príklade 1, ale je oveľa kompaktnejšia.

Pripojiť a pripojenie viac ako dvoch tabuliek

Relačné databázy musia spĺňať požiadavky integrity a nevýhody údajov, a preto údaje o jednom obchodnom procese môžu byť obsiahnuté nielen v jednej, dvoch, ale aj v troch alebo viacerých stoloch. V týchto prípadoch sa reťazce pripojených tabuliek používajú na analýzu dát: napríklad v jednej (prvej) tabuľke obsahuje nejaký kvantitatívny indikátor, druhá tabuľka s prvou a treťou viazaním externých tlačidiel - pretítok údajov, ale len Tretia tabuľka obsahuje stav, v závislosti na tom, ktorý môže byť kvantitatívny indikátor z prvej tabuľky. A tabuľky môžu byť ešte viac. Pomocou operátora SQL Pripojiť sa v jednej požiadavke môže byť pripojený veľký počet tabuliek. V takýchto požiadavkách sa jedna časť spojenia nadväzuje na druhú a každá ďalšia spojka spája tabuľku s nasledujúcou tabuľkou, ktorá bola druhá v predchádzajúcom reťazovom spojení. Syntax SQL Query Syntax pre pripojenie viac ako dvoch tabuliek je teda nasledujúce:

Vybrať meny_stolbtsy (1..n) z mena_table_1 pripojiť meno_table_2 na stav Spojká sa name_table_3 na stav ... pripojiť meno_table_m v stave

Príklad 8. Databáza je rovnaká ako v predchádzajúcich príkladoch. Kategórie a časti tabuliek v tomto príklade pridáva tabuľku reklám obsahujúcich údaje o reklamách publikovaných na portáli. Dávame fragment tabuľky reklám, v ktorom existujú záznamy o týchto oznámeniach, ktorého obdobia zverejnenia vyprší 2018-04-02.

A_IDPart_id.Dátum_start.Dátum_end.Text.
21 1 "2018-02-11" "2018-04-20" "Predávam ..."
22 1 "2018-02-11" "2018-05-12" "Predávam ..."
... ... ... ... ...
27 1 "2018-02-11" "2018-04-02" "Predávam ..."
28 2 "2018-02-11" "2018-04-21" "Predávam ..."
29 2 "2018-02-11" "2018-04-02" "Predávam ..."
30 3 "2018-02-11" "2018-04-22" "Predávam ..."
31 4 "2018-02-11" "2018-05-02" "Predávam ..."
32 4 "2018-02-11" "2018-04-13" "Predávam ..."
33 3 "2018-02-11" "2018-04-12" "Predávam ..."
34 4 "2018-02-11" "2018-04-23" "Predávam ..."

Predstavte si, že dnes "2018-04-02", to znamená, že táto hodnota trvá cURDATE () Funkcia - aktuálny dátum . Je potrebné vedieť, aké kategórie vlastné reklamy sa obdobie zverejnenia, ktorého vyprší dnes. Názvy kategórií sú len v tabuľke kategórií a dátum exspirácie zverejnenia reklamy je len v tabuľke reklám. V tabuľkách - časť kategórií (alebo jednoduchšie, podkategórie) publikovaných reklám. Ale externé tlačidlo CAT_ID Tabuľka sú spojené s tabuľkou kategórií a tabuľka reklám je pripojená externým kľúčom part_id s tabuľkou dielov. Preto pripojíme tri tabuľky v jednom dotaze a táto požiadavka môže byť nazývaná reťaz s maximálnou správnosťou.

Žiadosť bude nasledovná:

Výsledok požiadať - tabuľka obsahujúca mená dvoch kategórií - "nehnuteľnosti" a "Doprava":

CAT_NAME.
Vlastníctvo
Preprava

Krížový pripojenie (krížové pripojenie)

Použitie SQL Cross Pripojte sa operátora v najjednoduchšej forme - bez podmienok pripojenia - implementuje prevádzku detagartová pracuje v relačnom algebre . Výsledkom takejto pripojenia bude adhézia každého riadku prvej tabuľky s každým riadkom druhej tabuľky. Tabuľky môžu byť zaznamenané v dotaze buď cez operátora krížového pripojenia, alebo cez čiarku medzi nimi.

Príklad 9. Databáza - rovnaké, tabuľky - kategórie a časti. Implementovať prevádzku degristickej práce týchto dvoch tabuliek.

Žiadosť bude nasledovná:

Vyberte (*) Kategórie Krížové časti

Alebo bez výslovne uvedeného krížového vstupu - cez čiarky:

Vyberte (*) Kategórie, časti

Dotaz vráti tabuľku z 5 * 5 \u003d 25 riadkov, ktorých fragment je uvedený nižšie:

CAT_ID.CAT_NAME.cenaPart_id.ČasťMačka.
10 Stavebné materiály105,00 1 Apartmány505
10 Stavebné materiály105,00 2 Automatický205
10 Stavebné materiály105,00 3 Dosky10
10 Stavebné materiály105,00 4 Skrinka30
10 Stavebné materiály105,00 5 Knihy160
... ... ... ... ... ...
45 Technika65,00 1 Apartmány505
45 Technika65,00 2 Automatický205
45 Technika65,00 3 Dosky10
45 Technika65,00 4 Skrinka30
45 Technika65,00 5 Knihy160

Ako je možné vidieť z príkladu, ak má výsledok takejto žiadosti nejakú hodnotu, potom môže mať v niektorých prípadoch vizuálnu hodnotu, keď nie je potrebné vyvolať štruktúrované informácie, najmä aj najjednoduchšiu analytickú vzorku. Mimochodom, môžete zadať výstupné stĺpy z každej tabuľky, ale potom sa informačná hodnota takéhoto dotazu nezvýši.

Ale pre krížový pripojenie si môžete nastaviť podmienku pripojenia! Výsledok bude úplne iný. Pri použití operátora "čiarka" namiesto explicitne špecifikovaného krížového pripojenia je podmienka pripojenia nastavená na slovo, ale v Slove, kde.

Príklad 10. Rovnaká databáza reklamy, kategórie a časti dielov. Pomocou priečneho spojenia pripojte tabuľky tak, aby boli údaje úplne pretierané podľa stavu. Stav - Kategória Identifikácia zhody v tabuľke kategórií a odkazy na kategóriu v tabuľke dielov.

Žiadosť bude nasledovná:

Žiadosť sa vráti rovnaká ako žiadosť v príklade 1:

ČasťMačka.cena
Apartmány505 210,00
Automatický205 160,00
Dosky10 105,00
Skrinka30 77,00

A táto náhoda nie je náhodná. Krížová žiadosť o podmienku pripojenia je úplne podobná dotazu s vnútorným pripojením - vnútorným spojením - alebo vzhľadom na to, že slovo vnútorné nie je povinné, len pripojiť.

Tak, aký druh dotazov je použitie - štýl otázku alebo dokonca databázový špecialista zvyk. Možno, že krížové spojenie s podmienkou pre dve tabuľky môže byť kompaktnejšie. Ale výhoda krížového kĺbu pre viac ako dve tabuľky (je tiež možné) veľmi kontroverzné. V tomto prípade, kde sú podmienky križovatky uvedené slovami a. Tento dizajn môže byť ťažkopádny a ťažko čítať, ak existuje aj sekcia s vzorovými podmienkami na konci dotazu.

Relačné databázy a jazyk SQL

SQL - lekcia 6. Kombinácia tabuliek (vnútorná asociácia)

Predpokladajme, že chceme vedieť, aké témy a aké orgány boli vytvorené. Ak to chcete urobiť, je najjednoduchšie kontaktovať tému Tabuľka (témy):

Ale ak potrebujeme identifikátory autorov v reakcii na požiadavku a ich mená? Investované požiadavky nám nepomôžu, pretože Nakoniec dávajú údaje z jednej tabuľky. A musíme získať údaje z dvoch tabuliek (témy a užívateľov) a kombinovať ich do jedného. Požiadavky, ktoré mu umožňujú robiť v SQL Združenia.

Syntax najjednoduchšej asociácie je nasledovná:

Vybrať meny_stolbtsy_table_1, mety_stolbtsy_tablitsy_2 z mena_table_1, name_2_2;

Vytvorme jednoduché združenie:

Ukázalo sa, že nie je presne to, čo sme očakávali. Takéto združenie je vedecky nazýva deklarovaný produkt, keď je každý riadok prvej tabuľky v súlade s každým riadkom druhej tabuľky. Možno existujú prípady, keď je takáto združenie užitočné, ale jasne nie je naším prípadom.

Aby sme výsledná tabuľka vyzerala, akoby sme chceli špecifikovať stav združenia. Naše tabuľky spájame identifikátorom autora, bude to náš stav. Tí. Ukazujeme na požiadanie, ktorú potrebujete na výstup iba tie čiary, v ktorých tabuľky tabuliek ID_AUTHOR zodpovedajú hodnotám tabuliek ID_USER. Používatelia:

Schéma bude jasnejší:

Tí. My v dotaze urobil nasledovnú podmienku: Ak sú v oboch tabuľkách identické identifikátory, riadky s týmto identifikátorom musia byť kombinované do jedného výsledného reťazca.

Venujte pozornosť dvom veciam:

  • Ak existuje reťazec s identifikátorom v jednej zo Spojených stolov, ktoré nie sú v inej kombinovanej tabuľke, potom v výslednej tabuľke, reťazec s takýmto identifikátorom nebude. V našom príklade existuje užívateľ Oleg (ID \u003d 5), ale nevytvoril to preto, že nie je žiadna požiadavka v dôsledku žiadosti.
  • Keď zadáte stav, názov stĺpca je zapísaný po názve tabuľky, v ktorom je tento stĺpec (prostredníctvom bodu). To sa robí, aby sa zabránilo zmäteniu, pretože stĺpce v rôznych tabuľkách môžu mať rovnaké mená a MySQL nemusí pochopiť, aké konkrétne stĺpce sú predmetné.
Všeobecne platí, že správna syntax so stavom vyzerá takto:

SELECT imya_tablitsy_1.imya_stolbtsa1_tablitsy_1, imya_tablitsy_1.imya_stolbtsa2_tablitsy_1, imya_tablitsy_2.imya_stolbtsa1_tablitsy_2, imya_tablitsy_2.imya_stolbtsa2_tablitsy_2 imya_tablitsy_1 FROM, WHERE imya_tablitsy_2 imya_tablitsy_1.imya_stolbtsa_po_kotoromu_obedinyaem \u003d imya_tablitsy_2.imya_stolbtsa_po_kotoromu_obedinyaem;

Ak je názov stĺpca jedinečný, názov tabuľky je možné vynechať (ako sme to urobili v príklade), ale neodporúča sa to urobiť.

Ako rozumiete, združenia umožňujú vybrať akékoľvek informácie z akýchkoľvek tabuliek, a tam môžu byť tri a štyri, a podmienka pre kombináciu nemusí byť jedna.

Poďme napríklad vytvoriť žiadosť, ktorá nám ukáže všetky správy, aké témy sa týkajú autorov týchto správ. Samozrejme, všetky tieto informácie sú uložené v tabuľke správ (príspevky):

Namiesto identifikátorov sa však zobrazia mená a názvy, budeme musieť urobiť kombináciu troch tabuliek:

Tí. Sme kombinované tabuľky správ a užívatelia užívateľov posts.id_author \u003d users.id_user a tabuľky správ a témy - stav posts.id_topic \u003d topics.id_topic

Združenia, ktoré sme dnes považovali za Vnútorné združenia. Takéto združenia spájajú reťazce jednej tabuľky s riadkami inej tabuľky (a môžu tiež tretie tabuľky). Existujú však situácie, keď je potrebné, aby boli zahrnuté riadky, ktoré nie sú pripojené k výsledku. Napríklad, keď sme vytvorili požiadavku, aké témy a ktoré autori boli vytvorené, užívateľ Oleg na výsledný stôl nedostal, pretože Nevytvorilo však, a preto pridružený riadok v Spojenom stole nemal.

Preto, ak potrebujeme urobiť mierne odlišnú požiadavku - vybrať všetkých používateľov a tém, ktoré vytvorili, ak vôbec - potom budeme musieť využiť Externá asociáciaPovolenie na výstup všetkých radov jednej tabuľky a dostupné riadky súvisiace s nimi z inej tabuľky. Budeme hovoriť o takýchto združeniach v nasledujúcej lekcii.

SQL - lekcia 7. Kombinácia tabuliek (externé združenie)

V pokračovaní minulých lekcií musíme stiahnuť všetkých používateľov a témy, ktoré vytvorili, ak existujú. Ak používame internú asociáciu diskutovanú na poslednej lekcii, budeme mať za následok nasledovné:

To znamená, že vo výslednej tabuľke sú tu iba títo používatelia, ktorí vytvorili témy. A musíme byť zobrazené všetky mená. Aby sme to urobili, zmeníme požiadavku trochu:

Vyberte usites.Name, topics.topic_name od užívateľov Ľaví vonkajšie témy na používateľoch.id_user \u003d topics.id_author;

A dostávame požadovaný výsledok - všetci používatelia a témy, vytvorili. Ak používateľ nevytvoril tému, ale zodpovedajúci stĺpec je null.

Takže sme pridali kľúčové slovo kľúčové slovo na našu požiadavku - Ľavý vonkajší pripojenie., Preto je potrebné vziať všetky čiary z tabuľky doľava a zmenila kľúčové slovo Kde na Na.. Okrem kľúčového slova Ľavý vonkajší pripojenie. Kľúčové slovo môže byť použité Spojka.. Potom všetky čiary z pravého stola a dostupné s nimi spojené budú vybrané z ľavého stola. Nakoniec je možná úplná externá asociácia, ktorá odstráni všetky čiary z oboch tabuliek a prepojí tie, ktoré môžu byť pripojené. Kľúčové slovo pre plné externé združenie - Plné vonkajšie pripojenie..

Poďme sa meniť v našej žiadosti Ľahká asociácia na pravú ruku:

Ako vidíte, teraz máme všetky témy (všetky čiary z pravého stola), ale používatelia sú len tie, ktoré témy vytvorili (t.j. len tie čiary, ktoré sú spojené s pravou tabuľkou), sú vybrané z ľavého stola).

Bohužiaľ, úplné zlúčenie MySQL DBMS nepodporuje.

Zhrmeníme túto krátku lekciu. Syntax pre externé združenie Ďalej.



Páči sa vám článok? Zdieľaj to