Difference between revisions of "SQL 2 Inner Join"

From Coders.Bay Wiki
Jump to navigation Jump to search
 
Line 230: Line 230:
</pre>
</pre>


===== ANSI Notation ======
===== ANSI Notation =====
<pre>
<pre>
SELECT GRADE,JOB,ENAME,SAL
SELECT GRADE,JOB,ENAME,SAL

Latest revision as of 09:03, 28 July 2023

Joins[edit]

Allgemeines[edit]

Ein Join verbindet Daten aus mehreren Tabellen

EMP

EMPNO ENAME ........ DEPTNO
7499 ALLEN ........ 30

DEPT

DEPTNO DNAME LOC
30 SALES CHICAGO

Wenn wir nun Daten von beiden Tabellen lesen möchten, brauchen wir zwei SELECT-Statements.

Beispiel[edit]

Wo arbeitet ALLEN?

1.)

SELECT DEPTNO
FROM EMP
WHERE ENAME = 'ALLEN';

ERGEBNIS: 30

2.)

SELECT LOC
FROM DEPT
WHERE DEPTNO = 30

Um dies in einem SELECT-Statement schreiben zu können gibt es Join Schreibweisen, die diese Statements vereinen.

SELECT Spalten
From Tabelle1, Tabelle 2
WHERE BEDINGUNG

In unserem Beispiel

SELECT LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO 
AND EMP.DNAME = 'ALLEN';

Mit dem Ausdruck EMP.DEPTNO = DEPT.DEPTNO bilden wir die Vereinigungsmenge der Daten aus EMP und DEPT. Genauer gesagt alle Daten, die die gleiche DEPTNO besitzen, werden zu einem Datensatz zusammengefasst.

Beispiel 1[edit]

Ausgabe aller Mitarbeiter und der ihnen zugeordneten Abteilsungsnamen, die in Abteilung 30 oder 40 arbeiten.

SELECT DEPT.DEPTNO,DNAME,ENAME,JOB
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EMP.DEPTNO IN (30,40)
ORDER BY DEPT.DEPTNO;

ANSI vs. Oracle Notation[edit]

In der Welt der Datenbanken gibt es verschiedene Schreibweisen für die selbe Funktionalität. In MySQL(XAMPP) wird die ANSI Notation unterstützt und in der Oracle DB können ANSI wie auch Oracle Notation verwendet werden. Grundsätzlich unterscheiden sich die Notationen nur in der Schreibweise. Die Funktionalität beider Schreibweisen ist identisch.

Cross Join[edit]

Entspricht dem kartesischem Produkt zweier Tabellen.

Oracle Notation[edit]

SELECT ENAME, DNAME
FROM EMP,DEPT;

ANSI Notation[edit]

SELECT ENAME,DNAME
FROM EMP CROSS JOIN DEPT;

Inner Join[edit]

Entspricht der Schnittmenge zweier Tabellen.

Oracle Notation[edit]

SELECT *
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

In dieser Schreibweise eigentlich Cross-Join mit Filterung.

ANSI Notation[edit]

SELECT *
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO

Wenn der Name der Spalten, über die der Join durchgeführt wird, gleich ist, kann alternativ folgende Schreibweise verwendet werden.

SELECT *
FROM EMP INNER JOIN DEPT
USING (DEPTNO);

Alias[edit]

Alias werden verwendet, um Spalten oder Tabellen temporär "umzubenennen".

  • Zur leichteren Lesbarkeit
  • aus technischen Gründen (Bsp. FROM DEPT, DEPT)

Spaltenalias[edit]

SELECT column_name [as] alias_name
FROM table_name;

Tabellen Alias[edit]

SELECT column_name(s)
FROM table_name [as] alias_name
WHERE alias_name.column_name ....;

Self Join[edit]

Die Tabelle wird mit sich selbst verbunden. Das heisst, dass ein Eintrag einer Tabelle auf einen anderen Eintrag der selben Tabelle verweist (klassisches Beispiel hierfür ist eine unäre Beziehung).

Als Beispiel hierfür wollen wir wissen, wer für wen arbeitet.

Employees and Their Managers
SCOTT arbeitet für JONES
FORD arbeitet für JONES
JAMES arbeitet für BLAKE
MARTIN arbeitet für BLAKE
MILLER arbeitet für CLARK
......

Oracle Notation[edit]

SELECT e1.ename||' arbeitet für '||e2.ename "Employees and Their Managers"
FROM emp e1, emp e2    
WHERE e1.mgr = e2.empno

ANSI Notation[edit]

SELECT e1.ename||' arbeitet für '||e2.ename "Employees and Their Managers"
FROM emp e1, emp e2    
WHERE e1.mgr = e2.empno

Beispiel[edit]

Gesucht sind alle Mitarbeiter, die mehr verdienen als ihr Vorgesetzter

SELECT WORKER.ENAME,WORKER.SAL,MANAGER.ENAME,MANAGER.SAL
FROM EMP WORKER,EMP MANAGER
WHERE WORKER.MGR = MANAGER.EMPNO
AND WORKER.SAL > MANAGER.SAL;

Equi Join[edit]

Der Equi Join ist ein Join, der im Join Prädikat den Gleichheitsoperator verwendet.

Die zu berbindenden Spalten müssen den gleichen Datentyp haben.

Oracle Notation[edit]

SELECT *
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

ANSI Notation[edit]

SELECT *
FROM EMP JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;

Natural Join[edit]

Der Natural Join ist ein Join, der auf Spalten basiert, die denselben Namen haben. Die Join-Spalten müssen kompatible Daten beinhalten. Für eine Join-Spalte darf kein Alias Präfix oder Tabellenname verwendet werden. Der Natural Join ist eine Variante des Equi-Joins.

Oracle Notation[edit]

SELECT DNAME, ENAME
FROM DEPT, EMP
WHERE DEPT.DEPTNO = EMP.DEPTNO;

ANSI Notation[edit]

SELECT DNAME, ENAME
FROM DEPT NATURAL JOIN EMP;

Beispiel[edit]

Gesucht ist die Gehaltsstufe jedes Mitarbeiters. SALGRADE(GRADE,LOSAL,HISAL)

Oracle Notation[edit]
SELECT GRADE,JOB,ENAME,SAL
FROM EMP,SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL
ORDER BY GRADE,JOB;
ANSI Notation[edit]
SELECT GRADE,JOB,ENAME,SAL
FROM EMP JOIN SALGRADE
ON SAL BETWEEN LOSAL AND HISAL

Join von 3 Tabellen[edit]

Um mehrere Tabellen zu joinen, verwendet man das gleiche System, wie bei zwei Tabellen.

Gesucht sind Gehaltsstufe, Name, Gehalt und Arbeitsort aller Beschäftigten.

Oracle Notation[edit]

SELECT GRADE, ENAME, SAL, LOC
FROM EMP, SALGRADE, DEPT
where  SAL BETWEEN LOSAL AND HISAL
AND DEPT.DEPTNO = EMP.DEPTNO;

ANSI Notation[edit]

SELECT GRADE, ENAME, SAL, LOC
FROM EMP 
JOIN SALGRADE ON SAL BETWEEN LOSAL AND HISAL
JOIN DEPT ON DEPT.DEPTNO = EMP.DEPTNO;