Difference between revisions of "SQL 2 Inner Join"

From Coders.Bay Wiki
Jump to navigation Jump to search
Line 105: Line 105:
WHERE EMP.DEPTNO = DEPT.DEPTNO;
WHERE EMP.DEPTNO = DEPT.DEPTNO;
</pre>
</pre>
Eigentlich Cross-Join mit Filterung
In dieser Schreibweise eigentlich Cross-Join mit Filterung.


==== ANSI Notation ====
==== ANSI Notation ====

Revision as of 08:34, 28 July 2023

Joins

Allgemeines

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

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

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

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

Entspricht dem kartesischem Produkt zweier Tabellen.

Oracle Notation

SELECT ENAME, DNAME
FROM EMP,DEPT;

ANSI Notation

SELECT ENAME,DNAME
FROM EMP CROSS JOIN DEPT;

Inner Join

Entspricht der Schnittmenge zweier Tabellen.

Oracle Notation

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

In dieser Schreibweise eigentlich Cross-Join mit Filterung.

ANSI Notation

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

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

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

Spaltenalias

SELECT column_name [as] alias_name
FROM table_name;

Tabellen Alias

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

Self Join

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

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

ANSI Notation

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

Beispiel

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

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

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

ANSI Notation

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

Natural Join

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

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

ANSI Notation

SELECT DNAME, ENAME
FROM DEPT NATURAL JOIN EMP;

Beispiel

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

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

Join von 3 Tabellen

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

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

ANSI Notation

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