Vorwort
In diesem Tutorial möchte ich euch einmal den Select- Befehl aus MySQL etwas näher bringen. Hierzu möchte ich mit euch Stück für Stück einige Selects aufbauen und euch Tipps und Anregungen geben wie ihr das am besten angeht. Da ich versuche alle Leute mitzunehmen, mögen mir mögliche Experten falsche Benamung oder nicht angewendete Vereinfachungen zu verzeihen. Diesen möchte ich mich Später widmen.
Gegeben ist eine Tabelle Namens Kontakte, diese umfasst die Felder (Attribute) die habe ich der Einfachheit unter https://de.fakenamegenerator.com/ generieren lassen und enthält KEINE echten Daten. Auch dem Thema wie eine Tabelle angelegt wird widme ich mich an einer anderen Stelle, da dieser Post lediglich den Select erklären soll!
Tabellenstruktur:
Field | Type | Comment |
Number | int(11) | Autoincrement |
Title | varchar(255) | |
Surname | varchar(255) | |
GivenName | varchar(255) | |
NameSet | varchar(255) | |
MiddleInitial | varchar(255) | |
Gender | varchar(255) | |
StreetAddress | varchar(255) | |
City | varchar(255) | |
ZipCode | varchar(255) | |
EmailAddress | varchar(255) | |
TelephoneNumber | varchar(255) | |
Birthday | datetime |
Datenauszug
Was ist ein Select-Befehl
Als einen Select beschreibt man eine Abfrage gegen die Datenbank, bei der man eine gewisse Menge an Daten zurück erhält. Dies kann der gesamte Inhalt einer Tabelle aber auch nur eine einzelne Zeile sein.
In diesem Tutorial werden wir nur mit einer Tabelle arbeiten, in der Praxis und späteren Lektionen werde ich euch aber auch zeigen, wie man Daten aus mehreren Tabellen zusammenfügt.
Der erste Select
Der simpelste Select den man sich vorstellen kann, ist der Select der einem den gesamten Inhalt einer Tabelle unsortiert, also in der Reihenfolge, in der die Daten in die Datenbank geschrieben wurden.
SELECT * FROM kontakte
Erster Select-Befehl
Führt man diesen Befehl über einen beliebigen MySql Client (Workbench, phpMyAdmin, Toad….) aus führt er zu der in Abbildung 1 (oben) gezeigten Ausgabe.
SELECT und FROM sind Schlüsselworte, die der Datenbank mitteilen was man von ihnen will. Um die Lesbarkeit eines SQL Statements zu erhöhen empfiehlt es sich Schlüsselworte immer UPPERCASE, also alle Buchstaben groß zu schreiben.
Kontakte ist die Tabelle, aus der wir unsere Daten haben wollen.
Das * an dieser Stelle ist bereits das erste Mogeln. ein * in der Feldliste ersetzt eine Liste ALLER Attribute. Was genau die Feldliste ist erkläre ich euch im nächsten Absatz. Dort gehe ich auch etwas detaillierter auf die Struktur eines Selects ein.
Select mit ausgewählten Feldern (Geburtstagsliste)
In den meisten Fällen braucht man aber gar nicht immer alle Informationen (Attribute) eines Datensatzes sondern nur eine Teilmenge. In der Zeit der schnellen Datenverbindungen und des massenhaften Arbeitsspeichers verzichten viele Entwickler gerne auf diese Einschränkung und selektieren lieber alles, ob sie es Später anzeigen oder nicht. Ich möchte euch bereits an dieser Stelle von diesem Vorgehen DRINGEND abraten. Neben dem Datenmüll den ihr mit euch mit schleppt, der sich in der Performance niederschlägt, schafft ihr euch damit viele Sicherheits- und Datenschutzprobleme.
Möchte ich jetzt zum Beispiel eine Geburtstagsliste erstellen so interessieren mich Informationen wie Adresse, Geschlecht und Kontaktdaten herzlich wenig. Diese machen meine Ausgabe nur unübersichtlich und unbrauchbar. In diesem Fall kann ich einzelne Attribute (Felder) mit einem Komma getrennt aufführen um nur noch diese Auszugeben. Interessant oder auch wichtig zu wissen ist hierbei, dass ich die Reihenfolge frei wählen kann, also auch erst den Geburtstag und dann den Namen ausgeben. Auch kann man ein Feld beliebig oft ausgeben. Der Sinn dahinter mag sich in diesem Tutorial nicht erschließen, wird aber in späteren Lektionen behandelt.
SELECT
Select einer Geburtstagsliste
Birthday , Surname, GivenName FROM kontakte
Birthday | Surname | GivenName |
---|---|---|
25-06-1964 00:00:00 | Headstrong | Bilcuzal |
06-06-1936 00:00:00 | Bolger-Baggins | Esmeralda |
12-11-1939 00:00:00 | Oldbuck | Bertha |
03-04-1988 00:00:00 | Lightfoot | Guido |
27-02-1991 00:00:00 | Brandagamba | Rowan |
03-01-1980 00:00:00 | Boffin | Otho |
08-02-1979 00:00:00 | Sackville | Regina |
28-11-1987 00:00:00 | Goldworthy | Belladonna |
08-06-1966 00:00:00 | Gaukrogers | Jago |
14-04-1936 00:00:00 | Tunnelly | Prisca |
Auch bei dieser Ausgabe handelt es sich wieder nur um die ersten 10 Zeilen, da ich keine 500 Zeilen untereinander ausgeben will.
Struktur eines Selects
Der Select, den wir oben sehen unterscheidet sich vom ersten Select ausschließlich durch seine geänderte Fieldlist. Um euch nicht weiter zu verwirren nun einmal die Struktur eines einfachen Selectes vollständig aufgedröselt
SELECT [Fieldlist] FROM [Tabelle]
Wie bereits oben Erklärt, handelt es sich bei SELECT und FROM um sogenannte Schlüsselworte, die der Datenbank mitteilen was wir eigentlich tun wollen. Diese Schlüsselworte muss man leider stumpf Auswendig lernen. Ins ein deutschen Satz verpackt seht da oben nun:
Hol mir folgende Informationen [Fieldlist] aus der Tabelle.
Die Fieldlist
Die Fieldlist hat allerdings noch so einiges zu bieten, so können hier neben der einfachen Auswahl auch Berechnungen und Funktionen in ihr ausgeführt werden. Ich möchte auch auf Funktionen erst etwas weiter unten eingehen stelle euch aber eine Funktion (NOW) vor um euch einmal zu zeigen wie das ganze aussieht.
Eine Besonderheit von MySql ist übrigens, dass man für einen Select eigentlich nur das Schlüsselwort SELECT und eine Fieldlist braucht. Solange die Fieldlist keine Felder einer Tabelle beinhaltet reicht dies bereits aus
SELECT 1+1, 1+2, 3-1, 5*2, 3/2
1+1 | 1+2 | 3-1 | 5*2 | 3/2 |
---|---|---|---|---|
2 | 3 | 2 | 10 | 1,5000 |
Eine Funktion wird einfach mit Klammer auf, Klammer zu in die Fieldlist geschrieben. Im folgenden das Beispiel mit NOW() was uns die aktuelle Uhrzeit und das Datum gibt. WICHTIG diese Zeitdaten werden von der Systemuhr des Datenbankserver geliefert, geht diese Falsch oder steht in einer anderen Zeitzone, kann das zu Verwirrung führen!
SELECT NOW()
08-02-2019 12:34:28
Das soll es an dieser Stelle erst einmal von der Fieldlist gewesen sein. Weitere Möglichkeiten und wozu der Quatsch benötigt wird werden wir im Verlauf nach und nach sehen.
Sortierung
Um bei unserem Beispiel von oben zu bleiben, der Geburtstagsliste spinnen wir das ganze einmal weiter. Eine Liste macht ja erst so richtig Sinn wenn man sie auch irgendwie Sortiert… Im Falle von Geburtstagen bietet es sich an, von wer hat zu erst nach wer hat als letztes Geburtstag
Die Schlüsselworte ORDER BY sind hier unsere Helfer und stehen rechtweit hinten im Select Befehl.
SELECT
Select einer sortierten Geburtstagsliste
Birthday , Surname, GivenName FROM kontakte ORDER BY
Birthday
Birthday | Surname | GivenName |
---|---|---|
14-04-1936 00:00:00 | Tunnelly | Prisca |
06-06-1936 00:00:00 | Bolger-Baggins | Esmeralda |
12-11-1939 00:00:00 | Oldbuck | Bertha |
25-06-1964 00:00:00 | Headstrong | Bilcuzal |
08-06-1966 00:00:00 | Gaukrogers | Jago |
08-02-1979 00:00:00 | Sackville | Regina |
03-01-1980 00:00:00 | Boffin | Otho |
28-11-1987 00:00:00 | Goldworthy | Belladonna |
03-04-1988 00:00:00 | Lightfoot | Guido |
27-02-1991 00:00:00 | Brandagamba | Rowan |
Diese Liste ist zwar sortiert, aber nicht so, wie wir es uns wünschen würden. Denk man an eine Geburtstagsliste Wünscht man sich doch eher eine Sortierung nach Monat und Tag und nicht von Alt nach Jung.
Da wir das aber noch nicht können, begnügen wir uns damit die Tabelle nach Nachnamen zu sortieren
SELECT
Select einer sortierten Nachname
Birthday , Surname, GivenName FROM kontakte ORDER BY
Surname
Bei der Sortierung haben wir noch einige Möglichkeiten, so können wir zum Einen entscheiden, ob wir etwas Aufsteigen (ascending) oder Absteigend (descending) Sortieren wollen. Die Schlüsselworte hierfür sind ASC für Aufsteigend und DESC für Absteigend. Wie euch beim nochmal Ansehen der vorangegangenen Select Befehlen sicher aufgefallen ist, habe ich darauf verzichtet das ASC mit zu tippen. Der Grund dafür ist, dass die meisten, eigentlich alle mir bekannten, Datenbanken bei einer Sortierung standartmäßig ASC sortieren, wenn man ihnen nichts anderes sagt. Bei der Sortierung werden Zahlen Nummerisch und Text wie Text behandelt.
Das klingt erstmal komisch ist aber schnell erklärt:
Speichert man die Zahlen 1-20 in jeweils einer Zeile in einer Spalte die als Text markiert ist (varchar, text, …) würde eine sortierte Ausgabe wie folgt aussehen
1
10
11
12
13
14
15
16
17
18
19
2
20
3
4
5
6
7
8
9
SELECT
Select einer sortierten Nachname Absteigend
Birthday , Surname, GivenName FROM kontakte ORDER BY
Surname DESC
Die Zweite und genau so wichtige Möglichkeit der Sortierung ist nach mehreren Feldern zu sortieren. Das kann nützlich sein, wenn man zum Beispiel in unserer Liste alle Familienmitglieder zusammen ausgeben will.
SELECT
Select einer sortierten Nachname, Vorname
Birthday , Surname, GivenName FROM kontakte ORDER BY
Surname, GivenName
Birthday | Surname | GivenName |
---|---|---|
30-09-1996 00:00:00 | Baggins | Angelica |
05-01-1935 00:00:00 | Baggins | Arnor |
17-03-1942 00:00:00 | Baggins | Camelia |
29-07-1981 00:00:00 | Baggins | Elanor |
17-07-1936 00:00:00 | Baggins | Ferumbras |
12-05-1984 00:00:00 | Baggins | Hob |
04-07-1992 00:00:00 | Baggins | Lily |