Zum Inhalt springen.
Zum Seitenanfang springen.
Sie befinden sich genau hier: Home > Computer > Coding > SQL .

SQL (Structured Query Language):


SQL SQL ist eine Datenbanksprache die es ermöglicht, Daten abzufragen, einzufügen oder zu löschen. SQL gibt es schon seit 1986 und ermöglich als verbreiteter Standard die einfache Kommunikation mit vielen Datenbanksystemen.

Testserver / Musterdaten
Unterabfragen sind eigenständige Abfragen. Sie können als Zwischenschritt eingesetzt werden, um komplexe Fragen in einer einzelnen Abfrage zu beantworten. So können Views oder sogar kleine Programme, welche sonst die Daten vorhalten müssten, überflüssig werden.

Mir einer Unterabfrage wird eine Tabelle erzeugt, die nur temporär existiert. Diese Tabelle kann dann in der weiteren Abfrage genutzt werden.

In diesem konkreten Beispiel wird die Unterabfrage genutzt, um den Namen und die Abteilung der Mitarbeiter zu ermitteln. Da die Tabelle mit den Namen aller Personen bereits für die Kundennamen per JOIN angebunden wurde, muss die Tabelle Personen hierzu erneut angebunden werden. Diesmal in einer Unterabfrage.
SELECT

Datenbank.Schema.Rechnung.Datum,
Datenbank.Schema.Rechnung.Wert, AS "Rechnungsbetrag",
Datenbank.Schema.Rechnung.ID,
Datenbank.Schema.Personen.Name AS "Kundenname", -- Die Tabelle Personen ist per LEFT JOIN für den Kundennamen angebunden

-- Die Tabelle Personen wird nun als Unterabfrage erneut angebunden, diesmal für den Mitarbeiternamen
(SELECT Datenbank.Schema.Personen.Name FROM Datenbank.Schema.Personen
    WHERE Datenbank.Schema.Rechnung.MAID = Datenbank.Schema.Personen.ID) AS Mitarbeitername,

-- Noch eine Unterabfrage, diese liefert die Abteilung des Mitarbeiters, welche auch in der Personentabelle steht
(SELECT Datenbank.Schema.Personen.Abteilung FROM Datenbank.Schema.Personen
    WHERE Datenbank.Schema.Rechnung.MAID = Datenbank.Schema.Personen.ID) AS Mitarbeiterabteilung,

LEFT JOIN Datenbank.Schema.Personen ON
Datenbank.Schema.Personen.ID = Datenbank.Schema.Rechnung.KundeID

WHERE (Datenbank.Schema.Rechnung.Datum between '01.01.2010' AND '31.01.2010')

ORDER BY Datenbank.Schema.Rechnung.Wert

In diesem weiteren Beispiel wird die Unterabfrage genutzt, um den Gesamtbetrag je Mitarbeiter an Reisekosten zu erhalten. Mit einer Aggregatsfunktion wird somit die Summe aller Reisekosten in der Tabelle Gehaltsdb_sonstigeAuszahlungen ermittelt. Temporär entsteht hierdurch die Tabelle AuszahlungReisekosten, in der für jeden Mitarbeiter nur eine Zeile mit zwei Spalten existiert (DBID, Reisekosten). Diese Tabelle wird nun an die restliche Abfrage per JOIN übermittelt und ermöglicht es die gewünschte Gesamtsumme je Mitarbeiter als Spalte Reisekosten in der Gesamtliste auszugeben.
SELECT Gehaltsdb.Schema.Gehaltsdb_Auszahlung.DBID, Name, Vorname, Gehaltsdb.Schema.Gehaltsdb_Auszahlung.Jahr, Sum(Betrag) AS Auszahlung, Reisekosten
FROM Gehaltsdb.Schema.Gehaltsdb_Auszahlung

INNER JOIN Gehaltsdb.Schema.Stammdaten ON Gehaltsdb.Schema.Gehaltsdb_Auszahlung.DBID = Gehaltsdb.Schema.Stammdaten.DBID

INNER JOIN (
   SELECT DBID, SUM(Reisekosten) As Reisekosten
   FROM Gehaltsdb.Schema.Gehaltsdb_sonstigeAuszahlungen
   GROUP BY DBID
) AS AuszahlungReisekosten

ON Gehaltsdb.Schema.Gehaltsdb_Auszahlung.DBID = AuszahlungReisekosten.DBID

GROUP BY Gehaltsdb.Schema.Gehaltsdb_Auszahlung.DBID, Name, Vorname, Gehaltsdb.Schema.Gehaltsdb_Auszahlung.Jahr, Reisekosten

Etwas komplexer würde dies dann so aussehen: SELECT DISTINCT Gehaltsdb.Schema.Gehaltsdb_Auszahlung.PersNr, Name, Vorname, Gehaltsdb.Schema.Gehaltsdb_Auszahlung.Jahr, COUNT(Betrag) AS "Anzahl Abrechnungen", Sum(Betrag) AS Auszahlung, Nettogehalt AS "Gehalt", Reisekosten

FROM Gehaltsdb.Schema.Gehaltsdb_Auszahlung

INNER JOIN PersonalDB.Schema.Partner ON Gehaltsdb.Schema.Gehaltsdb_Auszahlung.PersNr = PersonalDB.Schema.Partner.PersNr

INNER JOIN (
   SELECT PersNr, SUM(Reisekosten) As Reisekosten
   FROM Gehaltsdb.Schema.Gehaltsdb_Kostenerstattungen
   WHERE (Jahr = '2009')
   GROUP BY PersNr
) AS tabReisekosten

ON Gehaltsdb.Schema.Gehaltsdb_Auszahlung.PersNr = tabReisekosten.PersNr

INNER JOIN (
   SELECT Gehalt_PersNr, SUM(Betrag) As Nettogehalt
   FROM Gehaltsdb.Schema.Gehaltsdb_Nettogehalt
   WHERE (Jahr = '2009')
   GROUP BY Gehalt_PersNr)
AS tabGehalt

ON Gehaltsdb.Schema.Gehaltsdb_Auszahlung.PersNr = tabGehalt.Gehalt_PersNr

WHERE Jahr = 2009
GROUP BY Gehaltsdb.Schema.Gehaltsdb_Auszahlung.PersNr, Name, Vorname, Gehaltsdb.Schema.Gehaltsdb_Auszahlung.Jahr, Nettogehalt, Reisekosten
ORDER BY PersNr;

Ein weiteres Beispiel: SELECT Unterabfrage.*, DB.SDaten.Name, DB.SDaten.BLZ, DB.Bankverb.Kontonummer, DB.Bankverb.Kontoinhaber

FROM (
   SELECT SDaten.ID, SDaten.Name, SDaten.Vorname, Adr.Strasse, Adr.Hausnummer, Adr.PLZ, Adr.Ort, Person.Geburtsdatum, PersDaten.Studienbescheinigung, PersDaten.Lohnsteuerkarte, PersDaten.Pauschalsteuer, PersDaten.Sozialversicherungsausweis, Kontakt.ID2, Kontakt.BankID, Typ.Typ

   FROM DB.SDaten
   INNER JOIN DB.Verb ON DB.SDaten.ID = DB.Verb.ID
   INNER JOIN DB.Typ ON DB.SDaten.ID = DB.Typ.ID
   INNER JOIN DB.Adresspool ON DB.SDaten.ID = DB.Adresspool.ID
   INNER JOIN DB.Adr ON DB.Adresspool.AdressID = DB.Adr.AdressID
   RIGHT JOIN DB.PersDaten ON DB.SDaten.ID = DB.PersDaten.ID
   INNER JOIN DB.Kontakt ON DB.SDaten.ID = DB.Kontakt.ID1 and DB.Kontakt.Typ = 'Bankverb') as Unterabfrage

INNER JOIN DB.SDaten on Unterabfrage.ID2 = DB.SDaten.ID
INNER JOIN DB.Bankverb on Unterabfrage.BankID = DB.Bankverb.BankID

WHERE (Unterabfrage.Name IS NOT NULL) AND (Unterabfrage.Typ = 'Mitarbeiter')

ORDER BY Unterabfrage.Name;

Neben SQL-Statements interessiere ich mich auch für den MSSQLServer.
Hier habe ich die Zertifizierung 70-432:
SQL

Wenn Sie Fragen, Hinweise, Kritik oder Anregungen haben, schreiben Sie mir doch einfach.

Marvin Nassowitz / www.nassowitz.de