245 lines
6.9 KiB
Markdown
245 lines
6.9 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>
|
||
|
||
Anlegen eines Users mit Rechten
|
||
|
||
```sql
|
||
CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
|
||
```
|
||
|
||
Rechte setzen
|
||
|
||
```sql
|
||
GRANT PRIVILEGE ON database.table TO 'username'@'host';
|
||
```
|
||
|
||
- `CREATE`: Ermöglicht es Benutzern, eine Datenbank oder Tabelle zu erstellen.
|
||
- `SELECT`: Erlaubt Benutzern, Daten abzurufen.
|
||
- `INSERT`: Ermöglicht es Benutzern, neue Einträge in Tabellen hinzuzufügen.
|
||
- `UPDATE`: Ermöglicht es Benutzern, bestehende Einträge in Tabellen zu ändern.
|
||
- `DELETE`: Ermöglicht es Benutzern, Tabelleneinträge zu löschen.
|
||
- `DROP`: Benutzer können ganze Datenbanktabellen löschen.
|
||
|
||
Somit also
|
||
|
||
```sql
|
||
GRANT SELECT, CREATE ON database.table TO 'username'@'host';
|
||
```
|
||
|
||
Einlesen der Berechtigungstabellen
|
||
|
||
Aktivieren mit
|
||
FLUSH PRIVILEGES;
|
||
|
||
|
||
|
||
Entziehen von Rechten
|
||
|
||
REVOKE type_of_permission ON database_name.table_name FROM 'username'@'host';
|
||
|
||
Anzeigen der aktuellen Berechtigungen
|
||
|
||
```sql
|
||
SHOW GRANTS FOR 'username'@'host';
|
||
```
|
||
|
||
User löschen
|
||
|
||
```sql
|
||
DROP USER 'username'@'localhost';
|
||
```
|