930 likes | 1.15k Views
Seite 2 . Was ist SQL?. SQL erblickte Ende der 70er Jahre bei IBM in Kalifornien das Licht der Welt SQL steht f
E N D
2. Seite 2 Was ist SQL? SQL erblickte Ende der 70er Jahre bei IBM in Kalifornien das Licht der Welt
SQL steht für Structured Query Language –zu deutsch : strukturierte Abfragesprache
SQL ist nichtprozedural, das bedeutet »was« statt »wie«.SQL beschreibt, welche Daten abzurufen, zu löschen oder einzufügen sind und nicht, wie das zu geschehen hat
Das bekannteste Modell zur Datenspeicherung ist die relationale Datenbank, die auf einen Artikel Dr. E. F. Codds von 1970 zurückgeht
3. Seite 3 Was ist SQL? SQL ist die De-facto-Standardsprache, mit der sich Daten aus relationalen Datenbanken abrufen und dort manipulieren lassen
SQL ist eine echte plattformunabhängige und produktübergreifende Sprache
Die eigentliche Verwaltung übernimmt das Relationale Datenbank-managementsystem (RDBMS), das über SQL angesprochen wird
SQL wird verwendet als interpretierende und eingebundene (embedded) Sprache
4. Seite 4 Goldene Regeln zu relationalen Datenbanken Verwaltung der Datenbanken vollständig über relationale Fähigkeiten
Datenbanken und Inhalte auf derselben logischen Ebene wie die Daten selbst
Operationen für Einfügen, Aktualisieren, Löschen und Abfragen ganzer Tabellen
Abfragesprache(n) mit vollständigen Befehlssatz für Datendefinition, Manipulation, Integritätsregeln, Autorisierung und Transaktionen
Unumgehbare Integritätsregeln
Jeder Wert auffindbar durch Kombination von Tabellenname, Primärschlüssel und Spaltenname
5. Seite 5 Goldene Regeln zu relationalen Datenbanken Nullwerte durchgängig gleich behandelt als unbekannte oder fehlende Daten und unterschieden von Standardwerten
Alle Sichten, die theoretisch aktualisiert werden können, lassen sich vom System aktualisieren
Physikalische und logische Datenunabhängigkeit
Verteilungsunabhängigkeit
6. Seite 6 Was macht man also mit SQL? Struktur einer Datenbank modifizieren
Einstellungen der Systemsicherheit ändern
Benutzerberechtigungen für Datenbanken oder Tabellen einrichten
Datenbank nach Informationen abfragen
Inhalt einer Datenbank aktualisieren
7. Seite 7 Bekannte SQL-Implementierungen Microsoft Access
Microsoft Query
Microsoft SQL-Server
ODBC
Oracle
Delphi
Sybase
DB2
Informix
8. Seite 8 SQL und der Lauf der Zeit - 86, 89 SQL wurde im Jahre 1986 als ANSI-Standard formuliert
Der ANSI-1989-Standard (oder SQL-89) definiert innerhalb eines Anwendungsprogramms drei Typen der Kommunikation mit SQL:
Modulsprache
Eingebettetes SQL
Direkter Aufruf Modulsprache
Arbeitet in Programmen mit Prozeduren. Eine Anwendung kann diese Prozeduren aufrufen und Werte über Parameter aus den Prozeduren zurückerhalten
Eingebettetes SQL
Verwendet SQL-Anweisungen, die in den eigentlichen Programmcode eingebettet sind. Diese Methode erfordert oft einen Präcompiler, der die SQL-Anweisungen verarbeitet. Der Standard definiert Anweisungen für Pascal, FORTRAN, COBOL und PL/1
Direkter Aufruf
Schnittstellen auf Aufrufebene dürften dem Anwendungsprogrammierer nicht neu sein. Wenn man mit ODBC arbeitet, füllt man zum Beispiel einfach eine Variable mit der SQL-Anweisung und ruft eine Funktion auf, um die SQL-Anweisung an die Datenbank zu schicken. Fehler oder Ergebnisse erhält man über Aufrufe anderer Funktionen, die speziell für diese Zwecke vorgesehen sind. Ergebnisse werden über das sogenannte Binden von Variablen zurückgegeben.
Modulsprache
Arbeitet in Programmen mit Prozeduren. Eine Anwendung kann diese Prozeduren aufrufen und Werte über Parameter aus den Prozeduren zurückerhalten
Eingebettetes SQL
Verwendet SQL-Anweisungen, die in den eigentlichen Programmcode eingebettet sind. Diese Methode erfordert oft einen Präcompiler, der die SQL-Anweisungen verarbeitet. Der Standard definiert Anweisungen für Pascal, FORTRAN, COBOL und PL/1
Direkter Aufruf
Schnittstellen auf Aufrufebene dürften dem Anwendungsprogrammierer nicht neu sein. Wenn man mit ODBC arbeitet, füllt man zum Beispiel einfach eine Variable mit der SQL-Anweisung und ruft eine Funktion auf, um die SQL-Anweisung an die Datenbank zu schicken. Fehler oder Ergebnisse erhält man über Aufrufe anderer Funktionen, die speziell für diese Zwecke vorgesehen sind. Ergebnisse werden über das sogenannte Binden von Variablen zurückgegeben.
9. Seite 9 SQL und der Lauf der Zeit - 92 Der Standard ANSI 1992 (SQL-92) setzte sich als internationaler Standard durch und erfuhr drei Erweiterungen (CLI-95, PSM-96, OLB-98)
Es wurden drei Ebenen des Sprachumfangs eingeführt:
Entry
Intermediate
Full
Zu den neu eingeführten Merkmalen gehören:
Verbindungen zu Datenbanken
rollbare Cursor(en)
dynamisches SQL
Outer Joins Vor der Einführung von dynamischem SQL setzte man vorrangig eingebettetes SQL in Anwendungsprogrammen ein. Eingebettetes SQL - das man auch weiterhin verwendet - arbeitet mit statischem SQL. Die SQL-Anweisung wird dabei in die Anwendung eingebaut und läßt sich zur Laufzeit nicht ändern. Vom Prinzip her kann man das mit dem Unterschied zwischen Compiler und Interpreter vergleichen. Eingebettetes SQL weist zwar eine gute Leistungsbilanz auf, ist aber weniger flexibel und entspricht nicht immer den heutigen Anforderungen der sich ändernden Büroumgebungen. Auf dynamisches SQL gehen wir in Kürze ein.
Mit dynamischem SQL lassen sich SQL-Anweisungen zur Laufzeit vorbereiten. Dynamisches SQL schneidet hinsichtlich der Leistung zwar schlechter ab als eingebettetes SQL, bietet aber dem Anwendungsentwickler (und Benutzer) ein größeres Maß an Flexibilität. Schnittstellen auf Aufrufebene wie ODBC oder die DB-Bibliothek von Sybase sind Beispiele für dynamisches SQL.Vor der Einführung von dynamischem SQL setzte man vorrangig eingebettetes SQL in Anwendungsprogrammen ein. Eingebettetes SQL - das man auch weiterhin verwendet - arbeitet mit statischem SQL. Die SQL-Anweisung wird dabei in die Anwendung eingebaut und läßt sich zur Laufzeit nicht ändern. Vom Prinzip her kann man das mit dem Unterschied zwischen Compiler und Interpreter vergleichen. Eingebettetes SQL weist zwar eine gute Leistungsbilanz auf, ist aber weniger flexibel und entspricht nicht immer den heutigen Anforderungen der sich ändernden Büroumgebungen. Auf dynamisches SQL gehen wir in Kürze ein.
Mit dynamischem SQL lassen sich SQL-Anweisungen zur Laufzeit vorbereiten. Dynamisches SQL schneidet hinsichtlich der Leistung zwar schlechter ab als eingebettetes SQL, bietet aber dem Anwendungsentwickler (und Benutzer) ein größeres Maß an Flexibilität. Schnittstellen auf Aufrufebene wie ODBC oder die DB-Bibliothek von Sybase sind Beispiele für dynamisches SQL.
10. Seite 10 SQL und der Lauf der Zeit - 1999 Der aktuelle Standard heißt SQL:1999
Zwei Faktoren der geänderten Namensgebung:
Internationalität (ISO/ANSI)
Y2K-Problem
Zu den neu eingeführten Merkmalen gehören unter anderem:
Neue Datentypen (Endlich Boolean!)
Benutzerdefinierte Typen
Große Objekttypen
Neue Möglichkeiten in der Datenkonvertierung
11. Seite 11 Groß- und Kleinschreibung Beachten Sie, dass Groß- und Kleinschreibung in der Syntax von SQL keine Rolle spielt.
Beachten Sie aber auch, dass es SQL-Dialekte gibt, die beim Suchen von Daten Groß- und Kleinschreibung unterscheiden, während andere dies wiederum nicht tun!
12. Seite 12 Die Syntaxdiagramme dieser Schulung Schlüsselwort: CREATE(Großgeschrieben.)
Leerstelle: ?(Zur besseren Erkennung als Kästchen dargestellt.)
Platzhalter: Feld(Normale Schreibweise.)
13. Seite 13 Die Syntaxdiagramme dieser Schulung Optionale Angabe: [ ](Die eckigen Klammern werden nicht geschrieben!)
Wiederholung: […](Eine Wiederholung bezieht sich auf die übergeordnete Klammer.)
Gruppe: { }(Zur Verdeutlichung einer Gruppierung. Die Klammern werden nicht geschrieben.)
Standardwert (Default): ASC(Unterstrichen.)
Entweder oder: |(Sich ausschließende Möglichkeiten werden durch einen senkrechten Strich getrennt.)
14. Seite 14 Daten abfragen mit SELECT Die einfache SELECT-Anweisung dient zum Abfragen von Daten in einer Tabelle:
Syntax:
SELECT?*|Feld[,?Feld[…]]?FROM?Tabellenname;
Beispiele:
SELECT * FROM Kunde;
SELECT Vorname, Name FROM Kunde;
15. Seite 15 Daten sortieren mit ORDER BY Die ORDER BY-Anweisung sortiert Abfragen auf- oder absteigend nach einem oder mehreren Feldern:
Syntax:
SELECT?*|Feld[,?Feld[…]]?FROM?TabellennameORDER?BY?Feld?[ASC|DESC][,?Feld?[ASC|DESC][…]];
Beispiele:
SELECT * FROM BestellungORDER BY Wann DESC;
SELECT Vorname, Name, TelefonNr FROM KundeORDER BY Name, Vorname;
16. Seite 16 Daten filtern mit DISTINCT Die DISTINCT-Anweisung unterdrückt die Anzeige von mehrfach vorkommenden Werten:
Syntax:
SELECT?[DISTINCT]?*|Feld[,?Feld[…]]?FROM?TabellennameORDER?BY?Feld?[ASC|DESC][,?Feld?[ASC|DESC][…]];
Beispiele:
SELECT DISTINCT TelefonNrFROM BestellungORDER BY TelefonNr ASC;
SELECT DISTINCT TelefonNr, WannFROM BestellungORDER BY TelefonNr ASC; ALL ansprechen.ALL ansprechen.
17. Seite 17 Operatoren - Übersicht Mit Operatoren gibt man innerhalb eines Ausdrucks an, wie die Daten entsprechend der spezifizierten Bedingungen abzurufen sind.
In SQL unterscheidet man sechs Gruppen von Operatoren:
Arithmetische Operatoren
Vergleichsoperatoren
Zeichenoperatoren
Logische Operatoren
Mengenoperatoren
Odds and ends: Verschiedene Operatoren
18. Seite 18 Operatoren – Arithmetische Die folgenden arithmetischen Operatoren gibt es in SQL:
+ Addition
- Subtraktion
* Multiplikation
/ Division
% Modulo
19. Seite 19 Operatoren – Arithmetische: + - * / Die Grundrechenarten werden folgendermaßen angewendet:
Beispiele:
SELECT Pizza, Groesse, Preis, Preis*1.2FROM PizzaGroesseORDER BY Groesse;
SELECT Pizza, Groesse, Preis, Groesse-2FROM PizzaGroesseORDER BY Groesse;
Zahlenangaben werden amerikanisch dargestellt. Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
20. Seite 20 Inkognito: Alias (Spalten umbenennen) Um die teilweise merkwürdige Namensgebung errechneter Spalten zu beheben, kann man einen Namen für das Ergebnis errechneter Spalten festlegen.
Die Syntax variiert jedoch je nach Umgebung.
Syntax (Variante 1):
[(]ArithmetischerAusdruck[)]?Name
Syntax (Variante 2):
[(]ArithmetischerAusdruck[)][?]=[?]Name
Syntax (Variante 3):
[(]ArithmetischerAusdruck[)]?ALIAS?Name
Syntax (Variante 4):
[(]ArithmetischerAusdruck[)]?AS?Name Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
21. Seite 21 Inkognito: Alias (Spalten umbenennen) Beispiele:
SELECT Pizza, Groesse, Preis, Preis*2.5 AS EuroNeupreisFROM PizzaGroesseORDER BY Groesse;
SELECT Pizza, Groesse, Preis, (Groesse-2) AS SpargroesseFROM PizzaGroesseORDER BY Groesse;
SELECT Pizza, Groesse, -Preis AS Gutschrift FROM PizzaGroesseORDER BY Preis DESC, Pizza, Groesse; Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
22. Seite 22 Operatoren – Arithmetische: % (Modulo) Der Operator Modulo führt eine Division durch und liefert den Rest statt des normalen Ergebnisses!
Zu beachten ist, dass Access statt des Prozentzeichens den Operator MOD verwendet.
Beispiel:
SELECT Pizza, Groesse, Preis, Groesse MOD 10 AS AbweichungVonDezimeternFROM PizzaGroesseORDER BY Groesse; Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
23. Seite 23 Daten filtern mit WHERE Die WHERE-Anweisung filtert selektierte Daten nach Kriterien:
Syntax:
SELECT?[DISTINCT]?*|[DISTINCT]?Feld[,[DISTINCT]?Feld[…]]?FROM?TabellennameWHERE?Kriterium[?LogischerOperator?Kriterium[…]]ORDER?BY?Feld?[ASC|DESC][,?Feld?[ASC|DESC][…]];
Der Aufbau eines Kriteriums:Als Kriterium wird ein relevantes Feld durch einen Operator mit den gewünschten Daten angegeben.(Genauer sehen wir dies bei den folgenden Operatoren.) Schreibweise eines Datums: in Rauten eingeschlossen und „amerikanisch“ notiert, also in der Reihenfolge Monat/Tag/Jahr; Uhrzeiten in 12-Stunden-Angabe.
Schreibweise eines Datums: in Rauten eingeschlossen und „amerikanisch“ notiert, also in der Reihenfolge Monat/Tag/Jahr; Uhrzeiten in 12-Stunden-Angabe.
24. Seite 24 Operatoren – Vergleichsoperatoren Vergleichsoperatoren sind umgangssprachlich:
Unter / vor / weniger als
Bis / frühestens / höchstens
Gleich / genau soviel wie / exakt
Ab / spätestens / mindestens
Über / nach / mehr als
Nicht (gleich) / ungleich In der EDV bedeutet das:
< kleiner als
<= kleiner (oder) gleich
= gleich
>= größer (oder) gleich
> größer als
<> ungleich (auch !=) Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
25. Seite 25 Operatoren – Vergleichsoperatoren Beispiele:
SELECT Vorname, Name FROM KundeWHERE Name='Wahrendorf';
SELECT DISTINCT TelefonNr FROM BestellungWHERE Wann>=#03/20/2001#ORDER BY TelefonNr;
Wie Sie hoffentlich erkennen können, werden Texte in einfache Anführungszeichen eingeschlossen.(Ein Anführungszeichen im Text wird durch zwei einfache dargestellt.)
Datums- und Zeitangaben werden in Rauten eingeschlossen und in amerikanischer Schreibweise dargestellt. Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
26. Seite 26 Operatoren – Zeichenoperatoren Zeichenoperatoren sind für den Umgang mit Zeichenfolgen (also Namen o.ä.) gedacht:
|| Verkettung von Zeichenfolgen
LIKE Suchen nach Textmustern mit Platzhaltern:
% Platzhalter für beliebig viele Zeichen
_ Platzhalter für genau ein Zeichen
ESCAPE Definiert eine Maskierung für das Suchen eines Prozentzeichens Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
27. Seite 27 Operatoren – Zeichenoperatoren: Verkettung Access verwendet für die Textverkettung das „kaufmännische Und“ (&):
Beispiel:
SELECT Name & ', ' & Vorname AS KundennameFROM KundeORDER BY Name, Vorname; Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
28. Seite 28 Operatoren – Zeichenoperatoren: LIKE Syntax:
Feld?[NOT]?LIKE?' Muster '
Access verwendet DOS-Platzhalter für LIKE:
% wird ersetzt durch *
_ wird ersetzt durch ? Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
29. Seite 29 Operatoren – Zeichenoperatoren: LIKE Beispiele:
SELECT Vorname, Name FROM KundeWHERE Name>='M??er' ORDER BY Name, Vorname;
SELECT Vorname, Name FROM KundeWHERE Name LIKE '*dorf'ORDER BY Name, Vorname;
SELECT Vorname, Name, TelefonNr FROM KundeWHERE TelefonNr LIKE '*850???' ORDER BY Name, Vorname;
SELECT Vorname, Name, TelefonNr FROM KundeWHERE Anschrift NOT LIKE '*Benzstraße*' ORDER BY Name, Vorname; Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
30. Seite 30 Operatoren – Logische Operatoren Logische Operatoren sind hauptsächlich für die Verkettung verschiedener Kriterien gedacht, außer der Negation:
AND Alle Kriterien müssen zutreffen
OR Mindestens ein Kriterium muss zutreffen
NOT Negation, Verkehrung ins Gegenteil(Ist bereits bei LIKE benutzt worden.) Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
31. Seite 31 Operatoren – Logische Operatoren Beispiele:
SELECT Vorname, Name, TelefonNr, Anschrift FROM KundeWHERE Vorname='Sabine' AND Name='Mustermann'ORDER BY Name, Vorname;
SELECT Pizza, Groesse, Preis, Groesse - 10 AS Ueber10Zentimeter FROM PizzaGroesseWHERE Groesse>=10 AND Groesse<20ORDER BY Groesse;
SELECT Name FROM ZutatWHERE Name LIKE 'B*' OR Name LIKE 'S*' AND Name<>'Salami'ORDER BY Name; Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
32. Seite 32 Operatoren – Andere: BETWEEN Mit dem BETWEEN-Operator (also: zwischen) können Sie sich so manches AND sparen.
Syntax:
Feld?[NOT]?BETWEEN?[ ' ] Muster [ ' ]?AND?[ ' ] Muster [ ' ]
Als Muster können Sie Angaben wie bei LIKE verwenden oder Literale (konstante Ausdrücke)
Beachten Sie, dass BETWEEN offene Intervalle bildet, d.h. die erlaubten Werte liegen eben nicht zwischen Start- und Endwert, sondern letztere sind inbegriffen Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
33. Seite 33 Operatoren – Andere: BETWEEN Beispiele:
SELECT Durchmesser FROM GroesseWHERE Durchmesser BETWEEN 16 AND 32ORDER BY Durchmesser;
SELECT Bezeichnung, Durchmesser, Extrapreis FROM GroesseWHERE Extrapreis BETWEEN 1 AND 2ORDER BY Extrapreis DESC;
SELECT Name FROM ZutatWHERE Name BETWEEN 'S*' AND 'T*'ORDER BY Name ASC;
Und was ist mit T?
SELECT Name FROM ZutatWHERE Name>='s' AND Name<'u'ORDER BY Name; Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
34. Seite 34 Operatoren – Andere: IN Mit dem IN-Operator (übersetzt etwa: enthalten in) können Sie sich so manches OR sparen.
Syntax:
Feld?[NOT]?IN?([ ' ] Wert [ ' ],?[ ' ] Wert [ ' ][,?[ ' ] Wert [ ' ][…]])
Sie dürfen nur Literale, also keine Muster verwenden Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
35. Seite 35 Operatoren – Andere: IN Beispiele:
SELECT * FROM KundeWHERE Name IN ('Mustermann', 'Beispiel');
SELECT * FROM GroesseWHERE Durchmesser IN (16, 18, 20, 22); Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
36. Seite 36 Operatoren – Mengenoperatoren Abfragen geben eine Menge (nicht umgangssprachlich gemeint) von Datensätzen zurück. Mit den Mengenoperatoren kann man diese Mengen miteinander kombinieren:
UNION Zusammenfügen von Mengen ohne Duplikate
UNION ALL Zusammenfügen von Mengen mit Duplikaten
INTERSECT Bildet die Schnittmenge (Übereinstimmung) zweier Abfragen
MINUS Differenz zweier Abfragen(Datensätze der ersten Abfrage, die nicht in der zweiten enthalten sind.) Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
37. Seite 37 Operatoren – Mengen: UNION, UNION ALL Beispiele:
SELECT Name FROM Zutat WHERE Name LIKE 'M*' OR Name LIKE '*N'UNION ALLSELECT Name FROM Zutat WHERE Name LIKE 'S*'ORDER BY Name;
SELECT Name FROM Zutat WHERE Name LIKE 'M*' OR Name LIKE '*N'UNIONSELECT Name FROM Zutat WHERE NAME LIKE 'S*'ORDER BY Name; Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
38. Seite 38 Operatoren – Mengen: INTERSECT, MINUS Beispiele:
SELECT Name FROM Zutat WHERE Name LIKE 'M*' OR Name LIKE '*N'INTERSECTSELECT Name FROM Zutat WHERE Name LIKE 'S*'ORDER BY Name;
SELECT Name FROM Zutat WHERE Name LIKE 'M*' OR Name LIKE '*N'MINUSSELECT Name FROM Zutat WHERE Name LIKE 'S*'ORDER BY Name;
INTERSECT und MINUS werden von Access nicht unterstützt(Access arbeitet mit INNER JOIN, bzw. LEFT / RIGHT JOIN) Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
39. Seite 39 Funktionen - Übersicht Mit Funktionen kann man in SQL auch Daten filtern, Berechnungen anstellen, Daten gruppieren usw.
In SQL unterscheidet man sechs Gruppen von Funktionen:
Aggregatfunktionen
Arithmetische Funktionen
Zeichenfunktionen
Umwandlungsfunktionen
Datums- und Zeitfunktionen
Odds and ends: Verschiedene Funktionen
40. Seite 40 Funktionen - Aggregatfunktionen SQL kennt die folgenden grundlegenden Aggregatfunktionen:
COUNT Datensätze zählen
SUM Feld aufsummieren
AVG (Average) Durchschnitt eines Feldes bilden
MAX Maximalen Wert eines Feldes finden
MIN Minimalen Wert eines Feldes finden
VARIANCE Varianz eines Feldes errechnen (VAR in Access)
STDEV (Standard deviation) Standardabweichung eines Feldes errechnen
41. Seite 41 Funktionen - Aggregatfunktionen Beispiele:
SELECT COUNT(Name) AS AnzahlPizzenFROM Pizza;
SELECT COUNT(*) AS TeurePizzenFROM PizzaGroesseWHERE Preis>=16;
SELECT SUM(Preis) AS AlleZwanzigerFROM PizzaGroesseWHERE Groesse=20;
42. Seite 42 Funktionen - Aggregatfunktionen Beispiele:
SELECT AVG(Wann) AS WannDurchschnittFROM Bestellung;
SELECT AVG(Extrapreis) AS ExtraDurchschnittFROM Groesse;
SELECT MAX(Durchmesser) AS MaximalDurchmesserFROM Groesse;
43. Seite 43 Funktionen - Aggregatfunktionen Beispiele:
SELECT MIN(Bezeichnung) , MAX(Durchmesser), MIN(Extrapreis)FROM Groesse;
SELECT AVG(Extrapreis) AS Durchschnitt, VAR(Extrapreis) AS Streuung, STDEV(Extrapreis) AS StdAbweichungFROM Groesse;
44. Seite 44 Funktionen - Arithmetische Die meisten SQL-Implementierungen kennen die folgenden arithmetischen Funktionen (wenn auch teilweise unter anderem Namen):
ABS Absolutwert einer Zahl
CEIL (ceiling) Gleiche oder größere ganze Zahl finden
FLOOR Gleiche oder kleinere ganze Zahl finden
COS, COSH, SIN, SINH, TAN, TANH
EXP Potenziert die Eulersche Konstante mit einer Zahl
LN, LOG
MOD (Modulo – bereits bekannt) Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
45. Seite 45 Funktionen - Arithmetische POWER Potenzierung xy
SIGN Vorzeichen einer Zahl ermitteln
SQRT(square root) Quadratwurzel einer Zahl Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
46. Seite 46 Funktionen - Arithmetische Beispiele:
SELECT ABS(-2) AS ImmerPositiv;
SELECT Durchmesser, EXP(Durchmesser) AS EulerscheMegaPizza FROM Groesse;
SELECT Durchmesser, LOG(Durchmesser) AS LogarithmischePizza FROM Groesse;
SELECT SQR(Durchmesser), SQR(ABS(Durchmesser-10)) FROM Groesse; Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
47. Seite 47 Funktionen - Zeichenfunktionen Ein SQL-Dialekt sollte die folgenden grundlegenden Zeichenfunktionen kennen:
CHR Zeichen nach Code (abhängig von der Datenbank)
CONCAT Texte verketten
INITCAP Erstes Zeichen eines Wortes groß, Rest klein
LOWER Nur Kleinschreibung
UPPER Nur Großschreibung
RCAP / LCAP Auffüllen mit Zeichen Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
48. Seite 48 Funktionen - Zeichenfunktionen RTRIM / LTRIM Leerzeichen rechts / links entfernen
REPLACE Ersetzen von Textteilen durch andere
SUBSTR Teil einer Zeichenfolge extrahieren
TRANSLATE Ersetzen von Zeichen eines Textes durch andere
INSTR Suchen eines Teiltextes in einem Text
LENGTH Länge eines Textes ermitteln Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
49. Seite 49 Funktionen - Zeichenfunktionen Beispiele:
SELECT CHR(49);
SELECT LCASE(Vorname), UCASE(Name) FROM Kunde;
SELECT RTRIM(Vorname) FROM Kunde;
SELECT MID(Vorname,2,4) FROM Kunde;
SELECT Name, Vorname, LEFT(TelefonNr, INSTR(TelefonNr, '-')-1) AS Vorwahl, RIGHT(TelefonNr,LEN(TelefonNr)- INSTR(TelefonNr, '-')) AS RufnummerFROM Kunde ORDER BY Name, Vorname; Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
50. Seite 50 Funktionen - Umwandlungsfunktionen Ihre SQL-Umgebung sollte mindestens folgende Umwandlungen vornehmen können:
TO_CHAR Zahlen in Zeichenfolgen umwandeln
TO_NUMBER Zeichenfolgen in Zahlen umwandeln Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
51. Seite 51 Funktionen - Umwandlungsfunktionen Beispiele:
SELECT CSTR(Durchmesser) FROM Groesse;
SELECT FORMAT(Durchmesser*100, '#,##0.00 mikrometer') AS DäumlingDurchmesserFROM Groesse; Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
52. Seite 52 Funktionen – Zeit- und Datumsfunktionen ADD_MONTHS Ganze Monate addieren zu Datum
LAST_DAY Letzten Monatstag zu einem Datum ermitteln
MONTHS_BETWEEN Differenz zweier Daten in Monaten
NEW_TIME Umrechnung in andere Zeitzone
NEXT_DAY Datum des nächsten angegebenen Wochentags
SYSDATE Angabe der Systemzeit Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
53. Seite 53 Funktionen - Verschiedene Ein SQL-Dialekt sollte die folgenden grundlegenden Funktionen kennen:
GREATEST Größtes Element einer Aufzählung
LEAST Kleinstes Element einer Aufzählung
USER Benutzername ermitteln Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!Auch die Schreibweise der arithmetischen Operationen ist amerikanisch, d.h. Punkt statt Komma!
54. Seite 54 Klauseln - Übersicht Die meistgenutzten Klauseln – WHERE und ORDER BY- haben Sie bereits kennen gelernt – hier sind sie alle:
WHERE
ORDER BY
GROUP BY
HAVING
STARTING WITH
55. Seite 55 Klauseln – GROUP BY Die GROUP BY-Klausel ist besonders sinnvoll mit den Aggregatfunktionen COUNT, SUM, AVG, MIN und MAX, die Sie ja bereits kennen.
Syntax:
SELECT?{Feld|Funktion(Feld)[,…]}?FROM?Tabellenname[WHERE?Kriterium[?LogischerOperator?Kriterium[…]]]GROUP?BY?Feld[,?Feld[…]]
Die Klausel GROUP BY erledigt die Sortierung meistens (ORDER BY) gleich mit
56. Seite 56 Klauseln – GROUP BY Beispiel:
SELECT Pizza, COUNT(Zutat) AS Zutaten FROM PizzaBelagGROUP BY Pizza;
SELECT BestellNr, COUNT(PosNr) AS Positionen, AVG(Groesse) AS DurchschnittsgroesseFROM PositionGROUP BY BestellNr;
57. Seite 57 Klauseln – HAVING Die HAVING-Klausel erweitert die GROUP BY-Klausel. WHERE ist aber weiterhin möglich; der feine Unterschied folgt:
Syntax:
SELECT?{Feld|Funktion(Feld)[,…]}?FROM?Tabellenname[WHERE?Kriterium[?LogischerOperator?Kriterium[…]]]GROUP?BY?Feld[,?Feld[…]]HAVING?Kriterium[?LogischerOperator?Kriterium[…]]
Bei HAVING sind Aggregatfunktionen möglich, bei WHERE nicht!
WHERE bezieht sich auf einzelne Datensätze, HAVING auf Gruppen!
58. Seite 58 Klauseln – HAVING Beispiele:
SELECT BestellNr, COUNT(PosNr) AS Posten, AVG(Groesse) AS DurchschnittsgroesseFROM PositionGROUP BY BestellNr HAVING AVG(Groesse)>=20;
SELECT BestellNr, COUNT(PosNr) AS Posten, AVG(Groesse) AS DurchschnittsgroesseFROM Position WHERE AVG(Groesse>=20) GROUP BY BestellNr;
Autsch!
SELECT BestellNr, COUNT(PosNr) AS Posten, AVG(Groesse) AS DurchschnittsgroesseFROM Position WHERE Groesse>=20 GROUP BY BestellNr; Hier ist einmal die Durchschnittsgröße pro Posten und einmal die Durchschnittsgröße per Gruppe gemeint!Hier ist einmal die Durchschnittsgröße pro Posten und einmal die Durchschnittsgröße per Gruppe gemeint!
59. Seite 59 Klauseln – HAVING und IN Die Klauseln HAVING kann auch mit dem IN-Operator verwendet werden.
Beispiele:
SELECT Pizza FROM PizzaBelagGROUP BY Pizza, ZutatHAVING Zutat IN (10, 11, 51);
SELECT Pizza, MAX(Groesse) AS Maximalgroesse FROM PizzaGroesseGROUP BY Pizza HAVING Pizza IN (2, 3, 4)ORDER BY MAX(Groesse);
60. Seite 60 Klauseln – STARTING WITH Die STARTING WITH-Klausel funktioniert genauso wie der entsprechende LIKE-Operator und liefert die gleichen Ergebnisse:
Beispiel:
SELECT Vorname, Name FROM Kunde WHERE Name STARTING WITH 'P*';
61. Seite 61 Aufgaben 1.1 Finden Sie die Anzahl der Zutaten pro Pizza heraus, stellen Sie die größte Zutatenanzahl nach oben (sorgen Sie für eine durchgängig sinnvolle Sortierung)
SELECT Pizza, COUNT(Zutat) AS Zutatenanzahl FROM PizzaBelagGROUP BY PizzaORDER BY COUNT(Zutat) DESC, Pizza;
Finden Sie heraus, in welcher Maximalgröße Ihre verschiedenen Pizzen bestellt wurden
SELECT Pizza, MAX(Groesse) AS Maximalgroesse FROM PositionGROUP BY Pizza;
62. Seite 62 Aufgaben 1.2 Finden Sie die Pizzen heraus, die in der größten Größe die Sie haben, bestellt wurden
SELECT Pizza, Groesse FROM PositionGROUP BY Pizza, GroesseHAVING Groesse=32;
SELECT Pizza, Groesse FROM PositionGROUP BY Pizza, GroesseHAVING MAX(Groesse)=32;
Ermitteln Sie die Anzahl der bestellten Pizzen, deren Durchmesser höchstens24 cm betrug
SELECT COUNT(Groesse) FROM Position WHERE Groesse<=24;
63. Seite 63 Aufgaben 1.3 Ermitteln Sie, wie oft die Pizza 3 in jeder Bestellung auftauchte
SELECT BestellNr, COUNT(Pizza) FROM PositionGROUP BY Pizza, BestellNrHAVING PIZZA=3;
64. Seite 64 Anmerkungen zu einfachen SELECT-Anweisungen WHERE und ORDER BY gewöhnlich in Abfragen, die sich auf einzelne Zeilen beziehen
GROUP BY und HAVING gewöhnlich mit Aggregatfunktionen
65. Seite 65 SELECT über Tabellen Richtig sinnvoll wird SQL erst durch die Abfrage von Daten über verknüpfte Tabellen
Hier wird auch die Leistungsfähigkeit von SQL erst deutlich. Leider wird es dadurch nicht einfacher
66. Seite 66 SELECT über Tabellen – erster Versuch Beispiel:
SELECT Name, Vorname, BestellNr FROM Kunde, Bestellung;
Offensichtlich fehlt hier eine Anweisung, die beide Tabellen sinnvoll miteinander verknüpft
Ohne Anhaltspunkt verknüpft SQL jeden Datensatz der einen Tabelle mit jedem der anderen, man nennt das cross join (Überkreuz-Verknüpfung)
Man stelle sich das einmal mit mehr als zwei Tabellen vor…
67. Seite 67 SELECT über Tabellen – gleiche Feldnamen Beispiel:
SELECT Position.Pizza, PizzaGroesse.Pizza FROM Position, PizzaGroesse;
Zwar können so gleiche Feldnamen in den Tabellen unterschieden werden, aber das Ergebnis bleibt zunächst gleichermaßen unsinnig
68. Seite 68 SELECT über Tabellen – Verknüpfungen Eine Abfrage über mehr als eine einzelne Tabelle wird erst sinnvoll durch Verknüpfungen:
Inner joins
Cross joins
Equi join
Non equi join
Outer joins
Left join
Right join
Full join
69. Seite 69 SELECT über Tabellen – Equi joins Hiermit werden Tabellen verknüpft, bei denen die Inhalte (meistens) eines Feldes gleich sind:
Die Angabe der Tabelle ist nur bei gleichen Feldnamen notwendig
Beispiele:
SELECT Name, Vorname, BestellNr FROM Kunde, BestellungWHERE Kunde.TelefonNr=Bestellung.TelefonNr;
SELECT Name, Groesse, Preis FROM Pizza, PizzaGroesseWHERE PizzaNr=PizzaORDER BY Name, Groesse;
SELECT Name, Vorname, BestellNr, Wann FROM Bestellung, KundeWHERE Bestellung.TelefonNr=Kunde.TelefonNrORDER BY Name, Vorname; Was passiert bei: SELECT * FROM Kunde, Bestellung WHERE Kunde.TelefonNr=Bestellung.TelefonNr;Was passiert bei: SELECT * FROM Kunde, Bestellung WHERE Kunde.TelefonNr=Bestellung.TelefonNr;
70. Seite 70 SELECT über Tabellen – Non equi joins Natürlich kann man auch Tabellen verknüpfen aufgrund der Tatsache, dass Feldinhalte nicht gleich sind, auch wenn dies nur selten einen praktischen Sinn ergibt:
Beispiele:
SELECT Name, Vorname, Wann AS NichtAm FROM Kunde, BestellungWHERE Kunde.TelefonNr<>Bestellung.TelefonNr And Name='Peitsch';
71. Seite 71 SELECT über Tabellen – JOIN ON Die Klausel JOIN ON ist nicht im Standard definiert, wird aber allgemein verwendet:
Syntax:
SELECT?{Feld|Funktion(Feld)[,…]}?FROM?Tabellenname{[INNER]|LEFT?[OUTER]|RIGHT?[OUTER]|FULL}?JOIN?TabellennameON?Kriterium[?LogischerOperator?Kriterium[…]]
72. Seite 72 SELECT über Tabellen – equi join mit JOIN ON Beispiele:
SELECT Kunde.TelefonNr, Name, Vorname, Wann FROM KundeJOIN Bestellung ON Kunde.TelefonNr=Bestellung.TelefonNr;
Access verlangt hier INNER JOIN!
SELECT Name, Groesse, Preis FROM PizzaINNER JOIN PizzaGroesse ON PizzaNr=PizzaORDER BY Name, PizzaGroesse.Name, Groesse, Preis;
Bei Access ist bei einem Join die Angabe von Tabelle und Feldname notwendig!
SELECT Position.BestellNr, PosNr, Pizza, Groesse, Wann FROM BestellungJOIN Position ON Position.BestellNr=Bestellung.BestellNr AND Bestellung.BestellNr IN (2,3)ORDER BY Bestellung.BestellNr, PosNr;
Bei Access ist statt des AND eine WHERE-Klausel notwendig!
73. Seite 73 SELECT über Tabellen – outer join mit JOIN ON Beispiele:
SELECT Kunde.TelefonNr, Name, Vorname, Wann FROM KundeLEFT OUTER JOIN Bestellung ON Kunde.TelefonNr=Bestellung.TelefonNr;
SELECT Bestellung.BestellNr, PosNr, Pizza, Groesse, Wann FROM BestellungLEFT JOIN PositionON Position.BestellNr=Bestellung.BestellNr AND Bestellung.BestellNr IN (2,3)ORDER BY Bestellung.BestellNr, PosNr;
SELECT Bestellung.BestellNr, PosNr, Pizza, Groesse, Wann FROM BestellungRIGHT JOIN PositionON Position.BestellNr=Bestellung.BestellNr AND Bestellung.BestellNr IN (2,3)ORDER BY Bestellung.BestellNr, PosNr;
SELECT Bestellung.BestellNr, PosNr, Pizza, Groesse, Wann FROM BestellungFULL JOIN PositionON Position.BestellNr=Bestellung.BestellNr AND Bestellung.BestellNr IN (2,3)ORDER BY Bestellung.BestellNr, PosNr; FULL JOIN gibt es nicht in Access!
74. Seite 74 SELECT über Tabellen – JOIN ON, weitere Beispiele Beispiele:
SELECT Name, Pizza FROM PizzaBelagINNER JOIN Zutat ON Zutat=ZutatNrORDER BY Name, Pizza;
SELECT Groesse, Name FROM PizzaGroesseRIGHT JOIN Pizza ON Pizza=PizzaNrWHERE Groesse IS NULL;
SELECT Groesse, Name FROM PizzaLEFT JOIN PizzaGroesse ON Pizza=PizzaNrWHERE Groesse IS NULL;
SELECT Name, Pizza FROM PizzaBelagRIGHT OUTER JOIN Zutat ON Zutat=ZutatNrWHERE Pizza IS NULLORDER BY Name, Pizza;
75. Seite 75 SELECT über Tabellen – JOIN ON, weitere Beispiele Beispiele:
SELECT Pizza.Name, Zutat.Name FROM PizzaINNER JOIN PizzaBelag ON PizzaNr=PizzaINNER JOIN Zutat ON Zutat=ZutatNrORDER BY Pizza.Name, Zutat.Name;
Access verlangt hier eine andere Syntax und Klammersetzung!
SELECT Pizza.Name, Zutat.Name FROM PizzaINNER JOIN (Zutat INNER JOIN PizzaBelag ON Zutat.ZutatNr=PizzaBelag.Zutat)ON PizzaBelag.Pizza=Pizza.PizzaNrORDER BY Pizza.Name, Zutat.Name;
76. Seite 76 SELECT über Tabellen – JOIN ON, weitere Beispiele Beispiele:
SELECT DISTINCT Kunde.Name, Kunde.Vorname FROM KundeLEFT JOIN Bestellung ON Kunde.TelefonNr=Bestellung.TelefonNrWHERE BestellNr IS NULLORDER BY Kunde.Name, Kunde.Vorname;
77. Seite 77 SELECT über Tabellen – JOIN ON, weitere Beispiele Beispiele:
SELECT DISTINCT Pizza.Name, Kunde.Name, Kunde.Vorname FROM PizzaINNER JOIN Position ON PizzaNr=PizzaINNER JOIN Bestellung ON Position.BestellNr=Bestellung.BestellNrINNER JOIN Kunde ON Kunde.TelefonNr=Bestellung.TelefonNrORDER BY Kunde.Name, Kunde.Vorname, Pizza.Name;
In Access:
SELECT DISTINCT Pizza.Name, Kunde.Name, Kunde.Vorname FROM PizzaINNER JOIN (Position INNER JOIN (Bestellung INNER JOIN Kunde ON Kunde.TelefonNr=Bestellung.TelefonNr) ON Position.BestellNr=Bestellung.BestellNr)ON Pizza.PizzaNr=Position.PizzaORDER BY Kunde.Name, Kunde.Vorname, Pizza.Name;
78. Seite 78 SELECT über Tabellen – JOIN ON, weitere Beispiele Beispiele:
SELECT Pizza.Name FROM PizzaFULL JOIN Position ON PizzaNr=PizzaWHERE Pizza IS NULL;
In Access:SELECT Pizza.Name FROM PizzaLEFT JOIN Position ON Pizza.PizzaNr=Position.PizzaWHERE Pizza IS NULL;
79. Seite 79 SELECT über Tabellen – JOIN ON, weitere Beispiele Beispiele:
SELECT Wann, Kunde.Name, Vorname, Pizza.Name AS Pizza, Bezeichnung AS Groesse FROM PositionINNER JOIN Groesse ON Groesse=DurchmesserINNER JOIN Pizza ON Pizza=PizzaNrINNER JOIN Bestellung ON Position.BestellNr=Bestellung.BestellNrINNER JOIN Kunde ON Bestellung.TelefonNr=Kunde.TelefonNrORDER BY Wann, Kunde.Name, Vorname, Durchmesser;
In Access:SELECT Wann, Kunde.Name, Vorname, Pizza.Name, GroesseFROM ((Kunde INNER JOIN Bestellung ON Kunde.TelefonNr = Bestellung.TelefonNr) INNER JOIN Position ON Bestellung.BestellNr = Position.BestellNr) INNER JOIN Pizza ON Position.Pizza = Pizza.PizzaNrORDER BY Wann, Pizza.Name, Groesse;
80. Seite 80 Tabellen mit sich selbst verknüpfen Die Verknüpfung einer Tabelle mit sich selbst dient vor allem der Überprüfung der Datenkonsistenz:
Beispiele:
SELECT * FROM Mitarbeiter AS M1, Mitarbeiter AS M2;
SELECT M1.MitarbeiterNr, M1.Name, M1.VornameFROM Mitarbeiter AS M1, Mitarbeiter AS M2WHERE M1.MitarbeiterNr=M2.MitarbeiterNr AND (M1.Name<>M2.Name OR M1.Vorname<>M2.Vorname);
81. Seite 81 Verschachteltes SELECT Das Verschachteln von SELECT-Anweisungen nennt man auch Unterabfragen:
Häufigste Syntax:
SELECT?{Feld|Funktion(Feld)[,…]}?FROM?TabellennameWHERE?Feld[?]Operator?[(]SELECT?{Feld|Funktion(Feld)[,…]}?FROM?Tabellenname [WHERE?Kriterium[?LogischerOperator?Kriterium[…]]][)];
Beispiele:
SELECT Pizza.Name FROM PizzaWHERE PizzaNr IN (SELECT Pizza FROM Position WHERE BestellNr=2);
SELECT TelefonNr FROM BestellungWHERE BestellNr IN (SELECT BestellNr FROM Position WHERE Pizza IN (2,4));
82. Seite 82 Verschachteltes SELECT - weitere Beispiele Beispiele:
SELECT Name FROM ZutatWHERE ZutatNr IN (SELECT Zutat FROM PizzaBelag WHERE Pizza=3);
SELECT Name FROM PizzaWHERE PizzaNr IN (SELECT Pizza FROM Position WHERE BestellNr=2);
SELECT * FROM Kunde WHERE TelefonNr IN(SELECT TelefonNr FROM Bestellung WHERE DAY(Wann)=20 AND MONTH(Wann)=3 AND YEAR(Wann)=2001);
SELECT Name, Vorname FROM Kunde WHERE TelefonNr IN(SELECT TelefonNr FROM Bestellung WHERE BestellNr IN (SELECT BestellNR FROM Position WHERE Pizza=3));
83. Seite 83 Verschachteltes SELECT - weitere Beispiele Beispiele:
SELECT Name, Vorname FROM Kunde WHERE TelefonNr IN(SELECT TelefonNr FROM Bestellung WHERE BestellNr IN (SELECT BestellNR FROM Position WHERE Pizza IN (SELECT Pizza FROM PizzaBelag WHERE Zutat=12)));
SELECT AVG(Preis) FROM PizzaGroesse WHERE Pizza IN(SELECT Pizza FROM PizzaBelag WHERE Zutat=3);
SELECT Name, Vorname FROM KundeWHERE TelefonNr=(SELECT TelefonNr FROM Bestellung WHERE BestellNr=4);
SELECT Name FROM Pizza WHERE PizzaNr IN(SELECT Pizza FROM PizzaGroesse WHERE Groesse=(SELECT MAX(Groesse) FROM PizzaGroesse)); Erstes Beispiel: Wer hat eine Pizza mit Hack bestellt?
Zweites Beispiel: Wie teuer ist durchschnittlich eine Pizza mit Gouda?Erstes Beispiel: Wer hat eine Pizza mit Hack bestellt?
Zweites Beispiel: Wie teuer ist durchschnittlich eine Pizza mit Gouda?
84. Seite 84 Arbeiten mit EXISTS (unkorreliert) Die EXISTS-Klausel übernimmt eine Unterabfrage als Argument und liefert das Vorhandensein von Datensätzen mit TRUE oder FALSE
Häufigste Syntax:
SELECT?{Feld|Funktion(Feld)[,…]}?FROM?TabellennameWHERE?EXISTS?[(]SELECT?{Feld|Funktion(Feld)[,…]}?FROM?Tabellenname [WHERE?Kriterium[?LogischerOperator?Kriterium[…]]][)];
Beispiel:
SELECT PizzaNr FROM PizzaWHERE EXISTS (SELECT PizzaNr FROM Pizza WHERE Name='Alito');
Die Abfrage ist unkorreliert, sie beinhaltet keine Verknüpfung
Deshalb wird die Unterabfrage nur einmal ausgeführt und liefert TRUE
Die Abfrage wird ebenfalls nur einmal ausgeführt und gibt mit dem Argument TRUE somit alle Pizzen zurück!
85. Seite 85 Arbeiten mit EXISTS (korreliert) Beinhaltet die Unterabfrage in einer EXISTS-Klausel eine Verknüpfung zur übergeordneten Abfrage, wird sie mehrfach ausgeführt
Die übergeordnete Abfrage wird für jede Ergebniszeile der untergeordneten Abfrage ausgeführt
Beispiele:
SELECT Pizza, Zutat FROM PizzaBelag WHERE EXISTS(SELECT ZutatNr FROM Zutat WHERE Name='Gouda' AND PizzaBelag.Zutat=Zutat.ZutatNr)
SELECT Pizza, Zutat FROM PizzaBelag WHERE EXISTS(SELECT Pizza FROM PizzaGroesse WHERE Groesse=32 AND PizzaBelag.Pizza=PizzaGroesse.Pizza);
86. Seite 86 Arbeiten mit EXISTS (korreliert) Beispiele:
SELECT Name FROM Pizza WHERE EXISTS(SELECT Pizza FROM PizzaGroesse WHERE Groesse=32 ANDPizza.PizzaNr=PizzaGroesse.Pizza);
SELECT Name FROM Pizza WHERE EXISTS(SELECT Zutat FROM PizzaBelag WHERE Zutat=11 AND Pizza.PizzaNr=PizzaBelag.Pizza);
SELECT * FROM Pizza WHERE EXISTS(SELECT Pizza FROM PizzaBelag WHERE Pizza.PizzaNr=PizzaBelag.Pizza AND Zutat=(SELECT ZutatNr FROM Zutat WHERE Name='Gouda'))ORDER BY PizzaNr;
87. Seite 87 Der Unterschied zwischen IN und EXISTS Betrachtet man das letzte Beispiel, kann man es einfacher (ohne Verknüpfung mit IN statt mit EXISTS lösen
Beispiel:
SELECT * FROM Pizza WHERE PizzaNr IN(SELECT Pizza FROM PizzaBelag WHERE Zutat= (SELECT ZutatNr FROM Zutat WHERE Name='Gouda'))ORDER BY PizzaNr;
Warum geben zwei verschiedene Anweisungen das gleiche Ergebnis?
Flexibilität ist bei SQL ein „echter Standard“
Wo liegt nun der Unterschied zwischen IN und EXISTS?
IN vergleicht auf Gleichheit, EXISTS lässt alle Vergleiche zu
88. Seite 88 Aufgaben 2.1 Wie heißen die Pizzen in Größe 32 mit Gouda?
SELECT Name FROM Pizza WHERE PizzaNr IN(SELECT PizzaNr FROM Pizza WHERE PizzaNr IN (SELECT Pizza FROM PizzaBelag WHERE Zutat= (SELECT ZutatNr FROM Zutat WHERE Name='Gouda')) AND PizzaNr IN (SELECT Pizza FROM PizzaGroesse WHERE Groesse=32));
Wie lauten die Daten des/der Kunden, die Pizzen mit Salami bestellt haben?
SELECT * FROM Kunde WHERE TelefonNr IN(SELECT TelefonNr FROM Bestellung WHERE BestellNr IN (SELECT BestellNr FROM Position WHERE Pizza IN (SELECT Pizza FROM PizzaBelag WHERE Zutat= (SELECT ZutatNr FROM Zutat WHERE Name='Salami'))))
89. Seite 89 Daten einfügen mit INSERT Der INSERT-Befehl dient zum Anlegen neuer Datensätze in Tabellen:
Einfügen eines Datensatzes mit INSERT
Syntax:insert into Tabelle (Feld[, Feld]) values (Wert[, Wert]);
Beispiele:
INSERT INTO Mitglied (ID, Passwort, Name, Vorname, Ersteintrag)VALUES (‘toto‘, ‘geheim‘, ‘Thormann‘, ‘Thorsten‘, NOW());
INSERT INTO Mitglied (ID, Passwort, Name, Vorname, Ersteintrag)VALUES (‘fury‘, ‘121212‘, ‘Müller‘, ‘Andrea‘, #10/24/200#);
Wie man sieht, wird ein Datum in Rauten eingeschlossen und „amerikanisch“ notiert, also in der Reihenfolge Monat/Tag/Jahr.
90. Seite 90 Daten ändern mit UPDATE Bestehende Daten können mit dem UPDATE-Befehl verändert werden:
Verändern eines Datensatzes mit UPDATE
Syntax:update Tabellennameset Feld =Wert [, Feld =Wert ]where Suchbedingung;
Beispiel:
UPDATE Mitglied SET Name=‘Verheiratet‘WHERE ID=‘toto‘;
91. Seite 91 Löschen von Daten mit DELETE und WHERE Die DELETE-Anweisung löscht immer ganze Datensätze, deshalb werden Felder nur in der WHERE-Klausel angegeben:
Löschen von Datensätzen mit DELETE und WHERE
Syntax:delete from Tabellennamewhere ...
Beispiele:DELETE FROM MitgliedWHERE KundenNr=23456;
DELETE FROM MitgliedWHERE Geburtsdatum<#1/1/1980#;
Beachten Sie, dass das Löschen von Daten unwiderruflich ist; es gibt in SQL kein Undo!
Für die WHERE-Klausel gelten die von SELECT bekannten Möglichkeiten. Es empfiehlt sich, immer erst ein SELECT mit der gleichen WHERE-Klausel auszuführen, um sich die Daten anzeigen zu lassen, die das DELETE löschen würde.