Develop:SQLGrundlagen
Aus Hampas Wiki
Inhaltsverzeichnis |
Einführung in SQL
Daten/Tabellen definieren
Tabelle erstellen
Eine neue Tabelle wird mit dem Befehl "CREATE TABLE" erstellt
CREATE TABLE Tabellenname ( Attributname_1 Datentyp [NOT NULL], Attributname_2 Datentyp [NOT NULL], Attributname_n Datentyp [NOT NULL]);
Beispiel:
CREATE TABLE Kunden( KdNr NUMBER(9) NOT NULL, IDNr NUMBER(10) NOT NULL, Name VARCHAR(50) NOT NULL, Vorname VARCHAR(50) NOT NULL);
"NOT NULL" legt fest, dass das entsprechende Attribut keine Null-Werte enthalten darf.
Tabelle ändern
Muss ein Attribut einer bestehende Tabelle verändert oder neu hinzugefügt werden, geschieht das mit "ALTER TABLE".
Neue Attribute einfügen
ALTER TABLE Tabellenname ADD (Neuer_Attributname Datentyp [NOT NULL]);
Beispiel:
ALTER TABLE Kunden ADD (Adresse VARCHAR(20) NOT NULL);
Bestehende Attribute ändern
ALTER TABLE Tabellenname MODIFY (Bestehender_Attributname Datentyp [NOT NULL]);
Beispiel:
ALTER TABLE Kunden MODIFY (Adresse VARCHAR(25) NOT NULL);
Es ist zu beachten, dass die Länge eines Feldes nur soweit reduziert werden kann, dass bereits besehende Daten noch darstellen kann. Enthält ein Feld z.B. den Wert "Hampa", darf dieses Feld nicht kleiner fünf Zeichen gesetzt werden.
Tabelle indizieren
Eindeutiger Schlüssel definieren
Bei der Tabelleindizierung geht es darum, die Eindeutigkeit von Identifikationsschlüssel sicherzustellen. Wenn wir die vorhin erstelle Tabelle (Kunden) nehmen und aus den Feldern KdNr und IDNr einen Schlüssel bilden möchten, sieht das wie folgt aus.
CREATE UNIQUE INDEX ID_Kunde ON Kunden (KdNr, IDNr);
Vor jedem Einfügen einen neuen Datensatzes prüft nun die Datenbanksoftware, ob die Kombination aus KdNr und IDNr immer noch eindeutig ist. Ist dies nicht der Fall, wird ein Fehler ausgegeben und der Datensatz nicht gespeichert.
Einzelene Spalten indexieren
Wird beispielsweise häufig nach Kundennamen gesucht, kann die Spalte Name mit einem Index versehen werden, um die Abbrage zu beschleunigen.
CREATE INDEX ID_Name ON Kunden(Name);
Daten manipulieren
Darunter fallen die Aktionen wie das Speicher, Nachführen und löschen von Datensätzen.
Datensatz einfügen
Das Einfügen eines neuen Datensatzes kann mit dem Befehl INSERT erreicht werden.
INSERT INTO Kunden [(Attributname_1, Attributname_2)] VALUES (AttributWert_1, AttributWert_2);
Die Attributsliste gibt Auskunft darüber, welche Attribute in den neuen Datensatz geschrieben werden. Die Reihenfolge der Attributwerte muss mit der Reihenfolge der Attributnamen übereinstimmen. Falls keine Attributslite angegeben wird, muss die Reihenfolge der Attributwerte der Reihenfolge der Attribute bei der Tabellendefinition entsprechen.
Beispiel:
INSERT INTO Kunden (KdNr, IDNr, Name, Vorname) VALUES (23, 42, "Hampa", "Brügger");
Die Attributwerte können auch ein Reslutat einer Select-Abfrage sein.
Beispiel:
INSERT INTO Kunden (KdNr, IDNr, Name, Vorname) SELECT 24, IDNr, Name, Vorname) FROM Personen WHERE IDNr=987654;
In der Tabelle Personen wird die Person mit der IDNr=987654 gesucht. Das Resultat dieser Abfrage wird als neuer Datensatz in die Tabelle Kunde mit der KdNr=24 gespeichert. Achtung: Die Datentypen der einzelnen Attribute müssen zueinander kompatibel sein.
Datensätze nachführen
Bestehende Datensätze werden mit dem Befehl UPDATE nachgeführt.
UPDATE Tabellenname SET Attribut1=Ausdruck1, Attribut2=Ausdruck2,... [WHERE Bedingung für Update];
Beispiel:
UPDATE Kunden SET Status="2" WHERE Status="4"
Ändert bei allen Kunden den Status von 4 auf 2.
Auch bei UPDATE können die Attributswerte aus einer Abfrage stammen.
UPDATE Tabellenname SET (Attribut1, Attribut2,...) = (Abrage) [WHERE Bedingung für Update];
Beispiel:
UPDATE Kunden SET (ResponsibleID) = (SELECT PersID FROM Betreuer WHERE Name='Kaiser' AND Vorname='Stefan') WHERE KdNr=23;
Bei allen Datensätzen mit der KdNr=23 wird ins Feld Responsible die PersID geschrieben, die im Datensatz von Stefan Kaiser in der Tabelle Betreuer gefunden wird.
Datensatz löschen
Gelöscht wird mit dem Befehl DELETE
DELETE FROM Tabellenname [WHERE Bedingung für Löschung];
Beispiel:
DELETE FROM Kunden [WHERE KdNr=24];
Wird die WHERE-Klausel weggelassen, werden sämtliche Datensätze aus der Tabelle gelöscht.
Datenabrage (Query)
Eine Datenabfrage kann folgende Attribute enthalten.
'''SELECT''' ['''DISTINCT'''] {* | Attributsliste | mathematische Ausdrücke} Bezeichner
'''FROM''' Tabelle1 Bezeichner1, Tabelle2 Bezeichner2, ...
['''WHERE''' Bedingungen]
[<b>GROUP BY</b> Attributliste] ['''HAVING''' Bedingungen]
[<b>ORDER BY</b> Attributliste] ['''ASC''' | '''DESC'''];
- Mit SELECT kann angegeben werden, welche Attribute angezeigt werden sollen und wie diese allenfalls in Berechnungen und Fnktionen einzusetzen sind. Falls DISTINCT verwendet wird, werden mehrfach auftretende, identische Datensätze nur einmal angezeit.
- Mir FROM wird angegeben, aus welchen Tabellen Datensätze abgefragt beziehungsweise zu neuen Datensätzen kombiniert werden.
- Mit WHERE wird angegeben, welche Bedingungen ein Datensatz erfüllen muss, damit er weiterverarbeitet wird.
- Mit GROUP BY können Datensätze zu Gruppen zusammengefasst und mit peziellen Gruppenfunktionen weiterverarbeitet werden.
- HAVING gibt an, welche Bedingungen eine Gruppe aus Datensätzen erfüllen muss, damit sie weiterverarbeitet wird.
- Mit ORDER BY können die resultierenden Datensätze von der Ausgabe nach bestimmten Attributen auf- beziehungweise absteigend sortiert werden.
Einfache Abfrage
Die einfachste Abfrage ist die folgende:
SELECT * FROM Tabellenname;
Beispiel:
SELECT * FROM Kunden
Mit dieser Abfrage werden sämtliche Datensätze mit allen Attributen in der Tabelle Kunde angezeigt.
Anstelle des * können die gewünschten Attribute angegeben werden. Es können auch Berechnung ausgeführt und sogleich angezeigt werden
Beispiel:
SELECT KdNr, Name, Vorname, (Umsatz/100)*35 Umsatzforderung FROM Kunden
Es werden sämtliche Datensätze aus der Tabelle Kunden angezeigt. Es werden jedoch nur die Attribute KdNr, Name und Vorname angzeigt. Zusätzlich wird vom Wert im Feld Umsatz 35% berechnet und in der letzten Spalte ausgegeben. Die Spaltenüberschrift lautet Umsatzforderung. Hätte ich diese Bezeichnung weggelassen würde als Spaltentitel die Berechnungsformel ausgegeben.
Beispiel:
SELECT COUNT(*) Anzahl, MIN(Umsatz) Tiefster, MAX(Umsatz) Höchster FROM Kunden
COUNT, MIN und MAX sind Gruppenfunktionen. Die Ausgabe dieser Abfrage umfasst lediglich eine Zeile. Es werden die Anzahl der Datensätze ausgegeben sowie der höchste sowie der niedrigste Zahl im Attribut Umsatz.
Es kann vorkommen, dass in einer Tabelle ein Kunde mehrmals vorkommt (ich weiss, blödes Beispiel). Ich möchte aber bloss die Total-Anzahl verschiedener Kunden. Mit folgendem Befehl könnne "doppelte" Einträge ausgelassen werden.
Beispiel:
SELECT COUNT(DISTINCT KdNr) Verschieden_Kunden FROM Kunden
Abfragen mit Bedingungen
Meistens benötigt man aber nicht alle Datensätze bei einer Abfrage. Durch das Schlüsselwort WHERE können wir die Auswahl einschränken.
Beispiel:
SELECT KdNr, IDNr, Name, Vorname FROM Kunden WHERE IDNr=98765;
Es werden nur die Kunden mit der IDNr. 98765 angzeigt.
Mit den Schlüsselworten AND und OR sowie der Negation NOT können alle möglichen Bedingungen konstruiert werden.
Beispiel:
SELECT KdNr, IDNr, Name, Vorname FROM Kunden WHERE Umsatz >= 30000 AND (IDNr=12 OR IDNr=25) AND NOT (Name='Brügger');
Es werden alle Datensätze angezeigt, die einen Umsatz grösser gleich 30'000 aufweisen UND die IDNr entweder 12 oder 25 ist und der Name NICHT Brügger lautet.
Achtung! Es ist unbedingt darauf zu achten, dass die Klammern, wenn nötigt, gesetzt werden, da sonst die Bedinung völlig ander lauten kann.
Datensätze sortieren
Vielfach ist es sinnvoll, dass man Resultate von Abfragen sortiert. Allein schon wegen der Lesbarkeit. Es mach z.B. viel mehr Sinn, eine Adresseliste nach Namen sortiert auszugeben, als wild durcheinander.
SELECT * FROM Kunden ORDER BY Name;
Ausgabe nach alphabetisch, aufsteigend nach Name.
Selbstverständlich kann das Ganze auch absteigend sortiert werden.
SELECT * FROM Kunden ORDER BY Name '''DESC''';
Es können auch Sortierkriterien kombiniert werden.
SELECT * FROM Kunden ORDER BY Name '''DESC''', Vorname '''ASC''';
Datensätze gruppieren
Die Funktionen COUNT, MIN und MAX habe ich weiter oben bereits erklärt. Weitere sind SUM und AVG
- SUM bildet die die Summe der Attribute.
- AVG ermittelt den Mittelwert.
All diese Funktionen beziehen sich auf eine Datensatzgruppe und geben dadurch pro gebildete Gruppe genau einen Wert zurück.
Beispiel:
SELECT KdNr, COUNT(KdNr) Anzahl, AVG(Umsatz) Umsatz FROM Kunden GROUP BY KdNr ORDER BY KdNr DESC;
Die Datensätze werden nach KdNr gruppiert und jeweils die Anzahl pro KdNr ausgegeben. Ausserdem wird der Mittelwert des Umsatzes innerhalb der einzelnen KdNr-Gruppen ausgegeben.
Beispiel:
SELECT KdNr, COUNT(KdNr) Anzahl FROM Kunden WHERE Umsatz=>30000 GROUP BY KdNr HAVING COUNT(KdNr)>1;
Es werden sämtliche Datensätze gesucht, die einen Umsatz >= 30000 aufweisen. Diese werden dann nach KdNr gruppiert. Alle Datensäte, die weniger als zwei Einträge haben, werden zum Schluss ebenfalls verworfen. Auf HAVING muss immer eine Gruppenfunktion folgen.
Verschachtelte Abfragen (Subqueries)
Es kommt immer wieder vor, dass eine Abfrage auf das Ergebnis einer vorgängig gemachten Abfrage aufbaut.
SELECT Attribut1, Attribut2
FROM Tabelle1
WHERE Attribut1 IN (SELECT Attribut1
FROM Tabelle2
WHERE Attribut3 = (SELECT Attribut3
FROM Tabelle3
WHERE Attribut4 = 'ABC'
AND Attribut5 = 'CDE'))
ORDER BY Attribut2;
Tabellen verknüpfen (Joining)
Bisher habe ich bloss gezeigt, wie man Attribute einer einzelnen Tabelle anzeigen kann. Vielleicht möchte man nun aber Attribute von verschiedenen Tabellen in der Ergebnisliste anzeigen. Das wird über Tabellenverknüpfung erreicht.
SELECT * FROM Tabelle1, Tabelle2;
Mit dieser Abfrage werden aber lediglich der Inhalt der beiden Tabellen gemischt, was wahrscheinlich nicht allzuviel Sinn macht.
Die Abfrage für die Ergebnistabelle soll nun so erstellt verden, dass nur Werte angezeit werden, die auch zusammengehören.
Beispiel:
SELECET KdNr, Name, Vorname, Umsatz FROM Kunden, Umsaetze WHERE Kunden.IDNr = Umsaetze.IDNr;
Weiterführende Links: