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 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 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): @tags: SQL, MySQL, SQL Server, Oracle, SQLite, postgresql
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
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
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