Magyarázat egyesületek SQL csatlakozzon bal

Nézzünk egy példát. Van két asztal: a felhasználók és osztályok.

U) felhasználók D) osztályok
id név d_id id neve
-- ---- ---- -- ----
Vladimir 1 1 1 értékesítés
Anton 2 2 2 Support
3 Alexander március 6 pénzügyek
4. Boris április 2 Logistics
5 Yuri 4

SELECT u.id. u.name. d.name AS d_name
FROM felhasználók u
Inner join osztályok D u.d_id = d.id

A lekérdezés az egyesített adatokat, amelyek metszik a meghatározott feltétel az inner join ON <..>.
Ebben az esetben az a feltétel, <таблица_пользователей>.<идентификатор_отдела> meg kell egyeznie <таблица_отделов>.<идентификатор>

Ennek eredményeként nem:

- Alexander (Division 6 - nem létezik)
- Department of Finance (nincs felhasználó)

id neve d_name
-- -------- ---------
1 Vladimir Sales
2. Anton Support
4. Boris Support
3 Jurij Logistics

Inner join inner join (szinonim REGISZTRÁCIÓ belső kulcsszó elhagyható).

Válassza csak a megfelelő adatokat az összekapcsolt táblák.


Ahhoz, hogy az adatokat, amelyek alkalmasak a feltétel részben kell használni

Külső Csatlakozás - JOIN KÜLSŐ.

Az ilyen egyesület vissza adatokat mindkét asztal (megfelelő állapotnak egyesülési) és komplementer maradék mintát adatokhoz egy külső táblázatot, amely nem megfelelő a feltételt, kitöltve a hiányzó adatokat NULL érték.

Kétféle külső egyesület külső összekapcsolás - LEFT JOIN KÜLSŐ és jobb külső csatlakozni.

Ezek ugyanúgy működnek, a különbség abban rejlik, hogy a bal - azt jelzi, hogy a „külső” táblát kell elhelyezni a bal (ebben a példában az asztal felhasználók számára).
KÜLSŐ kulcsszó elhagyható. Vedd LEFT JOIN azonos LEFT JOIN KÜLSŐ.

SELECT u.id. u.name. d.name AS d_name
FROM felhasználók u
LEFT JOIN KÜLSŐ osztályok D u.d_id = d.id

Szerezni a teljes listát a felhasználók és osztályok kapcsolódnak.

id neve d_name
-- -------- ---------
1 Vladimir Sales
2. Anton Support
3. Alexander NULL
4. Boris Support
5 Yuri Logistics

HOL IS NULL d.id

A mintában lesz csak 3 # Alexander, mivel még nem neveztek osztály.

Ábra. Bal külső csatlakozni szűrés területén


Jobb külső JOIN visszatér a lista osztályok (jobb táblázat) és a leképezett felhasználók.

SELECT u.id. u.name. d.name AS d_name
FROM felhasználók u
Jobb külső JOIN osztályok D u.d_id = d.id

id neve d_name
-- -------- ---------
1 Vladimir Sales
2. Anton Support
4. Boris Support
NULL NULL pénzügyek
5 Yuri Logistics

Továbbá, szűrheti az adatokat, ellenőrzi a NULL.

SELECT d.id. d.name
FROM felhasználók u
Jobb külső JOIN osztályok D u.d_id = d.id
AHOL u.id NULL

Példánkban megadásával WHERE u.id NULL, akkor válassza ki a szervek, amelyek nem regisztrált felhasználók. (# 3 Finance)


A példák mindegyike tesztelheti itt:

FULL JOIN visszatér `obedinenie` egyesületek BAL és JOBB asztalok, kombinálásával a két lekérdezés.

CROSS JOIN visszatér kereszt (derékszögű), amely a két asztal. Az eredmény az lesz a minta az összes rekordot az első táblázat egyes sorokhoz a második asztal. A lényeg az, hogy a kereszt nem szükséges meghatározni az összekapcsolási feltétel.

Ismétlődő sorok között a REGISZTRÁCIÓ

Amikor egy kombináció kezdők gyakran elfelejtik, hogy a kapott minta tartalmazhat ismétlődő adatok!
Ha szüksége van egy bejegyzés, hogy az unió a segédlekérdezésként

SELECT t1. *. t2. * Feladó left_table t1 bal csatlakozzon # 40; select * from right_table ahol some_column = 1 határa 1 # 41; T2 = t1.id t2.join_id

A mintát az azonos táblázat több feltételeket.

Tekintsük a feladatot Yandex:

Van egy asztal az áruk.

CREATE TABLE `ya _ goods` # 40;
`Id` int # 40; 11 # 41; előjel nélküli NOT NULL AUTO_INCREMENT.
`Elnevezés varchar # 40; 64 # 41; NOT NULL.
PRIMARY KEY # 40; `id` # 41;
# 41; MOTOR = InnoDB DEFAULT CHARSET = utf8;
helyezze ya_goods értékek # 40; 1. „Alma” # 41;. # 40; 2. „alma” # 41;. # 40; 3. „körte” # 41;. # 40; 4. „alma” # 41;. # 40; 5. „narancs” # 41;. # 40; 6. „körte” # 41; ;

Ez tartalmazza a következő értékeket.

`Id`` name`
1 alma
2. Alma
3. Körte
4 alma
5. Narancs
6. Körte

Írja kérését, hogy kiválaszt egy egyedülálló páros `id` áruk identical` name`, például:

A probléma megoldásának kell jegyezni, hogy a pár (x, y) és (y, x) - azonosak.

SELECT g1.id id1. g2.id Egyid2
-- CONCAT ( '(', legkevésbé (g1.id, g2.id), '', GREATEST (g1.id, g2.id), ')') sorban
AZ ya_goods g1
Inner join ya_goods G2 g1.name = g2.name
AHOL g1.id <> g2.id
GROUP BY LEAST # 40; g1.id. g2.id # 41;. LEGNAGYOBB # 40; g1.id. g2.id # 41;
ORDER BY g1.id;

-- vagy anélkül (gyorsabb)

SELECT DISTINCT CONCAT # 40; '('. LEAST # 40; g1.id. g2.id # 41;. ''. LEGNAGYOBB # 40; g1.id. g2.id # 41;. ')' # 41; sor
AZ ya_goods g1
Inner join ya_goods G2 g1.name = g2.name
AHOL g1.id <> g2.id

Keverjük össze ya_goods tábla ugyanazon a területen, `name`, csoport őket aszerint, hogy egyedi identifikatoram és kap az eredmény.


Több multi csatlakozni unió

Hasznosak lehetnek a számunkra, ha azt szeretné, hogy egymás után több értéket a táblázatban több feltételeket.

Példa: A beállításegyüttest (tömeg, térfogat) az áruk.
Termékek a termék táblázatban lehetőségek - asztali product_options, beállítási értékek - táblázat product2options
Szükséges: szűrni termékek dátum, és a rendelkezésre álló lehetőségek

CREATE TABLE `termékcsaládok # 40;
`Id` int # 40; 11 # 41;.
`Title` varchar # 40; 255 # 41;.
`Alkotó _ at` datetime
# 41;

CREATE TABLE `termék _ options` # 40;
`Id` int # 40; 11 # 41;.
`Elnevezés varchar # 40; 255 # 41;
# 41;

CREATE TABLE `product2options` # 40;
`Termék _ id` int # 40; 11 # 41;.
`Option _ id` int # 40; 11 # 41;.
`Value` int # 40; 11 # 41;
# 41;

INSERT INTO `terméket _ options` # 40; `Id`. `name` # 41; VALUES
# 40; 11. „súly” # 41;.
# 40; 12. 'Volume' # 41; ;

INSERT INTO `product2options` # 40; `Termék _ id`. `Option _ id`. `value` # 41; VALUES
# 40; 11. 1. 200 # 41;.
# 40; 12. 1. 250 # 41;.
# 40; 2. 11. 35 # 41;.
# 40; 2. 12. 15 # 41;.
# 40; 11. 3. 310 # 41;.
# 40; 12. 3. 300 # 41;.
# 40; 2. 11. 45 # 41;.
# 40; 2. 12. 25 # 41; ;

Csak sorolja a lehetőségek szempontjából az al-lekérdezés / dzhoine keresztül ÉS / VAGY nem működik,
elvégzéséhez szükséges összekötő táblázatok lehetőségek számával megegyező ezek ugyanazok a lehetőségek (van - 2: térfogat és súly)

SELECT p. *. po1.name 'P1'. p2o1. értéket. po2.name 'P2'. p2o2. érték

FROM products p

Inner join product2options p2o1 ON p.id = p2o1.product_id
Inner join product_options PO1 ON po1.id = p2o1.option_id

Inner join product2options p2o2 ON p.id = p2o2.product_id
Inner join product_options PO2 ON po2.id = p2o2.option_id

Kombinációk alkalmazhatók együtt UPDATE.
Például, van házak asztal (id, cím, terület). Ki kell választania a címet, ha megfelel számos m2` `Cserélje Field területen, ha az kevesebb. mert mysql otstutsutstvuet a szabályos kifejezések, szüksége van egy kis pokoldovat hogy keresse meg és substr.
A segédlekérdezésben, válassza ki az adatokat az érdeklődés, és a végső szakaszban az adatok aktualizálja a megfelelő kritériumok (p5> terület).

UPDATE házak bázis
inner join # 40;
-- Antaris 1594 m2-es iroda kiadó a mértéke 12.700 rubelt. m2 / év -> 1594
SELECT
id.
@baseString: = cím cím.
@areaTitleEnd: = LOCATE # 40; 'M2'. @baseString # 41; p2.
@tmpString: = LTrim # 40; REVERSE # 40; SUBSTR # 40; @baseString. 1. @areaTitleEnd # 41; # 41; # 41; P3.
@areaTitleBegin: = BAL # 40; @tmpString. - 1 + LOCATE # 40; ''. @tmpString # 41; # 41; mint p4.
@ Érték: = CAST # 40; REVERSE # 40; @areaTitleBegin # 41; előjeltelenné # 41; a p5

AZ ga_pageviews
WHERE cím, mint a '%% m2'
# 41; számított HASZNÁLATA # 40; `id` # 41;
SET alap. terület = calc.p5
Ahol az alap. terület

Tekintsük a példát eltávolítása ismétli. Van egy asztal tableWithDups (id, e-mail). Meg kell szüntetni a vonal azonos e-mail:

DELETE tableWithDups
AZ tableWithDups
inner join # 40;
SELECT MAX # 40; id # 41; AS lastId. e-mail
AZ tableWithDups
GROUP BY-mail
RENDELKEZŐ COUNT # 40; * # 41> 1
# 41; dups ON dups.email = tableWithDups.email
AHOL tableWithDups.id

Az utolsó két példa nem kompatibilis az ANSI SQL, de dolgoznak mySQL.

Mögött a cikket kapcsolódott szervezetek (valamint egyes konkrét témák bazdannyh):
SELF REGISZTRÁCIÓ, FULL JOIN KÜLSŐ, CROSS REGISZTRÁCIÓ (határokon [KÜLSŐ] ellenében), állítsa műveletek UNION [ALL], metszik egymást, KIVÉVE stb

@tags: SQL, MySQL, SQL Server, Oracle, SQLite, postgresql