V tomto článku se podrobně podíváme na SQL Server JOINs. Zkontrolujeme všechny podporované typy JOIN SQL Server se syntaxí, vizuálními ilustracemi a příklady.
Jak všichni víme, tabulková data jsou jádrem každé SQL databáze. Aby jej mohli správci databází efektivně využívat, potřebují pravidelně extrahovat záznamy z několika tabulek na základě určitých podmínek. A přesně k tomu slouží SQL JOINs.
JOIN je klauzule SQL používaná k načtení data ze dvou nebo více tabulek na základě logických vztahů mezi tabulkami. Spojení označují, jak by měl SQL Server používat data z jedné tabulky k výběru řádků v jiné tabulce.
Různé typy JOINů v SQL
SQL Server podporuje různé typy spojení JOIN, včetně INNER JOIN , SAMOTNÉ PŘIPOJENÍ , PRŮBĚŽNÉ PŘIPOJENÍ a OUTER JOIN . Ve skutečnosti každý typ spojení definuje způsob, jakým dvě tabulky souvisí v dotazu. OUTER JOINS lze zase rozdělit na LEVÁ VNĚJŠÍ SPOJE , PRÁVA VNĚJŠÍ SPOJENÍ a ÚPLNÉ VNĚJŠÍ PŘIPOJENÍ .
Abychom lépe demonstrovali, jak fungují JOINy, vytvoříme dvě tabulky.
CREATE TABLE AdventureWorks2019.dbo.users (
auid INT IDENTITY
,username VARCHAR(50) NOT NULL
,password VARCHAR(50) NOT NULL
,createdate DATETIME NOT NULL
,isActive TINYINT NOT NULL
);
CREATE TABLE AdventureWorks2019.dbo.userprofile (
apid INT NOT NULL
,auid INT NOT NULL
,firstname VARCHAR(50) NOT NULL
,lastname VARCHAR(50) NOT NULL
,email VARCHAR(100) NOT NULL
,phone VARCHAR(45) NOT NULL
);
Dále musíme vložit data do vytvořených tabulek.
USE AdventureWorks2019
GO
Insert into dbo.users
(auid, username,password, createdate, isActive)
values
(1,'admin','pswrd123', GETDATE(), 1);
Insert into dbo.userprofile
(apid, auid, firstname, lastname, email, phone)
values
(1,1,'Jack', 'Wolf', '[email protected]','600075764216');
Insert into dbo.users
(auid,username,password, createdate, isActive)
values
(2, 'admin1','pass506', GETDATE(), 1);
Insert into dbo.userprofile
(apid, auid, firstname, lastname, email, phone)
values
(2, 3, 'Tom', 'Collins', '[email protected]','878511311054');
Insert into dbo.users
(auid, username,password, createdate, isActive)
values
(4,'fox12','[email protected]', GETDATE(), 1);
Insert into userprofile
(apid, auid, firstname, lastname, email, phone)
values
(4,5,'Bill', 'Fonskin', '[email protected]','450985764216');
Insert into dbo.users
(auid,username,password, createdate, isActive)
values
(6, 'lexus1267','98hnfRT6', GETDATE(), 1);
Insert into dbo.userprofile
(apid, auid, firstname, lastname, email, phone)
values
(7, 7, 'John', 'Hopkins', '[email protected]','878511311054');
VNITŘNÍ PŘIPOJENÍ k SQL
Příkaz INNER JOIN vrací záznamy, které mají shodné hodnoty v obou tabulkách.
Syntaxe klauzule SQL INNER JOIN je následující:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
VNĚJŠÍ JOINY SQL
Na rozdíl od klauzulí INNER JOIN vracejí OUTER JOIN nejen odpovídající záznamy, ale i ty, které se neshodují. V případě, že ve spojené tabulce existují neodpovídající řádky, zobrazí se pro ně hodnoty NULL.
Existují následující dva typy OUTER JOIN v SQL Server:SQL LEFT JOIN a SQL RIGHT JOIN. Pojďme se na každou z nich podívat blíže.
SQL LEVÉ PŘIPOJENÍ
SQL LEFT JOIN vrátí všechny záznamy z levé tabulky (tabulka A) a odpovídající záznamy z pravé tabulky (tabulka B). Pokud neexistuje žádná shoda, výsledkem je 0 záznamů z pravé strany.
Syntaxe klauzule SQL LEFT JOIN je následující:
SELECT column_name(s)
FROM tableA
LEFT JOIN tableB
ON tableA.column_name = tableB.column_name;
SPRÁVNÉ PŘIPOJENÍ k SQL
Klíčové slovo RIGHT JOIN vrátí všechny záznamy z pravé tabulky (tabulka2) a odpovídající záznamy z levé tabulky (tabulka1). Pokud neexistuje žádná shoda, výsledkem je 0 záznamů z levé strany.
Syntaxe klauzule SQL RIGHT JOIN je následující:
SELECT column_name(s)
FROM tableA
RIGHT JOIN tableB
ON tableA.column_name = tableB.column_name;
PLNÉ VNĚJŠÍ PŘIPOJENÍ k SQL
FULL OUTER JOIN vrátí všechny záznamy, když se v záznamech tabulky vlevo (tabulka A) nebo vpravo (tabulka B) shodují.
Syntaxe klauzule SQL FULL OUTER JOIN je následující:
SELECT column_name(s)
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column_name = tableB.column_name
WHERE condition;
SQL CROSS JOIN
SQL CROSS JOIN, také známý jako kartézské JOIN, načte všechny kombinace řádků z každé tabulky. V tomto typu JOIN je sada výsledků vrácena vynásobením každého řádku tabulky A všemi řádky v tabulce B, pokud není zavedena žádná další podmínka.
Pro lepší pochopení CROSS JOINů se podívejme na Vennův diagram níže.
Syntaxe SQL CROSS JOIN je následující:
SELECT *
FROM tableA
CROSS JOIN tableB;
Vlastní připojení k SQL
Self-join je normální JOIN, ale stůl je spojen sám se sebou. To znamená, že každý řádek tabulky je kombinován sám se sebou as každým dalším řádkem tabulky.
Syntaxe SQL self JOIN je následující:
SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;
Závěr
Znalosti a odborné znalosti v používání klauzulí SQL JOIN jsou základními dovednostmi každého DBA nebo analytika. S jeho hvězdnou funkcí dokončování kódu, dbForge Studio pro SQL Server může ušetřit váš čas a úsilí při psaní i těch nejsložitějších JOIN doložek. Nemusíte mít na paměti stovky názvů sloupců nebo aliasů, dbForge Studio pro SQL vás vyzve k úplné klauzuli SQL JOIN. Díky bohaté funkčnosti tohoto nástroje je navrhování složitých SQL dotazů a správa podmínek JOIN rychlé, snadné a pohodlné.