196 lines
5.8 KiB
Markdown
196 lines
5.8 KiB
Markdown
# SQL
|
|
|
|
## Conditions Basics
|
|
|
|
Manchmal möchten wir Datensätze abrufen, die eine bestimmte Bedingung erfüllen.
|
|
|
|
Zum Beispiel
|
|
|
|
- alle Datensätze abrufen, die den Familiennamen „Aothly“ haben
|
|
|
|
- alle Datensätze abrufen, bei denen der Betrag größer als 5 ist
|
|
|
|
- Alle Datensätze mit dem Land „Mexico“ abrufen
|
|
|
|
Um Bedingungen hinzuzufügen, können wir das `WHERE`-Schlüsselwort verwenden
|
|
|
|
Zum Beispiel hier ist eine **Verkäufe**-Tabelle:
|
|
|
|
| Münze | Menge |
|
|
| ----- | ----- |
|
|
| AGK | 13 |
|
|
| GOL | 21 |
|
|
| KLA | 15 |
|
|
| AGK | 18 |
|
|
|
|
Um alle Datensätze mit der Coin „AGK“ abzurufen, schreibt man:
|
|
|
|
`SELECT * FROM sales WHERE coin = 'AGK'`
|
|
|
|
Um alle Datensätze mit `amount` kleiner oder gleich 20 abzurufen, schreibt man:
|
|
|
|
`SELECT * FROM sales WHERE amount <= 20`
|
|
|
|
|
|
|
|
### Unique values
|
|
|
|
Angenommen man hat die folgende Tabelle:
|
|
|
|
**Verkäufe**
|
|
|
|
| | Land | Stadt | Betrag |
|
|
| ---- | ----------- | -------- | ------ |
|
|
| 1 | Polen | Warschau | 13 |
|
|
| 2 | Deutschland | Berlin | 24 |
|
|
| 3 | Polen | Katowice | 56 |
|
|
|
|
Man möchte alle Länder wissen, in denen das Produkt verkauft wurde.
|
|
|
|
Wenn man die normale Abfrage, die man kennt, verwendet: `SELECT country from sales` liefert sie `Poland`, `Germany`, `Poland`. Das ist nicht das, wonach man sucht, weil Polen zweimal wiederholt wird.
|
|
|
|
Um es zu lösen, kann man das `DISTINCT`-Schlüsselwort verwenden:
|
|
|
|
### NOT
|
|
|
|
Das `NOT`-Schlüsselwort bedeutet, dass man nicht möchte, dass die Bedingung erfüllt wird.
|
|
|
|
Zum Beispiel betrachte man die folgende **people**-Tabelle:
|
|
|
|
| Name | Alter | Geschlecht |
|
|
| ------ | ----- | ---------- |
|
|
| Joas | 13 | männlich |
|
|
| Holwa | 17 | männlich |
|
|
| Nohlas | 24 | weiblich |
|
|
| Polar | 23 | männlich |
|
|
| Loopa | 18 | weiblich |
|
|
|
|
`SELECT * FROM people WHERE NOT gender = 'male'`
|
|
|
|
Dies wird das Ergebnis sein:
|
|
|
|
| Name | Alter | Geschlecht |
|
|
| ------ | ----- | ---------- |
|
|
| Nohlas | 24 | weiblich |
|
|
| Loopa | 18 | weiblich |
|
|
|
|
Das `NOT`-Schlüsselwort kehrt die Bedingung im Wesentlichen um. Zum Beispiel sind die folgenden Abfragen gleich:
|
|
|
|
`WHERE age > 20`
|
|
|
|
`WHERE NOT age <= 20`
|
|
|
|
### AND
|
|
|
|
Das `AND`-Schlüsselwort bedeutet, dass **beide** Bedingungen wahr sein müssen; wenn eine von ihnen nicht der Fall ist, wird die Bedingung nicht erfüllt.
|
|
|
|
Zum Beispiel ist hier eine `people`-Tabelle:
|
|
|
|
| Name | Alter | Geschlecht |
|
|
| ------ | ----- | ---------- |
|
|
| Joas | 13 | männlich |
|
|
| Holwa | 17 | männlich |
|
|
| Nohlas | 24 | weiblich |
|
|
| Polar | 23 | männlich |
|
|
| Loopa | 18 | weiblich |
|
|
|
|
Die folgende Abfrage:
|
|
|
|
`SELECT * FROM people WHERE gender = "female" AND age < 20`
|
|
|
|
bedeutet, dass man nach allen Datensätzen sucht, bei denen das Geschlecht „female“ ist und das Alter kleiner als 20 ist.
|
|
|
|
Dies wird das Ergebnis sein:
|
|
|
|
| Name | Alter | Geschlecht |
|
|
| ----- | ----- | ---------- |
|
|
| Loopa | 18 | weiblich |
|
|
|
|
### OR
|
|
|
|
Das `OR`-Schlüsselwort bedeutet, dass eine der Bedingungen wahr sein soll.
|
|
|
|
Zum Beispiel betrachtet man die folgende **people**-Tabelle:
|
|
|
|
| name | age | gender |
|
|
| ------ | ---- | ------ |
|
|
| Joas | 13 | male |
|
|
| Holwa | 17 | male |
|
|
| Nohlas | 24 | female |
|
|
| Polar | 23 | male |
|
|
| Loopa | 18 | female |
|
|
|
|
`SELECT * FROM people WHERE gender = 'female' OR age < 20`
|
|
|
|
Diese Abfrage bedeutet, dass man nach allen Datensätzen sucht, bei denen entweder das Geschlecht weiblich ist oder das Alter unter 20 liegt.
|
|
|
|
Das wird das Ergebnis sein:
|
|
|
|
| Name | Alter | Geschlecht |
|
|
| ------ | ----- | ---------- |
|
|
| Joas | 13 | männlich |
|
|
| Holwa | 17 | männlich |
|
|
| Nohlas | 24 | weiblich |
|
|
| Loopa | 18 | weiblich |
|
|
|
|
###################
|
|
## Kombination von Conditions
|
|
|
|
Das Erstellen einer Abfrage mit nur einer Bedingung ist nicht ausreichend. Manchmal möchte man etwas Komplizierteres überprüfen. Dafür haben SQL (und viele andere Programmiersprachen) die AND-, OR- und NOT-Schlüsselwörter, um unsere Fähigkeit zu verbessern, das gewünschte Ergebnis abzurufen.
|
|
|
|
Die AND und OR Schlüsselwörter werden wie folgt verwendet:
|
|
|
|
`SELECT col1, col2 FROM table1 WHERE condition1 AND condition2 OR condition3 ...`
|
|
|
|
Man kann so viele Bedingungen wie man will zusammen stapeln.
|
|
###################
|
|
|
|
## Sortierung (ORDER BY)
|
|
|
|
`... ORDER BY ASC`, das wird standardmäßig gesetzt
|
|
|
|
`ASC` --> Aufsteigend --> kleinster Wert zuerst
|
|
|
|
`DESC` --> Absteigend --< Größter Wert zuerst
|
|
### Beispiele und Erklärung
|
|
Beim Abfragen einer Datenbank kann die Organisation der Ergebnisse in einer sinnvollen Reihenfolge die Datenanalyse erheblich effizienter machen. Um das Ergebnis zu sortieren, verwendet man das ORDER BY-Schlüsselwort und danach sollte man angeben, nach welchem Feld man sortiert. Standardmäßig sortiert es in aufsteigender Reihenfolge.
|
|
|
|
Zum Beispiel betrachten Sie die folgende **competition**-Tabelle:
|
|
|
|
| runner_id | age | avg_speed |
|
|
| --------- | ---- | --------- |
|
|
| 1 | 47 | 3.65 |
|
|
| 2 | 62 | 3.07 |
|
|
| 3 | 57 | 6.82 |
|
|
| 4 | 56 | 4.34 |
|
|
| 5 | 25 | 4.93 |
|
|
| 6 | 40 | 3.94 |
|
|
| 7 | 23 | 6.58 |
|
|
| 8 | 40 | 3.43 |
|
|
|
|
|
|
|
|
`SELECT * FROM competition WHERE age > 50 ORDER BY avg_speed`
|
|
|
|
Dies ist das Ergebnis
|
|
|
|
| runner_id | age | avg_speed |
|
|
| --------- | ---- | --------- |
|
|
| 2 | 62 | 3.07 |
|
|
| 4 | 56 | 4.34 |
|
|
| 3 | 57 | 6.82 |
|
|
|
|
Um anzugeben, wie diese Daten sortiert werden sollen, können wir die `DESC`- oder `ASC`-Schlüsselwörter nach dem Namen der Spalte hinzufügen.
|
|
|
|
`ORDER BY avg_speed ASC`
|
|
|
|
## Eigenschaften einer Tabelle
|
|
`DESCRIBE <tabelle>`
|
|
oder
|
|
`SHOW COLUMNS FROM <tabelle>`
|
|
|
|
## Neuer Datensatz
|
|
INSERT INTO <tabelle> (<spalte><spalte>,...) VALUES (<wert>,<wert>,...)
|
|
|
|
## Update Datensatz
|
|
UPDATE <tabelle> set <spalte> = <wert>, <spalte> = <wert>, ... WHERE <Bedingung> |