Někdy je potřeba zobrazit data z více tabulek. Chcete-li to provést, musíte propojit jednu tabulku s jinou tabulkou. Existují různé způsoby, jak můžeme získat data z více tabulek. Zde bych se zaměřil na Oracle Joins s příklady. To platí obecně také pro jakékoli Sql Joins . Vysvětlil bych vnitřní spojení, vnější spojení, křížové spojení, přirozené spojení, kartézské spojení s příklady
Připojení k Oracle
Připojuje se Oracle je dotaz, který kombinuje řádky ze dvou nebo více tabulek Oracle.
Oracle provede spojení vždy, když se v klauzuli FROM objeví více tabulek. Chcete-li spojit dvě tabulky, musíte identifikovat společné sloupce, které s těmito dvěma tabulkami souvisí. V klauzuli WHERE definujete vztah mezi tabulkami uvedenými v klauzuli FROM.
Některá pravidla pro Oracle Joins ( Sql Joins)
1) při psaní příkazu select, který spojuje tabulky, je dobrou praxí uvést před název sloupce název tabulky z důvodu přehlednosti.
2) Ke spojení m tabulek potřebujeme alespoň m-1 podmínek
3) Pokud je název tabulky dlouhý, můžeme pro název tabulky použít alias tabulky. Tabulka vypadá kód kratší a tedy méně paměti
4) Pokud při výběru sloupce nepoužíváte název_tabulky nebo alias tabulek a pokud má více tabulek stejný název sloupce, měli bychom zadat název_tabulky pro sloupec, který je pro všechny tabulky společný
Vnitřní spojení
Nejběžnějším operátorem používaným ke spojení dvou tabulek je operátor rovnosti (=). Tomu se říká rovnoprávné spojení nebo equijoin . Toto jednoduché spojení známé také jako vnitřní spojení
Příklad vnitřního spojení Oracle
Syntax
Select tab1.col,tab2.col
from tab1 ,tab2
where tab1.col=tab2.col
SELECT EMP.EMPNO,EMP.ENAME, DEPT.DEPTNO,DEPT.DNAME
FROM EMP , DEPT
where EMP. DEPTNO= DEPT. DEPTNO;
Aby bylo možné provést spojení tří nebo více tabulek, Oracle spojí dvě tabulky na základě podmínky spojení, poté připojí výsledek k jiné tabulce na základě podmínek spojení a opakuje, dokud nejsou spojeny všechny tabulky.
Komplexní spojení
Do klauzule WHERE přidejte jednu nebo více podmínek. Pokud vás například zajímají všechna oddělení a jejich umístění mimo Spojené království, použijte
SELECT LOCATIONS.LOCATION_ID, CITY, DEPARTMENT_NAME
FROM LOCATIONS, DEPARTMENTS
WHERE LOCATIONS.LOCATION_ID = DEPARTMENTS.LOCATION_ID
AND COUNTRY_ID != 'UK';
Není –equijoin
Non-equijoin je podmínka spojení jiná než operátor rovnosti.
Jedná se o příkaz vnitřního spojení, který používá nerovnou operaci (tj.:<>,>, <, =, BETWEEN atd.) ke spárování řádků z různých tabulek
SELECT e.ename, e.sal, s.grade
FROM emp e, sal_grade s
WHERE e.sal BETWEEN s.low_sal AND s.high_sal;
Kartézské produkty nebo Kartézské spojení nebo Křížové spojení
-Kartézské spojení (nebo kartézský součin) (nebo křížové spojení) nastane, když jsou data vybrána ze dvou nebo více tabulek a je definována podmínka spojení nebo není definován žádný společný vztah v klauzuli WHERE
-Pokud je provedeno spojení a není zadána žádná podmínka spojení, výsledkem je kartézský součin. Kartézský součin je sada výsledků, která je součinem celkových řádků dvou tabulek. Pokud má tabulka „P“ 100 řádků a tabulka „Q“ má 100 řádků a je vyvinut kartézský součin, výsledná sada výsledků bude mít 10 000 řádků. Pokud dotaz spojí tři nebo více tabulek, optimalizátor může najít způsob, jak vybrat pořadí spojení, které vylučuje kartézský produkt, ale nepočítejte s ním.
SELECT EMPNO,ENAME, DEPT.DEPTNO,DNAME FROM EMP , DEPT ;
or
SELECT EMPNO,ENAME, DEPT.DEPTNO,DNAME FROM EMP cross join DEPT ;
Vnější spojení
Vnitřní spojení, která jsme viděli, vracejí odpovídající řádky ze dvou nebo více tabulek podle podmínky spojení. Mechanismus vnějšího spojení vrací data z jedné tabulky, i když ve spojovací tabulce není žádný odpovídající řádek.
Existují tři vnější spojení
a) Levé vnější spojení nebo Levé spojení
b) Pravé vnější spojení nebo Pravé spojení
c) Úplné vnější spojení nebo úplné spojení
Levé vnější spojení
vrátí řádky odpovídající z obou tabulek i neshodné řádky z tabulky nalevo od klauzule spojení.
LEFT OUTER JOIN by vrátil všechny záznamy z levé tabulky a pouze ty záznamy z pravé tabulky, které se protínají s pravou tabulkou
Zde je příklad levého vnějšího spojení Oracle
Example:
select empno,ename,emp.deptno,dname
from emp
LEFT OUTER JOIN dept
on emp.deptno=dept.deptno;
syntaxe spojení Oracle (+) :V databázi Oracle můžeme také použít syntaxi znaménka plus pro levé vnější spojení. V tomto případě je plus spojení na pravé straně rovnice.
Example:
select empno,ename,emp.deptno,dname
from emp ,dept where emp.deptno=dept.deptno(+) ;
Přímé vnější spojení
vrátí řádky odpovídající z obou tabulek i neshodné řádky z tabulky napravo od klauzule spojení.
Zde je příklad pro vnější spojení Oracle Right
Example:
select empno,ename,dept.deptno,dname
from emp
right OUTER JOIN dept
on emp.deptno=dept.deptno;
syntaxe spojení Oracle (+) :V databázi Oracle můžeme také použít syntaxi znaménka plus pro RIGHT OUTER JOIN. V tomto případě je pravé spojení indikováno, když je znaménko plus nalevo od rovnice.
Example:
select empno,ename,dept.deptno,dname
from emp ,dept where emp.deptno(+)=dept.deptno ;
Úplné vnější spojení
Tento typ spojení vrátí všechny řádky z tabulky LEVÉ a PRAVÉ tabulky s nulami na místě, kde není splněna podmínka spojení
Zde je příklad pro Oracle Full Outer Join
select empno,ename,dept.deptno,dname
from emp
full OUTER JOIN dept
on emp.deptno=dept.deptno;
Tento dotaz vrátí všechny řádky z obou tabulek. Použití syntaxe Oracle pomocí E.DEPT_ID (+) =D.DEPT_ID (+) není možné, protože znaménko (+) může odkazovat pouze na jednu tabulku. Musíme použít Union, abychom toho dosáhli pomocí znaménka +
select empno,ename,dept.deptno,dname
from emp ,dept where emp.deptno=dept.deptno(+)
union
select empno,ename,dept.deptno,dname
from emp ,dept where emp.deptno(+)=dept.deptno;
Některé RDBMS nepodporují klauzuli úplného vnějšího spojení, pak to můžeme použít níže
select empno,ename,dept.deptno,dname
from emp
left OUTER JOIN dept
on emp.deptno=dept.deptno
union
select empno,ename,dept.deptno,dname
from emp
right OUTER JOIN dept
on emp.deptno=dept.deptno;
PŘIROZENÉ PŘIPOJENÍ
Přirozené spojení určuje, že spojení souvisí se všemi sloupci se stejnými názvy ve dvou tabulkách.
V zásadě porovnává společné sloupce obou tabulek. Před provedením přirozeného spojení byste měli zkontrolovat, zda v obou tabulkách existují společné sloupce.
Example
SELECT EMP_ID,EMP_NAME, DEPT_ID,DEPARTMENT_NAME FROM EMP NATURAL JOIN DEPT;
Zde dept_id je stejný sloupec mezi tabulkami emp a dept
Přirozené spojení může spojit více než dva stoly
Doufám, že se vám tento příspěvek na webu Oracle joins s příklady líbí.
Související články
Výukový program pro Oracle SQL
Poddotazy Oracle SQL
Operátoři sady Oracle
pohled Oracle
jak psát sql dotazy
Sloupec automatického zvýšení – sekvence
Cross Join v Oracle
vlastní připojení k orákulu s příklady
příklady syntaxe spojení Oracle
Hash Join v Oracle