DB Structured Query Language (SQL)

Werbung
Ü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
Herunterladen