Übungsskriptum Einf.i.d.DV DB - Structured Query Language [DB-SQL] Kleine SQL-Einführung Die Datenbank-Sprache SQL (Structured Query Language) wird intern in nahezu allen Datenbanken verwendet (auch in MS Access). BOKUonline, Moodle, das FH-Portal, … verwenden alle SQL in ihrem Inneren. Tabelle 'TIERE' Feld (Spalte einer DB-Tabelle) Datenbank DatenbankTabellen Tabelle: TIERE NAME varchar(35) Giraffe Nashorn Känguruh Tiger Wildschwein Panda Bär Bison Elefant Koala Bär Wolf Murmeltier KONTINENT varchar(35) Afrika Afrika Australien Asien Europa Asien Europa Amerika Afrika Australien Amerika Europa Europa Feldname: Datentyp: Feldlänge: KONTINENT VARCHAR 35 Datensatz (Zeile eine DBTabelle) C:\ C:\DB> sqlite -column -header header tiere.sqlite Enter ".help" for instructions Zum Üben eignet sich z.B. SQLite (http://www.sqlite.org/docs.html ) sqlite> select * from TIERE where KONTINENT='Afrika'; NAME ---------Giraffe Nashorn Elefant Löwe Krokodil KONTINENT ---------Afrika Afrika Afrika Afrika Afrika sqlite> .quit .quit Windows: Sie finden SQLite und die Übungsdatenbank im Ordner 'EinfDV-Daten\Datenbank\SQLite' Aufruf durch Doppelklick auf '__Tiere-Datenbank_aufrufen.bat' Mac OS X, Linux: • Öffnen Sie ein Terminal-Fenster (siehe http://statedv.boku.ac.at/roberts_it-kurs-unterlagen/?i=Cmd1 ) • Wechseln Sie zum Ordner 'EinfDV-Daten/Datenbank/SQLite' • Rufen Sie SQLite folgendermaßen auf: sqlite3 -header -column Tiere.sqlite Übungsaufgabe SQL-1: Arbeiten Sie alle folgenden Beispiele durch, experimentieren Sie. Vergessen Sie nicht, jeden SQL-Befehl mit einem Strichpunkt abzuschließen! Solange kein Strichpunkt kommt, wartet SQL auf weitere Eingaben! Sie können mit der 'Pfeil hinauf'-Taste zu den letzten Befehlen zurückblättern Beenden mit: .quit oder .exit © Robert Wiedermann | http://statedv.boku.ac.at/roberts_it-kurs-unterlagen/ | 09.05.2011 Übungsskriptum Einführung in die Datenverarbeitung, Abschnitt 42 Seite 1 Übungsskriptum Einf.i.d.DV DB - Structured Query Language [DB-SQL] Für folgende SQL-Einführung betrachten wir nur eine einzelne Tabelle (richtige Datenbanken bestehen natürlich aus vielen Tabellen). Es gibt eine Tabelle namens TIERE. Wir möchten alle Spalten (Felder) und alle Zeilen (Datensätze) dieser Tabelle anzeigen lassen. Die SQL-Syntax dazu lautet ungefähr: "Selektiere alle Spalten von der Tabelle TIERE": select * from TIERE; Nochmals etwas im Detail: • Der Befehl SELECT dient dazu, bestimmte Datensätze abzufragen, zu selektieren. • Nach dem SELECT stehen Feldnamen. Stern * bedeutet: alle Spalten (und nicht: alle Zeilen!) • Da eine Datenbank üblicherweise viele Tabellen beinhalten, müssen wir immer dazusagen, von welcher Tabelle wir Daten selektieren möchten. • Jede SQL-Anweisung wird mit einem Strichpunkt (Semikolon) abgeschlossen. Das vergisst man am Anfang ständig, ist aber kein Problem: Da sich ein SQL-Statement über mehrere Zeilen erstrecken kann, tragen wir den fehlenden Strichpunkt einfach nach. Nun lassen wir uns nur die Spalte NAME der Tabelle TIERE anzeigen: select NAME from TIERE; Übung: Lassen Sie nur die Spalte KONTINENT anzeigen Nun möchten wir die Ausgabe alphabetisch nach Tiernamen sortieren lassen: select * from TIERE order by NAME; Jetzt möchten wir eine Übersicht über die Fauna der einzelnen Kontinente gewinnen. Ein erster Ansatz wäre: select * from TIERE order by KONTINENT; © Robert Wiedermann | http://statedv.boku.ac.at/roberts_it-kurs-unterlagen/ | 09.05.2011 NAME -----------Giraffe Nashorn Känguruh Tiger Wildschwein Panda Bär Bison Elefant Koala Bär Wolf Murmeltier Löwe KONTINENT -----------Afrika Afrika Australien Asien Europa Asien Europa Amerika Afrika Australien Amerika Europa Europa Afrika NAME -----------Giraffe Nashorn Känguruh Tiger Wildschwein Panda Bär Bison Elefant Koala Bär Wolf Murmeltier Löwe NAME -----------Bison Bär Bär Elefant Giraffe Koala Känguruh Löwe Murmeltier Nashorn Panda Tiger Wildschwein Wolf KONTINENT -----------Amerika Amerika Europa Afrika Afrika Australien Australien Afrika Europa Afrika Asien Asien Europa Europa NAME -----------Löwe Elefant Nashorn Giraffe Bär Bison Panda Tiger Koala Känguruh Murmeltier Wolf Bär Wildschwein KONTINENT -----------Afrika Afrika Afrika Afrika Amerika Amerika Asien Asien Australien Australien Europa Europa Europa Europa Übungsskriptum Einführung in die Datenverarbeitung, Abschnitt 42 Seite 2 Übungsskriptum Einf.i.d.DV DB - Structured Query Language [DB-SQL] KONTINENT -----------Afrika Afrika Afrika Afrika Amerika Amerika Asien Asien Australien Australien Europa Europa Europa Europa NAME -----------Elefant Giraffe Löwe Nashorn Bison Bär Panda Tiger Koala Känguruh Bär Murmeltier Wildschwein Wolf NAME -----------Giraffe Nashorn Elefant Löwe KONTINENT -----------Afrika Afrika Afrika Afrika NAME -----------Bär Bär KONTINENT -----------Europa Amerika NAME -----------Giraffe Nashorn Elefant Löwe Krokodil KONTINENT -----------Afrika Afrika Afrika Afrika Afrika Bei den Inhalten sieht es aber anders aus, weder bei 'AFRIKA' noch bei 'afrika' werden Datensätze gefunden, nur bei der exakten Schreibweise 'Afrika': select * from TIERE where KONTINENT='AFRIKA'; select * from TIERE where KONTINENT='afrika'; NAME ------------ KONTINENT ------------ Selbstverständlich kann man WHERE-Bedingung und ORDER BY-Klausel auch kombinieren: Alle Tiere Afrikas, alphabetisch sortiert: Elefant Giraffe Löwe Nashorn Afrika Afrika Afrika Afrika Giraffe Nashorn Känguruh Tiger Wildschwein Panda Bär Bison Elefant Koala Bär Wolf Murmeltier Löwe Krokodil Afrika Afrika Australien Asien Europa Asien Europa Amerika Afrika Australien Amerika Europa Europa Afrika Afrika Noch übersichtlicher wird das Ganze, wenn wir die Spalte KONTINENT zuerst ausgeben. Kein Problem, einfach nach dem SELECT die Spaltennamen in gewünschter Reihenfolge angeben. Und die ORDER BY – Klausel kann auch nach mehreren Spalten sortieren: select KONTINENT, NAME from TIERE order by KONTINENT, NAME; Bisher konnten wir uns zwar Spalten aussuchen, es wurden aber immer alle Datensätze angezeigt. Nun möchten wir die Datensätze einer Bedingung unterwerfen: Wir möchten nur afrikanische Tiere anzeigen lassen. "Selektiere alle Spalten der Tabelle TIER für die gilt: der Inhalt der Feldes KONTINENT ist gleich 'Afrika' ". select * from TIERE where KONTINENT='Afrika'; Funktioniert ja bestens. Nun möchten wir wissen, wo überall Bären vorkommen: select * from TIERE where NAME='Bär'; Wir wissen aus Erfahrung, dass Groß- und Kleinschreibung manchmal entscheidend ist. Um uns Klarheit zu verschaffen, machen wir folgende Experimente: Folgende zwei Statements liefern das gleiche Ergebnis: select * from TIERE where KONTINENT='Afrika'; SELECT * from tiere where kOnTiNeNt='Afrika'; Daran erkennen wir: Die Syntax von SQL ist nicht case-sensitive, das heißt, Groß- und Kleinschreibung der Befehle ist nicht relevant. Es wird auch im Allgemeinen Groß- und Kleinschreibung der Tabellen- und Feldnamen nicht entscheidend, obwohl es Umstände oder Systeme geben kann, wo das sehr wohl einen Unterschied macht, das sollten Sie unbedingt im Auge behalten! select * from TIERE where KONTINENT='Afrika' order by NAME; Da uns noch einige Lieblingstiere abgehen, fügen wir neue Datensätze in die Tabelle ein. Die Syntax ist ein bisserl umständlich: "Füge ein in Tabelle TIERE in die Felder NAME, KONTINENT und zwar die Werte 'Krokodil' und 'Afrika': insert into TIERE ( NAME, KONTINENT ) values ( 'Krokodil', 'Afrika' ); Das INSERT-Statement verrichtet seine Arbeit kommentarlos (solange keine Fehler auftreten). Wir brauchen daher wieder ein SELECT-Statement, um uns den neu eingefügten Datensatz anzeigen zu lassen: select * from tiere; Übung: Fügen Sie einige Tiere hinzu. © Robert Wiedermann | http://statedv.boku.ac.at/roberts_it-kurs-unterlagen/ | 09.05.2011 Übungsskriptum Einführung in die Datenverarbeitung, Abschnitt 42 Seite 3 Übungsskriptum Einf.i.d.DV DB - Structured Query Language [DB-SQL] Das Löschen von ganzen Datensätzen geschieht mit dem Befehl DELETE: "Lösche von der Tabelle ... alle Datensätze für die gilt … ". Aber Vorsicht, seien Sie sich immer bewusst, auf welche Datensätze die Bedingung zutrifft. Folgendes SQL-Statement würde Bären auf verschiedenen Kontinenten betreffen: delete from TIERE where NAME='Bär'; Durch ein SELECT überzeugen wir uns von der Wirksamkeit (oder auch von den Nebenwirkungen ;-) unseres DELETE-Statements. Falls Sie die Bären wirklich entfernt haben, fügen Sie sie bitte zur Wiederholung des INSERT-Statements wieder ein. Um Daten zu ändern, benötigen wir den Befehl UPDATE: "Aktualisierte die Tabelle TIERE und setze das Feld NAME auf den Wert 'Braunbär' für alle Datensätze für die gilt … " update TIERE set NAME='Braunbär' where NAME='Bär' and KONTINENT='Europa'; Durch ein SELECT überzeugen wir uns von der Wirksamkeit unseres UPDATEStatements: select * from TIERE ; Giraffe Nashorn Tiger Wildschwein Panda Bison Elefant Koala Wolf Murmeltier Löwe Krokodil Braunbär Bär Afrika Afrika Asien Europa Asien Amerika Afrika Australien Europa Europa Afrika Afrika Europa Amerika Das % steht für beliebige Zeichen (wie * in in der Kommandozeile), LIKE 'A%' selektiert alle, die mit 'A' beginnen. select * from tiere where kontinent like 'A%'; Datensätze zählen: Wie viele Tiere in Afrika? select count(*) from tiere where kontinent='Afrika'; kontinent='Afrika'; Beenden mit: .quit oder .exit (die Punkt-Befehle sind SQLite-spezifisch, gibt es in anderen DB nicht) SQL wird intern in fast allen üblichen Datenbanken verwendet. Sie sollten daher die grundlegende Syntax und Logik verstehen lernen. Beispiele für Prüfungsfragen: Was macht das UPDATE-Statement? Wie kann man Teilmengen von Datensätzen selektieren? Was verstehen Sie unter einem Datensatz? Was verstehen Sie unter einem Feld? Wie ist eine Datenbanktabelle aufgebaut? Wie kann man einen bestehenden Datensatz ändern? Wie kann man Datensätze löschen? Wie fügt man Datensätze zu einer Tabelle hinzu? Was bewirkt die WHERE-Klausel? Wie kann man die Ausgabe sortieren lassen? Wie kann man Kriterien verknüpfen? Kann man mit einem einzelnen INSERT-Statement mehrere Datensätze einfügen? Ist Groß-/Kleinschreibung relevant, und wenn ja, wo? Wie formuliert man: "alle Spalten"? Wie kann man alle Zeilen einer Tabelle ausgeben lassen? Mit welchem Zeichen muss jedes SQL-Statement abgeschlossen werden? Wie kann man alle Tiere, die mit 'B' beginnen, selektieren? Wie kann man alle europäischen Tiere selektieren? Wie kann man die Anzahl aller Datensätze einer Tabelle ermitteln? Was bedeutet "case sensitive"? Wie sieht das SQL-Statement aus, mit dem Sie einen Elefanten in Asien hinzufügen können? © Robert Wiedermann | http://statedv.boku.ac.at/roberts_it-kurs-unterlagen/ | 09.05.2011 Übungsskriptum Einführung in die Datenverarbeitung, Abschnitt 42 Seite 4