# 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 ` oder `SHOW COLUMNS FROM ` ## Neuer Datensatz INSERT INTO (,...) VALUES (,,...) ## Update Datensatz UPDATE set = , = , ... WHERE 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`: Er­mög­licht es Benutzern, eine Datenbank oder Tabelle zu erstellen. - `SELECT`: Erlaubt Benutzern, Daten abzurufen. - `INSERT`: Er­mög­licht es Benutzern, neue Einträge in Tabellen hin­zu­zu­fü­gen. - `UPDATE`: Er­mög­licht es Benutzern, be­stehen­de Einträge in Tabellen zu ändern. - `DELETE`: Er­mög­licht es Benutzern, Ta­bel­len­ein­trä­ge zu löschen. - `DROP`: Benutzer können ganze Da­ten­bank­ta­bel­len 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'; ```