Daten und Datensätze

Was sind Datensätze? Wie erstellt man Datensätze? Wie löscht man Datensätze? Wie ändert man die Sturktur von Datensätze?
Categories: 

SELECT - Daten abfragen

-- english, deutsch, russian --

Syntax Beschreibung:

    Die SELECT-Anweisungen rufen Daten aus den Tabellen einer oder, in bestimmten Fällen, auch mehrerer Datenbanken ab. SELECT liefert eine Ergebnistabelle, die in diesem Befehl aus den Tabellen der gerade aktiven Datenbank erzeugt wird. Mit SELECT kann mann z.B: nur bestimmte Datensätze einer Tabelle auswählen oder Summen der Felder erzeugen, oder auch eine neue Ergebnistabelle aus mehreren Ausgangstabellen ertsellen.

DISTINCT

    DISTINCT teilt dem DBMS mit nur unterschiedliche Datensätze auszuwählen. Auswahl doppelter Datensätze wird somit vermieden.

    Beispiel:

SELECT DISTINCT vnum
 FROM torder;

Als Ergebnismenge werden hier alle unterschiedlichen Werte des Feldes vnum aus der Tabelle torder selektiert.

FROM { [OUTER] Tabellenname [ Alias ] } [,...]

    Mit FROM wird dem DBMS mitgeteilt aus welchen Tabellen der Datenbank die Datensätze selektiert werden.
    Das Schlüsselwort OUTER wird verwendet, wenn bei der Vernküpfung mehrerer Tabellen, die Daten der führenden Tabelle auch dann angezeigt werden sollen, wenn in den anderen Tabellen keine Daten da sind. Diese werden dann mit OUTER vor dem Tabellennamen gekennzeichnet, die Join-Bedingung bzw. die Tabellenverknüpfung wird bei dieser Syntax in der WHERE-Klausel beschrieben. Siehe weiteres unter der Beschreibung der einzelnen Join-Typen (left join, left outer join, right join, right outer join).

    Beispiel:

SELECT vnum
 FROM torder;

Als Ergebnismenge werden hier die Werte des Feldes vnum aus allen Datensätzen der Tabelle torder selektiert.

WHERE Bedingung

    Mit WHERE kann mann die Auswahl der Datensätze aus den angegebenen Tabellen einschränken.

    Beispiel:

SELECT tkunden.knum, tverkauf.vnum, tverkauf.prov
 FROM tkunden, tverkauf
 WHERE tkunden.vnum=tverkauf.vnum;

Als Ergebnismenge wird hier eine Tabelle aus den Feld knum der Ausgangstabelle tkunden und den Feldern vnum und prov der Ausgangstabelle tverkauf generiert, wo über die WHERE-Bedingung sichergestellt ist, da&szlig in den Datensätzen der Ergebnistabelle nur die zu den knum passenden vnum und prov stehen.

GROUP BY { Feldname | Integer } [,...]

    GROUP BY wird häufig im Zusammenhang mit den Aggregierungs-Funktionen benutzt um diese nur auf bestimmte Gruppen von Datensätzen wirken zu lassen. An Stelle des Feldnamens kann hier die Nummer des Feldes in der Liste der zu selektierenden Felder benutzt werden.

    Beispiel:

SELECT vnum, MAX(preis)
 FROM torder
 GROUP BY vnum;

Als Ergebnismenge werden hier die maximalen Werte des Feldes preis pro gefundene Datensatzgruppe mit gleicher vnum ausgewählt.

HAVING Bedingung

    HAVING wird innerhalb von GROUP benutzt um nur bestimmte Gruppen auszuwählen, die die nachgestellte Begingung erfüllen.

    Beispiel:

SELECT vnum, MAX(preis)
 FROM torder
 GROUP BY vnum
 HAVING AVG(preis)>10

Aus der Ergebnismenge der Gruppierung aller datensästze mit gleicher vnum, wo zu einem Schlüssel vnum alle preise aufsummiert werden, werden hier nur die herausgefiltert, wo der druchschnittliche Preis > 10 ist.

ORDER BY { Feldname | Integer [ ASC|DESC ] } [,...]

    ORDER BY sortiert die Datensätze der Ergebnismenge. Wenn ORDER BY innerhalb des GROUP BY Befehles benutzt wird, dann werden die Datensätze innerhalb der einzelnen Datensatzgruppen sortiert. An Stelle des Feldnamens kann hier die Nummer des Feldes in der Liste der zu selektierenden Felder benutzt werden. ASC sortiert die Datensätze in aufsteigender Reihenfolge, DESC in absteigender.

    Beispiel:

UNION [ALL] SELECT-Befehl

    UNION wird verwendet um zwei oder mehrere Abfragen (SELECT-Befehle) in eine Ergebnistabelle zusammenzuführen. Dabei müssen die Feldlisten der auszuwählenden Felder in den SELECT-Befehlen kompatibel sein. Wenn ALL nicht angegeben ist werden doppelte Datensätze aus dem Ergebniss entfernt. Mit UNION werden die Ergebnisse beider SELECT-Befehle in das Resultat aufgenommen.

    Beispiel:

SELECT vnum, vname
 FROM tverkauf
 WHERE stadt='Berlin'
 UNION
SELECT knum, kname
 FROM tkunden
 WHERE stadt='Berlin'
ORDER BY 1;

Hier wird eine Abfrage-Tabelle erzeugt, die alle v- und knum, sowie v- und kname entählt, wo stadt gleich Berlin ist und das Egrebnis nach der ersten Spalte sortiert ist. Doppelte Datensätze werden eliminiert.

INTERSECT [ALL] SELECT-Befehl

    ANSI DB2 Informix Oracle SQL Server Interbase
    nein ja ja ja ? ?

    INTERSECT wird verwendet um zwei oder mehrere Abfragen (SELECT-Befehle) in eine Ergebnistabelle zusammenzuführen. Dabei müssen die Feldlisten der auszuwählenden Felder in den SELECT-Befehlen kompatibel sein. Wenn ALL nicht angegeben ist werden doppelte Datensätze aus dem Ergebniss entfernt. Mit INTERSECT werden die Datensätze in das Ergebniss aufgenommen, die sowohl im ersten SELECT-Befehl, wie auch im zweitem SELECT-Befehl enthalten sind.

    Beispiel:

SELECT vnum, vname
 FROM tverkauf
 WHERE stadt='Berlin'
 INTERSECT
SELECT knum, kname
 FROM tkunden
 WHERE stadt='Berlin'
ORDER BY 1;

Hier wird eine Abfrage-Tabelle mit allen Verkäufern, die gleichzeitig auch Kunden sind, erzeugt. Das Egrebnis nach der ersten Spalte sortiert ist. Doppelte Datensätze werden eliminiert.

EXCEPT [ALL] SELECT-Befehl

    Wichtig: in einigen SQL-Dialekten wird anstatt EXCEPT - MINUS oder DIFFERENCE verwendet, die Syntax bleibt aber gleich.

    ANSI DB2 Informix Oracle SQL Server Interbase
    nein ja nein ? ? ?

    EXCEPT wird verwendet um zwei oder mehrere Abfragen (SELECT-Befehle) in eine Ergebnistabelle zusammenzuführen. Dabei müssen die Feldlisten der auszuwählenden Felder in den SELECT-Befehlen kompatibel sein. Wenn ALL nicht angegeben ist werden doppelte Datensätze aus dem Ergebnis entfernt. Mit EXCEPT werden die Datensätze in das Ergebniss aufgenommen, die im ersten SELECT-Befehl enthalten sind, aber nicht im zweitem SELECT-Befehl vorkommen.

    Beispiel:

SELECT vnum, vname
 FROM tverkauf
 WHERE stadt='Berlin'
 EXCEPT
SELECT knum, kname
 FROM tkunden
 WHERE stadt='Berlin'
ORDER BY 1;

Hier wird eine Abfrage-Tabelle mit allen Verkäufern, die nicht gleichzeitig auch Kunden sind, erzeugt. Das Egrebnis nach der ersten Spalte sortiert ist. Doppelte Datensätze werden eliminiert.

INTO TEMP Tabellenname

    ANSI DB2 Informix Oracle SQL Server Interbase
    nein ja ja ? nein nein

    INTO {TEMP|SCRATCH} wird verwendet um eine temporäre Tabelle zu erzeugen, die nach Beenden der SQL-Session gelöscht wird. Wird häfig zur optimierung von Abfragen verwendet.

Categories: 

SELECT - Schritt für Schritt

Der SQL-Befehl zum Abfragen von Daten aus einer Datenbank ist sehr mächtig und kann daher ganz schön komplex werden. Daher versuche ich hier Ihnen eine kleine Schritt-für-Schritt-Hilfestellung zum Aufbau bzw. zum Formulieren eines SELECT-Befehls zu geben. Es wird Ihnen evtl. leichter falen, wenn Sie die folgenden Fragen nach einander beantworten und Ihren SELECT-Befehl dabei Schritt für Schritt aufbauen/ergänzen:

  1. Welche Daten(-Felder) benötigen Sie?
  2. Zu allererst müssen Sie wissen und, wenn Sie es nicht wissen, suchen, in welche Datenfeldern die von Ihnen benötigte Information in der Datenbank gespeichert wird. In diesem Beispiel möchten wir eine einfache Statistik über die Anzahl von einem Verkäufer betreuten Kunden fahren. Die Verkäufernummer, der Verkäufername und die Kundennummer müssten dazu ausreichend sein.

    SELECT vnum, vname, knum
    ;
  3. In welchen Tabellen stehen die benötigten Daten?
  4. Die Verkäufernummer und der Verkäufername stehen in der Verkäufertabelle tverkauf und für die Kundennummer ist die Kundentabelle wahrscheinlich am bessten.

    SELECT a.vnum, a.vname, b.knum
    FROM tverkauf a, tkunden b
    ;
  5. In welcher Beziehung stehen die Tabellen zu einander und wie können Sie verknüpft werden?
  6. Ünber die zwei hier verwendeten Tabellen wissen wir folgendes:
    Nicht jeder Verkäufer hat einen Kunden, daher müssen die Daten aus den Tabellen so zusammengebracht werden, dass bei der Tabellenverknüpfung kein Verkäufer ausgelassen wird: wir brauchen alle Datensätze aus der Tabelle tverkauf und suchen dazu passende Daten aus der Tabelle tkunden, wenn welche da sind --> LEFT JOIN
    In der Kundentabelle ist zusätzlich die Verkäufernummer des betreuenden verkäufers gespeichert, da dies auch der Schlüssel der anderen Tabelle ist, können die Daten über die Verkäufernummer verknüpft werden --> a.vnum = b.vnum

    SQL92::
    SELECT a.vnum, a.vname, b.knum
    FROM tverkauf a LEFT JOIN tkunden b ON a.vnum=b.vnum
    ;
    Standard-SQL::
    SELECT a.vnum, a.vname, b.knum
    FROM tverkauf a, OUTER tkunden b
    WHERE a.vnum=b.vnum
    ;

    Wenn das LEFT JOIN oder das OUTER weggelassen wird, dann werden nur Verkäufer ausgegeben, die auch einen korrespondieren Datensatz in der Kundetabelle haben, daher keine Verkäufer ohne Kunden.
    Wenn das Verknüpfungskriterium a.vnum=b.vnum weggelassen wird, dann wird ein sog. kartesisches Produkt erzeugt - die Kombination aller Verkäufer mit allen Kunden, was in unserem Fall einen ziemlichen Datenmüll ergeben würde.

  7. Sollen alle Daten ausgegeben werden, oder kann man bzw. sollen sie einschränkt werden?
  8. Sagen wir mal, dass uns nur die Verkäufer in Berlin interessieren:

    SQL92::
    SELECT a.vnum, a.vname, b.knum
    FROM tverkauf a LEFT JOIN tkunden b ON a.vnum=b.vnum
    WHERE a.stadt='Berlin'
    ;
    Standard-SQL::
    SELECT a.vnum, a.vname, b.knum
    FROM tverkauf a, OUTER tkunden b
    WHERE a.vnum=b.vnum
    AND a.stadt='Berlin'
    ;
  9. Werden Detailinformationen bzw. einzelne Daten benötigt oder wird eine Statistik/Gruppierung/Verdichtung benötigt?
  10. Da wir wissen wollen, wie viel Kunden von einem Verkäufer betreut werden, müssen wie alle Kunden pro Verkäufer zählen --> COUNT.
    Dies bedeutet, dass wir die Daten hier Aggregieren bzw. Gruppieren müssen --> GROUP BY

    SQL92::
    SELECT a.vnum, a.vname, COUNT(DISTINCT b.knum) AS anzahl
    FROM tverkauf a LEFT JOIN tkunden b ON a.vnum=b.vnum
    WHERE a.stadt='Berlin'
    GROUP BY vnum, vname
    ;
    Standard-SQL::
    SELECT a.vnum, a.vname, COUNT(*) AS anzahl
    FROM tverkauf a, OUTER tkunden b
    WHERE a.vnum=b.vnum
    AND a.stadt='Berlin'
    GROUP BY vnum, vname
    ;
  11. Soll die gebildete Statistik/Gruppierung/Verdichtung noch weiter bereinigt werden?
  12. Nehmen wir an, dass wir auf der Suche nach schwarzen Schafen unter den Verkäufern sind und Verkäufer mit Vielen Kunden von voirn herein nicht betrachten wollen. Dann müssen wie aus den Ergebnissen der Kundenzählung zu allen verkäufern nur die ausselektieren, die uns interessieren. In diesem beispiel, wollen wir alle Verkäufe nicht betrachten, wie 100 und mehr Kunden haben:

    SELECT a.vnum, a.vname, COUNT(DISTINCT b.knum) AS anzahl
    FROM tverkauf a LEFT JOIN tkunden b ON a.vnum=b.vnum
    WHERE a.stadt='Berlin'
    GROUP BY vnum, vname
    HAVING COUNT(DISTINCT b.knum) 
    ;
  13. Wie sollen die Ergebnisse sortiert werden?
  14. Auf unserer Suche nach den "scharzen Schafen" wollen wir zuerst die Verkäufer sehen die weniger Kunden haben, daher soll das Ergebnis nach der Kundeanzahl aufsteigend sortiert werden:

    SELECT a.vnum, a.vname, COUNT(DISTINCT b.knum) AS anzahl
    FROM tverkauf a LEFT JOIN tkunden b ON a.vnum=b.vnum
    WHERE a.stadt='Berlin'
    GROUP BY vnum, vname
    HAVING COUNT(DISTINCT b.knum) ORDER BY anzahl ASC
    ;
  15. Möchten Sie die Anzahl der ausgegebenen Datensätze beschränken?
  16. Da wir unserem Verkaufs-Chef nur einige Mitarbeitergespräche zumuten wollen, begrenzen wir die Anzahl der Datensätze im Ergebnis auf 10:

    SQL92::
    SELECT a.vnum, a.vname, COUNT(DISTINCT b.knum) AS anzahl
    FROM tverkauf a LEFT JOIN tkunden b ON a.vnum=b.vnum
    WHERE a.stadt='Berlin'
    GROUP BY vnum, vname
    HAVING COUNT(DISTINCT b.knum) LIMIT 10
    ;
    Informix::
    SELECT FIRST 10 a.vnum, a.vname, COUNT(DISTINCT b.knum) AS anzahl
    FROM tverkauf a LEFT JOIN tkunden b ON a.vnum=b.vnum
    WHERE a.stadt='Berlin'
    GROUP BY vnum, vname
    HAVING COUNT(DISTINCT b.knum) 
    
  17. Sollen die Ergebnisse in eine, ggf. temporäre, Tabelle geschrieben werden?
  18. Wenn die so gebildeten Daten noch weiter verarbeitet werden sollen, z.B. in weiteren SELECT-Befehlen, dann können die Ergebnisse in eine (temporäre) Tabelle geschrieben werden. So will der besagte Verkaufschef vielleicht selbst entscheiden, wie viel Mitarbeitergespräche er führen will. Dann bauen wie die Datensatz-Anzahl-Begrenzung wieder aus und schreiben stattdesen die Daten in eine Tabelle:

    Temporäre Tabelle
    SELECT a.vnum, a.vname, COUNT(DISTINCT b.knum) AS anzahl
    FROM tverkauf a LEFT JOIN tkunden b ON a.vnum=b.vnum
    WHERE a.stadt='Berlin'
    GROUP BY vnum, vname
    HAVING COUNT(DISTINCT b.knum) INTO TEMP verkauf_score
    ;
    Reguläre, fest angelegte Tabelle (muss vorher mit CREATE TABLE angelegt sein)
    INSERT INTO verkauf_score
    SELECT a.vnum, a.vname, COUNT(DISTINCT b.knum) AS anzahl
    FROM tverkauf a LEFT JOIN tkunden b ON a.vnum=b.vnum
    WHERE a.stadt='Berlin'
    GROUP BY vnum, vname
    HAVING COUNT(DISTINCT b.knum) 
    
Categories: 

INNER JOIN - normale Tabellen-Verknüpfung

Syntax

    WHERE a.feld1 = b.feld2
    vor SQL92 (implizite Beschreibung von Tabellen-Verknüpfungen)

    FROM Tabelle1 [Alias1] INNER JOIN Tabelle2 [Alias2] ON {Tabelle1|Alias1}.vnum = {Tabelle2|Alias2}.vnum
    ab SQL92 (explizite Beschreibung von Tabellen-Verknüpfungen)

Beschreibung
    Der Inner Join bzw. Equal Join oder Equivalent Join ist die "normale" Tabellenverküpfung, welche Datensätze aus zwei Tabellen verknüpft, bei denen ein Feld (das jeweilige) dieselben Werte enthält.

    Beuspiel:

-- before SQL 92
SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a, tkunden b
WHERE a.vnum = b.vnum
ORDER BY vnum;

-- SQL 92
SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a INNER JOIN tkunden b ON a.vnum=b.vnum
ORDER BY vnum;

Ergebnis:

vnum vname   knum kname
1    Mueller 1    Lehmann
1    Mueller 2    Schmidt
1    Mueller 3    Schumacher
2    Meyer   4    Schroeder
2    Meyer   5    Stoiber
3    Schulz  6    Lohmann
3    Schulz  7    Krupp
3    Schulz  8    Stradivari
3    Schulz  9    Schumacher

LEFT JOIN - linke Inklusionsverknüpfung

Syntax

    FROM Tabelle1 [Alias1], OUTER Tabelle2 [Alias2]
    WHERE a.Feld1 = b.Feld2

    Informix, vor SQL92 (implizite Beschreibung von Tabellen-Verknüpfungen)

    WHERE (a.Feld1 = b.Feld2(+))
    Oracle, vor SQL92 (implizite Beschreibung von Tabellen-Verknüpfungen)

    FROM Tabelle1 [Alias1] LEFT JOIN Tabelle2 [Alias2] ON {Tabelle1|Alias1}.vnum = {Tabelle2|Alias2}.vnum
    ab SQL92 (explizite Beschreibung von Tabellen-Verknüpfungen)

Beschreibung
    Der Left Join bzw. Left Outer Join ist die Tabellenverküpfung, welche zusätzlich zu den Datensätzen aus zwei Tabellen, bei denen ein Feld (das jeweilige) dieselben Werte enthält auch alle Datensätze aus der ersten (linken) Tabelle mit in das Ergebnis einfügt.

    Beispiel:

-- Informix
SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a, OUTER tkunden b
WHERE a.vnum = b.vnum
ORDER BY vnum;

-- Oracle
SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a, tkunden b
WHERE (a.vnum = b.vnum(+))
ORDER BY vnum;

-- SQL 92
SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a LEFT JOIN tkunden b ON a.vnum=b.vnum
ORDER BY vnum;

Ergebnis:

vnum vname       knum kname
1    Mueller     1    Lehmann
1    Mueller     2    Schmidt
1    Mueller     3    Schumacher
2    Meyer       4    Schroeder
2    Meyer       5    Stoiber
3    Schulz      6    Lohmann
3    Schulz      7    Krupp
3    Schulz      8    Stradivari
3    Schulz      9    Schumacher
4    Burgmueller 
In der Ergebnismenge taucht zusätzlich der Verkäufer Nummer 4 auf, welcher noch keine Kunden hat.

RIGHT JOIN - rechte Inklisionsverknüpfung

Syntax

    FROM OUTER Tabelle1 [Alias1], Tabelle2 [Alias2]
    WHERE a.Feld1 = b.Feld2

    Informix, vor SQL92 (implizite Beschreibung von Tabellen-Verknüpfungen)

    WHERE (a.Feld1(+) = b.Feld2)
    Oracle, vor SQL92 (implizite Beschreibung von Tabellen-Verknüpfungen)

    FROM Tabelle1 [Alias1] RIGHT JOIN Tabelle2 [Alias2] ON {Tabelle1|Alias1}.Feld1 = {Tabelle2|Alias2}.Feld2
    ab SQL92 (explizite Beschreibung von Tabellen-Verknüpfungen)

Beschreibung
    Der Right Join bzw. Right Outer Join ist die Tabellenverküpfung, welche zusätzlich zu den Datensätzen aus zwei Tabellen, bei denen ein Feld (das jeweilige) dieselben Werte enthält auch alle Datensätze aus der zweiten (rechten) Tabelle mit in das Ergebnis einfügt.

    Beispiel:

-- Informix
SELECT a.vnum, a.vname, b.knum, b.kname
FROM OUTER tverkauf a, tkunden b
WHERE a.stadt = b.stadt
ORDER BY vnum;

-- Oracle
SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a, tkunden b
WHERE (a.stadt(+) = b.stadt)
ORDER BY vnum;

-- SQL 92
SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a RIGHT JOIN tkunden b ON a.stadt = b.stadt
ORDER BY vnum;

Ergebnis:

vnum vname   knum kname
1    Mueller 1    Lehmann
1    Mueller 2    Schmidt
1    Mueller 4    Schroeder
3    Schulz  5    Stoiber
             3    Schumacher
             6    Lohmann
             7    Krupp
             8    Stradivari
             9    Schumacher
             10   Testcustomer
Auflistung aller Kunden mit Anzeige der Verkäufer, falls sie in der gleichen Stadt wohnen.

FULL JOIN - beidseitige Inklusionsverknüpfung

Syntax

    FROM Tabelle1 [Alias1] FULL JOIN Tabelle2 [Alias2] ON {Tabelle1|Alias1}.Feld1 = {Tabelle2|Alias2}.Feld2
    ab SQL92 (explizite Beschreibung von Tabellen-Verknüpfungen)

    SELECT Feldliste FROM Tabelle1 [Alias1] LEFT JOIN Tabelle2 [Alias2] ON {Tabelle1|Alias1}.Feld1 = {Tabelle2|Alias2}.Feld2 UNION
    SELECT Feldliste FROM Tabelle1 [Alias1] RIGHT JOIN Tabelle2 [Alias2] ON {Tabelle1|Alias1}.Feld1 = {Tabelle2|Alias2}.Feld2

    ab SQL92 (falls die direkte deklaration eines Union Joins nicht unterstützt wird)

    SELECT Feldliste FROM Tabelle1 [Alias1], OUTER Tabelle2 [Alias2]
    WHERE {Tabelle1|Alias1}.Feld1 = {Tabelle2|Alias2}.Feld2 UNION
    SELECT Feldliste FROM OUTER Tabelle1 [Alias1], Tabelle2 [Alias2]
    WHERE {Tabelle1|Alias1}.Feld1 = {Tabelle2|Alias2}.Feld2

    Informix vor SQL92 (implizite Join-Deklaration)

    SELECT Feldliste FROM Tabelle1 [Alias1], Tabelle2 [Alias2]
    WHERE ({Tabelle1|Alias1}.Feld1 = {Tabelle2|Alias2}.Feld2(+)) UNION
    SELECT Feldliste FROM Tabelle1 [Alias1], Tabelle2 [Alias2]
    WHERE ({Tabelle1|Alias1}.Feld1(+) = {Tabelle2|Alias2}.Feld2)

    Oracle vor SQL92 (implizite Join-Deklaration)

Beschreibung

    Der Full Join bzw. Full Outer Join ist die Tabellenverküpfung, welche zusätzlich zu den Datensätzen aus zwei Tabellen, bei denen ein Feld (das jeweilige) dieselben Werte enthält auch alle Datensätze aus der ersten (linken) und der zweiten (rechten) Tabelle mit in das Ergebnis einfügt, welche keine Entsprechung in der jeweils anderen tabelle haben.

    Wichtig ist, dass wenn ein Full-Join nicht direkt durch die datenbank unterstützt wird (Syntax 1), alle verknüpfbaren Datensätze durch die zwei SELECT-Statements zwei mal ausgewählt werden und erst im zweiten Schritt durch die UNION-Klausel ohne ALL-Zusatz bereinigt werden.

    Beispiel:

-- SQL 92
SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a FULL JOIN tkunden b ON a.vnum = b.vnum
ORDER BY vnum;

Ergebnis:

vnum vname       knum kname
                 10   Testcustomer
1    Mueller     1    Lehmann
1    Mueller     2    Schmidt
1    Mueller     3    Schumacher
2    Meyer       4    Schroeder
2    Meyer       5    Stoiber
3    Schulz      6    Lohmann
3    Schulz      7    Krupp
3    Schulz      8    Stradivari
3    Schulz      9    Schumacher
4    Burgmueller 		
Auflistung aller Verkäufer und aller dazu passenden Kunden, ohne irgendwelche Datensätze aus einer der beiden Tabellen auszulassen.

CROSS JOIN - kartesisches Produkt

Syntax

    SELECT {Tabelle1|Alias1}.Feld1 [,...] , {Tabelle2|Alias2}.Feld2 [,...]
    FROM Tabelle1 [Alias1], Tabelle2 [Alias2]

    vor SQL92 (keine Beschreibung von Tabellen-Verknüpfungen)

    FROM Tabelle1 [Alias1] CROSS JOIN Tabelle2 [Alias2]
    ab SQL92 (explizite Beschreibung von Tabellen-Verknüpfungen)

Beschreibung
    Der Cross Join bzw. kartesische Produkt ist "gar keine" Tabellenverküpfung, welche bewirkt, dass alle möglichen Kombinationen aller Datensätze beider Tabellen erzeugt werden.

    Beispiel:

-- before SQL 92
SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a, tkunden b
ORDER BY vnum;

-- SQL 92
SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a CROSS JOIN tkunden b
ORDER BY vnum;

Ergebnis:

vnum	vname	knum	kname
1	Mueller 	1	Lehmann
1	Mueller 	2	Schmidt
1	Mueller 	3	Schumacher
1	Mueller 	4	Schroeder
1	Mueller 	5	Stoiber
1	Mueller 	6	Lohmann
1	Mueller 	7	Krupp
1	Mueller 	8	Stradivari
1	Mueller 	9	Schumacher
1	Mueller 	10	Testcustomer
2	Meyer 	1	Lehmann
2	Meyer 	2	Schmidt
2	Meyer 	3	Schumacher
2	Meyer 	4	Schroeder
2	Meyer 	5	Stoiber
2	Meyer 	6	Lohmann
2	Meyer 	7	Krupp
2	Meyer 	8	Stradivari
2	Meyer 	9	Schumacher
2	Meyer 	10	Testcustomer
3	Schulz 	1	Lehmann
3	Schulz 	2	Schmidt
3	Schulz 	3	Schumacher
3	Schulz 	4	Schroeder
3	Schulz 	5	Stoiber
3	Schulz 	6	Lohmann
3	Schulz 	7	Krupp
3	Schulz 	8	Stradivari
3	Schulz 	9	Schumacher
3	Schulz 	10	Testcustomer
4	Burgmueller 	1	Lehmann
4	Burgmueller 	2	Schmidt
4	Burgmueller 	3	Schumacher
4	Burgmueller 	4	Schroeder
4	Burgmueller 	5	Stoiber
4	Burgmueller 	6	Lohmann
4	Burgmueller 	7	Krupp
4	Burgmueller 	8	Stradivari
4	Burgmueller 	9	Schumacher
4	Burgmueller 	10	Testcustomer

Andere Join-Typen

Natural Join

    Verknüpft die Tabellen über die Gleichheit aller jeweils gleich benannten Felder/Spalten. Diese gleich benannte Felder/Spalten aus den zwei Tabellen werden im Ergebnis nur einmal angezeigt. Gibt es keine gleich benannten Felder/Spalten, wird der Natural Join zum kartesischen produkt, zum Cross Join.

    Für den Natural Join gibt es keinen speziellen SQL92-Befehl. Er kann jederzeit durch einen Inner Join bzw. Equal Join erzeugt werden.

Union Join

    Analog zu dem Full Outer Join werden alle Datensätze beider Tabellen aufgenommen. Im Unterschied dazu. werden sie aber nicht (über eine Bedingung) verknüpft.

    Der Union Join wird erst ab SQL 92 Intermediate Level direkt unterstützt.

    Beispiel:

SELECT *
FROM tverkauf a UNION JOIN tkunden b
ORDBER BY 1;
Semi Join

    Ist ein Natural Join zweier Tabellen, wobei in das ergebnis nur die Felder/Spalten der ersten Tabelle aufgenommen werden.

    Für den Natural Join gibt es keinen speziellen SQL92-Befehl. Er kann jederzeit durch einen Inner Join bzw. Equal Join erzeugt werden.

Theta Join, Non equivalent Join

    Analog zum Equal Join, nur dass anstatt einer Gleicheits-Bedingung eine Ungleicheitsbedingung verwendet wird.

    Beispiel:

SELECT a.vnum, a.vname, b.knum, b.kname
FROM tverkauf a INNER JOIN tkunden b ON a.vnum <= b.vnum
ORDER BY vnum;
Self Join
    Ein beliebiger Join bei dem die gleiche Tabelle mit sich selbst verknüpft wird.

INSERT - Daten eingeben

Syntax

Beschreibung:

    INSERT INTO fügt neue Datensätze in die mit Tabellenname angegebene Tabelle, die entweder mit festen Werten belegt werden oder Ergebnis eines SELECT-Befehls sind.

    Beispiel:

INSERT INTO tberlin
 SELECT *
 FROM tverkauf
 WHERE stadt='Berlin'

Hier werden alle Datensätze aus der Tabelle tverkauf, wo stadt gleich Berlin ist, in die Tabelle tberlin eingefügt.

VALUES ( Wert [,...] )

    Mit VALUES kann mann in dem INSERT-Befehl einen neuen Datensatz in eine Tabelle schreiben, der mit festen Werten belegt wird.

    Beispiel:

INSERT INTO tverkauf (vnum,vname,stadt)
 VALUES ( 1001, 'Müller', 'Berlin' );

Hier wird ein neuer Datensatz, bestehend aus 1001,'Müller','Berlin',NULL in die Tabelle tverkauf geschrieben.

Categories: 

DELETE FROM - Daten löschen

Syntax

Beschreibung

    Mit DELETE FROM werden Datensätze aus einer Datenbanktabelle gelöscht.

    Beispiel:

DELETE FROM tverkauf
 WHERE stadt='Kleinstadt'

Hier werden alle Datensätze der Tabelle tverkauf gelöscht, wo stadt gleich Kleinstadt ist.

Categories: 

UPDATE - Daten verändern

Syntax

Beschreibung:

    UPDATE wird dazu verwendet um bestimmte Werte in den Feldern einer Tabelle mit anderen Werten zu ersetzen.

SET { Feldname=Wert } [,...]

    Mit SET werden die angegebenen Felder in der Liste mit den angegebenen Werten ersetzt.

    Beispiel:

UPDATE tverkauf
 SET prov = prov + .01
 WHERE 2 &lt=
 ( SELECT COUNT(knum) FROM tkunden WHERE tkunden.vnum=tverkauf.vnum );

Hier wird das Feld prov bei den Datensätzen der Tabelle tverkauf um .01 erhöht, die mit nicht mehr als zwei Datensätzen der Tabelle tkunden über das Feld vnum verbunden sind, z.B. Provisionserhöhung bei Verkäufern mit weniger als drei Kunden...

Categories: 

CASE - Befehl

Syntax:

Beschreibung:

    Mit CASE können Daten in Abhängigkeit von anderen Daten verarbeitet werden.

    Beispiel

SELECT knum, kname,
CASE
  WHEN stadt <> 'Berlin'
  THEN LEFT('Das ist ein Nichtberliner, der sehr schlecht ist...',40)
  ELSE stadt
END berlin_ja_nein
FROM tkunden
WHERE rating>1;

Hier werden alle Kunden selektiert, deren Rating größer ist als 1, wobei nur nach Berlinern und Nichtberlinern unterschieden wird.

LOAD - Daten aus einer Datei laden

Syntax:

Beschreibung:

    Wird verwendet um Daten aus einer flachen Datei in eine Tabelle zu laden. Es ist möglich jedes Zeichen als Trennzeichen (Delimiter) anzugeben. Wenn kein Delimiter angegeben ist, dann wird der in den meisten RDBMS '|' verwendet.

Categories: 

UNLOAD - Daten in eine Textdatei schreiben

Syntax

Beschreibung:

    Wird verwendet um die Ergebnisse einer SQL-Abfrage in eine flache Datei zu schreiben. Es ist möglich jedes Zeichen als Trennzeichen (Delimiter) anzugeben. Wenn kein Delimiter angegeben ist, dann wird der in den meisten RDBMS '|' verwendet.

Categories: