====== LU02b - Daten mit SQL abfragen ======
===== Daten abfragen =====
Das //SELECT//-Statement ist das am häufigsten verwendete SQL-Statement.
Mit SELECT
können Daten in verschiedenen Varianten ausgegeben werden:
* alle Spalten
* bestimmte Spalten
* mit Filterbedingungen
* sortiert
===== Alle Spalten ausgeben =====
Die einfachste Abfrageform ist:
SELECT * FROM imdb_top_1000;
Die **FROM-Anweisung** sagt in welcher Tabelle gesucht werden soll.
Dies gibt **alle Spalten** und **alle Zeilen** der Tabelle zurück.
Beispielauszug (die tatsächliche Tabelle hat noch mehr Spalten):
^ Poster ^ Filmtitel ^ Jahr ^ Genre ^ Rating ^ Kurzbeschreibung ^
| {{https://m.media-amazon.com/images/M/MV5BM2MyNjYxNmUtYTAwNi00MTYxLWJmNWYtYzZlODY3ZTk3OTFlXkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_UY98_CR1,0,67,98_AL_.jpg?50}} | The Godfather | 1972 | Crime, Drama | 9.2 | An organized crime dynasty's aging patriarch transfers control of his clandestine empire to his reluctant son. |
| {{https://m.media-amazon.com/images/M/MV5BZjdkOTU3MDktN2IxOS00OGEyLWFmMjktY2FiMmZkNWIyODZiXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_UX67_CR0,0,67,98_AL_.jpg?50}} | Interstellar | 2014 | Adventure, Drama, Sci-Fi | 8.6 | A team of explorers travel through a wormhole in space in an attempt to ensure humanity's survival. |
| {{https://m.media-amazon.com/images/M/MV5BMTUxMzQyNjA5MF5BMl5BanBnXkFtZTYwOTU2NTY3._V1_UX67_CR0,0,67,98_AL_.jpg?50}} | The Green Mile | 1999 | Crime, Drama, Fantasy | 8.6 | The lives of guards on Death Row are affected by one of their charges: a black man accused of child murder and rape, yet who has a mysterious gift. |
| {{https://m.media-amazon.com/images/M/MV5BOTA5NDZlZGUtMjAxOS00YTRkLTkwYmMtYWQ0NWEwZDZiNjEzXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_UX67_CR0,0,67,98_AL_.jpg?50}} | Whiplash | 2014 | Drama, Music | 8.5 | A promising young drummer enrolls at a cut-throat music conservatory where his dreams of greatness are mentored by a strict instructor. |
===== Bestimmte Spalten ausgeben =====
Wenn nur bestimmte Daten benötigt werden, empfiehlt es sich, die Spalten **explizit** anzugeben. Die Spalten werden mit **Kommas (,)** getrennt:
SELECT Series_Title, Released_Year, IMDB_Rating
FROM imdb_top_1000;
Beispielauszug:
^ Filmtitel ^ Jahr ^ Bewertung ^
| The Godfather | 1972 | 9.2 |
| Interstellar | 2014 | 8.6 |
| The Green Mile | 1999 | 8.6 |
| Whiplash | 2014 | 8.5 |
===== Ausgabe sortieren =====
Mit //ORDER BY// können Ergebnisse sortiert werden.
-- Die Filme nach Erscheinungsjahr sortieren
SELECT Series_Title, Released_Year, IMDB_Rating
FROM imdb_top_1000
ORDER BY Released_Year ASC;
Mit //ASC// (engl. ascending = Aufsteigend) oder //DESC// (engl. descending = Absteigend) kann die Sortierung bestimmt werden.
Die besten Filme zuerst:
SELECT Series_Title, Released_Year, IMDB_Rating
FROM imdb_top_1000
ORDER BY IMDB_Rating DESC;
===== Abfragen filtern =====
Nicht immer sind alle Daten interessant – **mit //WHERE// können Bedingungen definiert** werden.
Während die bisher behandelten //SELECT//- und //FROM//-Anweisungen in jedem //SELECT//-Befehl vorkommen müssen, ist die **WHERE-Anweisung optional**.
Wegen seiner wichtigen Bedeutung zur Einschränkung (Restriktion) einer Tabelle auf bestimmte Zeilen kommt die WHERE-Anweisung in der Praxis trotzdem in fast allen SELECT-Befehlen vor. Die Struktur einer Abfrage mit Bedingung lautet in Worten:
* **Was?** (welche **Spalten** werden ausgewählt -> z.B. //SELECT Series_Title//)
* **Woher?** (aus welcher/n **Tabelle/n** -> z.B. //FROM imbd_top_1000//)
* Unter **welcher/n Bedingung/en?** (welche **Feldwerte** -> z.B. //WHERE IMDB_Rating > 8.5//)
\\
-- Alle Filme mit Bewertung über 8.5
SELECT Series_Title, IMDB_Rating
FROM imdb_top_1000
WHERE IMDB_Rating > 8.5;
Ergebnis (Auszug):
^ Filmtitel ^ Bewertung ^
| The Godfather | 9.2 |
| The Green Mile | 8.6 |
| Interstellar | 8.6 |
===== Operatoren =====
Im //WHERE//-Statement können verschiedene Operatoren eingesetzt werden, um die Auswahl von Datensätzen einzuschränken.
==== Vergleichsoperatoren ====
= , < , > , <= , >= , <>
→ werden vor allem bei Zahlen verwendet.
Beispiel: nur Filme anzeigen, die **vor 1970** erschienen sind.
SELECT Series_Title, Released_Year
FROM imdb_top_1000
WHERE Released_Year < 1970;
==== Logische Verknüpfungen ====
AND, OR, NOT
→ verbinden mehrere Bedingungen.
Beispiel: Filme von Regisseuren //Christopher Nolan// **oder** //Francis Ford Coppola//:
SELECT Series_Title, Director
FROM imdb_top_1000
WHERE Director = 'Christopher Nolan' OR Director = 'Francis Ford Coppola';
Mit //AND// kann man Bedingungen kombinieren, z. B.:
-- Alle Sci-Fi-Filme von Christopher Nolan
SELECT Series_Title, Director, Genre
FROM imdb_top_1000
WHERE Director = 'Christopher Nolan' AND Genre = 'Drama';
==== IN-Operator ====
IN, NOT IN
→ vereinfacht Abfragen mit vielen Bedingungen.
-- Filme von Nolan oder Coppola
SELECT Series_Title, Director
FROM imdb_top_1000
WHERE Director IN ('Christopher Nolan', 'Francis Ford Coppola');
Das Gegenteil mit //NOT IN//:
-- Alle Filme, die NICHT von Nolan oder Coppola sind
SELECT Series_Title, Director
FROM imdb_top_1000
WHERE Director NOT IN ('Christopher Nolan', 'Francis Ford Coppola');
===== Zusammenfassung =====
* SELECT
– bestimmt die Spalten
* FROM
– bestimmt die Tabelle
* WHERE
– filtert die Zeilen
* ORDER BY
– sortiert die Ergebnisse
Mit diesen Befehlen sind die wichtigsten Grundlagen für Abfragen in relationalen Datenbanken gelegt.