====== Anfragen an Datenbanken - SQL ====== Im Abschnitt [[neuerlehrplan:klasse09:begriffe|Was ist ein Datenbanksystem?]] wird erklärt, was wir unter einem Datenbanksystem verstehen. Zur Kommunikation zwischen Datenbankensystemen und anderen Anwendungen hat sich allgemein die Sprache **SQL** (Structured Query Language) durchgesetzt. SQL lässt sich in verschiedene Sprachgruppen einteilen: * **DDL** - Definition und Veränderung von Relationen (Tabellen) * **DML** - Erfassung und Pflege der Daten * **QL** - Anfragesprache zur Auswertung der Datenbasis * **DCL** - Vergabe und Organisation von Zugriffsrechten =====Auswertung der Datenbasis - Operationen auf Tabellen===== Bei der Auswertung der Datenbasis sollen bestimmte Daten aus bereits vorhandenen Tabellen ausgelesen werden. Dabei sind verschiedene Operationen möglich. Zur Auswertung der Datenbasis wird der SQL-Befehl ''%%SELECT%%'' verwendet: SELECT spalte(n) FROM tabelle(n) [WHERE bedingunge(n)]; SQL-Befehle können in beliebiger Schreibweise geschrieben werden, es hat sich aber eingebürgert, die Befehle ausschließlich in Großbuchstaben zu schreiben. Die Syntax des Befehls wird in den nächsten Abschnitten erläutert. Für unsere Beispiele verwenden wir Tabellen aus der Datenbank von [[https://instahub.org/|Instahub]]. Zunächst beschränken wir uns auf die Tabelle users: $\text{users}\left( \underline{\text{id}}\text{, username, email, password, name, bio, gender, birthday, city, country, centimeters,} \\ \text{ avatar, role, is_active, remember_token, created_at, updated_at}\right)$ Teste die folgenden Beispiele jeweils in Instahub! ====Anzeige der gesamten Tabelle==== Mit dem SQL-Befehl SELECT * FROM users; lässt sich die Tabelle users vollständig anzeigen. Der * steht Dabei für alle Attribute der Tabelle. ====Projektion==== Eine **Projektion** filtert bestimmte Spalten aus einer Datenbanktabelle heraus. **Beispiel** Gib die Spalten id, username und email der Tabelle users aus! SELECT id, username, email FROM users ====Selektion==== Bei einer Selektion werden bestimmte Zeilen aus einer Tabelle herausgefiltert, die einer bestimmten Bedingung entsprechen. Diese Bedingung wird in der WHERE-Klausel angegeben. **Beispiel** Gib alle Datensätze der Tabelle users vollständig aus, bei denen der Nutzername 'max383' ist! SELECT * FROM users WHERE username = 'max383' Attributwerte müssen in einfachen Anführungsstrichen stehen! ('max383') ====Selektion und Projektion==== Bei Anfragen werden in der Regel Selection und Projektion kombiniert. **Beispiel:** Gib von allen Datensätze der Tabelle users die Spalten username und name aus, bei denen der Nutzername 'max383' ist! SELECT username, name FROM users WHERE username = 'max383' ====Formulierung der Bedingung==== Mehrere Bedingungen können durch **NOT**, **OR** und **AND** verbunden sein. Zum Vergleich können die Operatoren ''%%>, <, >=, <=, <>, =%%'' und ''%%like%%'' genutzt werden. **Beispiel 1** Gib alle Eigenschaften aller Nutzer aus, die größer sind als 160 cm. SELECT * FROM users WHERE centimeters > '160' **Beispiel 2** Gib Nutzername und Größe aller Nutzer aus, die größer als 161 cm und kleiner als 170 cm sind. SELECT username, centimeters FROM users WHERE centimeters > '161' AND centimeters < '170' **Beispiel 3** Gib Nutzername Größe und Geschlecht aller Nutzer aus, die größer als 170 cm oder weiblich sind. SELECT username, centimeters, gender FROM users WHERE centimeters > '170' OR gender = 'female' ===like=== Den Vergleichsoperator ''%%like%%'' nutzt man, wenn bestimmte Muster in Zeichenketten sucht. In den Zeichenketten steht dabe % für beliebig viele Zeichen und _ für ein einzelnes Zeichen. **Beispiel 4** Gib alle Daten aller Nutzer aus, deren Nutzername mit 'a' beginnt. SELECT * FROM users WHERE username like 'a%' **Beispiel 5** Gib alle Daten aller Nutzer aus, bei denen der zweite Buchstabe im Nutzernamen ein a ist. SELECT * FROM users WHERE username like '_a%' ====Verfeinerung der Ausgabe==== Manchmal kann es vorkommen, dass Datensätze mehrfach auftreten: **Beispiel 1** SELECT gender FROM users Um jeden Datensatz einfach auszugeben kann man das Schlüsselwort ''%%DISTINCT%%'' benutzen. **Beispiel 2** SELECT DISTINCT gender FROM users Man kann auch die Ausgabe ordnen. Dabei ordnet * ''%%ORDER BY Spalte ASC%%'' nach der Spalte aufsteigend und * ''%%ORDER BY Spalte DESC%%'' nach der Spalte absteigend Das ''%%ASC%%'' kann auch weggelassen werden. **Beispiele 3 und 4** Gib alle Daten aller Nutzer geordnet nach Größe aus (absteigend und aufsteigend)! SELECT * FROM users ORDER BY centimeters DESC SELECT * FROM users ORDER BY centimeters {{ :neuerlehrplan:klasse09:1_05_anfragen_uebung.pdf |Aufgaben}}