next Single Row Functions
up Einführung in PL / SQL Oracle 8i/9i
previous Einführung in PL / SQL Oracle 8i/9i
  Contents   Index

Subsections

Data Retrieval

Einfache SQL-Abfragen.


Kommentare

--
/*
*/


SELECT FROM - Spalten einer Tabelle selektieren

Eine der Hauptaufgaben in einer Datenbank ist das Abfragen der gewünschten Datensätze. Hierfür stellt SQL die SELECT ... FROM Anweisung zur Verfügung. Eine SELECT-Anweisung gibt als Ergebnismenge eine, mehrere oder alle Spalten einer Tabelle zurück (Auswahl).

Zwischen den beiden Schlüsselworten SELECT und FROM stehen die Spalten, die zurückgegeben werden sollen. Hier können auch mathematische Ausdrücke und Literale angegeben werden.

select spaltenname1, spaltenname2 from tabellenname;
Sollen alle Spalten selektiert werden, so setzen Sie anstelle der Spaltenname einfach den Stern *.
select * from dept;
Es werden alle Spalten der Tabelle dept angezeigt.
select deptno, dname from dept;
Es werden die Abteilungsnummern (deptno) und Abteilungsnamen (dname) aller Abteilungen angezeigt. Sollten sich in Aliasnamen Sonderzeichen oder Leerzeichen befinden, so ist der Aliasname in Anführungzeichen zu setzen.

Die Überschriften der Spalten können durch einen Alias angegeben werden (spaltenname AS aliasname). Das Wort AS kann bei Aliasnamen weggelassen werden.

select deptno as "Abteilungsnummer", dname as "Abteilungsname" from dept;
Es werden die Abteilungsnummern (deptno) und Abteilungsnamen (dname) aller Abteilungen angezeigt. Die Spaltenüberschrift von depto ist Abteilungsnummer und die Spaltenüberschrift von dname ist Abteilungsname.

Zwischen SELECT und FROM kann auch eine Zeichenkette stehen. Diese muß in einfache Anführungszeichen gesetzt werden. Zwischen SELECT und FROM kann auch ein arithmetischer Ausdruck stehen.

select empno as "Mitarbeiternummer", 
       ename as "Mitarbeitername",
       sal as "Gehalt",
       sal*1.3 as "Bruttogehalt" 
   from emp
;
Es werden die Spalten Mitarbeiternummer (empno), Mitarbeiternamen (ename), Gehalt (sal) und Gehalt*1.3 angezeigt. Mehrfache Zeilen werden durch DISTINCT direkt nach dem SELECT ausgeblendet.
select distinct job from emp;
Es werden alle Jobs (job) der Tabelle emp angezeigt. Da einige Mitarbeiter den gleichen Job haben, tauchen diese Jobs dementsprechend mehrfach auf. Die Duplikate werden durch DISTINCT nicht angezeigt. Eine Verkettung von Spalten ist mit || möglich.
select ename || ' ist ein ' || job from emp;
Es wird die Spalte ename, verkettet mit dem Literal ' ist ein' und mit job, angezeigt.


DESCRIBE - Tabellenstruktur anzeigen lassen

Häufig ist es wichtig, einen Überblick über den Aufbau einer Tabelle zu verschaffen. DESCRIBE beschreibt die Struktur der entsprechenden Tabelle und gibt Auskunft über Spaltennamen, Datentypen und NULL-Werten.
describe tabellenname;
describe employees;

Name    Null?      Typ
-------------------------------
EMPNO   NOT NULL   NUMBER(4)
ENAME              VARCHAR2(10)
JOB                VARCHAR2(9)
MGR                NUMBER(4)
HIRE               DATEDATE
SAL                NUMBER(7,2)
COMM               NUMBER(7,2)
DEPTNO             NUMBER(2)


WHERE - Zeilen der Ergebnismenge einschränken

Mit Hilfe des Schlüsselwortes WHERE ist es möglich, die Datensätze, die zurückgegeben werden sollen, einzuschränken. Hinter WHERE wird ein Ausdruck eingegeben, der jeweils ausgewertet wird und die Stati wahr (true) oder falsch (false) ausgibt. Die Datensätze, bei denen der Ausdruck wahr ergibt, werden als Ergebnismenge zurückgegeben. Eine Bedingung muss ein gültiger Ausdruck sein (z.B. job='MANAGER'). In diesem Ausdruck können folgende Vergleichsoperatoren benutzt werden (= gleich, >größer als, >= größer oder gleich, <kleiner, <= kleiner oder gleich, <>ungleich).
select spaltenname1, spaltenname2 from tabellenname where bedingung;
select ename, job from emp where job = 'MANAGER';
Ermittelt werden alle Mitarbeiter (ename), bei denen der Job Manager ist.
select * from emp where hiredate = '03.12.81';
Ermittelt werden alle Datensätze der Tabelle emp, bei denen das Einstellungsdatum (hiredate) 3.12.81 ist.
select * from emp where sal >= 1100;
Ermittelt werden alle Datensätze der Tabelle emp, bei denen das Gehalt größer bzw. gleich 1100 ist.
select ename, job from emp where job <> 'MANAGER';
Ermittelt werden alle Mitarbeiter (ename), bei denen der Job nicht Manager ist.


BETWEEN

Der Vergleichsoperator BETWEEN ermittelt alle Datensätze zwischen zwei Vergleichswerten, einschließlich der Randwerte.
select * from emp where sal between 1000 and 2000;
Ermittelt werden alle Datensätze der Tabelle emp, bei denen das Gehalt >= 1000 und <= 2000 ist.


IS NULL

Mit IS NULL kann man Datenfelder auf den Wert NULL abtesten.
Mit "... = NULL" wäre dies nicht möglich, da hier auf das Vorkommen der Zeichenkette NULL getestet wird.
select empno, ename from emp where comm is null;
Ermittelt werden alle Mitarbeiter (ename) und deren Mitarbeiternummer (empno), bei denen die Spalte comm den Wert NULL besitzt.


IN

Der Vergleichsoperator IN vergleicht mit einer Liste.
select * from employees where city in ('London','Berlin');
Es werden alle Datensätze angezeigt, bei denen die Spalte city gleich London oder Berlin ist.

Übungen 01

Übungen siehe Seite [*].


LIKE - Vergleich mit Platzhaltern % _

Wenn Sie in der Unix-Shell nicht genau wissen, wonach Sie suchen wollen, benutzen Sie in der Regel Platzhalter. Als Platzhalter für ein Zeichen benutzen Sie dabei das Fragezeichen ? und als Platzhalter für eine beliebige Zeichenkette benutzen Sie den Stern *. In Oracle-SQL verhält sich dies ein wenig anders. Als Platzhalter für ein Zeichen gilt hier der Unterstrich _ und als Platzhalter für eine beliebige Zeichenkette dient das Prozentzeichen %.
select * from emp where ename like 'F%'
Ermittelt werden alle Datensätze der Tabelle emp, bei denen der Name mit 'F' beginnt.
select * from emp where ename like 'F_rd'
Ermittelt werden alle Datensätze der Tabelle emp, bei denen der Name mit 'F' beginnt und an dritter und vierter Stelle 'rd' steht.
select * from emp where ename like '%g'
Ermittelt werden alle Datensätze der Tabelle emp, bei denen der Name mit 'g' endet.


ESCAPE

Durch ESCAPE kann man nach _ und % suchen und vergleichen.
select * from emp where ename like '%/_%' ESCAPE '/'
Ermittelt werden alle Datensätze der Tabelle emp, bei denen ein Unterstrich _ enthalten ist.

Übungen 02

Übungen siehe Seite [*].


AND, OR, NOT - Logische Operatoren

SQL ist eine mengenorientierte Abfragesprache. Daher baut diese Sprache auch auf Boolsche Logik auf. Der Ausdruck im WHERE-Kriterium kann logische Operatoren, wie AND, OR und NOT beinhalten. Beachten sollten Sie, dass der Ausdruck hinter WHERE wahr ergeben muss, um den Datensatz zurückgeben zu können. Bei AND müssen beide Ausdrücke wahr sein, um als Ergebnis wahr zurückzuliefern. Bei OR muss lediglich ein Ausdruck wahr sein, um als Ergebnis wahr zurückzuliefern. NOT negiert das Ergebnis, das heißt, aus wahr wird falsch und aus falsch wird wahr.
select * from emp where sal > 1000 and sal < 3000;
Ermittelt werden alle Datensätze der Tabelle emp, bei denen das Gehalt größer als 1000 und kleiner als 3000 ist.
select * from emp where sal > 1000 and deptno = 30;
Ermittelt werden alle Datensätze der Tabelle emp, bei denen das Gehalt größer als 1000 und die Abteilungsnummer (deptno) 30 ist.
select * from emp where sal < 1000 or sal > 3000;
Ermittelt werden alle Datensätze der Tabelle emp, bei denen das Gehalt kleiner als 1000 oder größer als 3000 ist.
select * from emp where not sal > 1000;
Ermittelt werden alle Datensätze der Tabelle emp, bei denen das Gehalt nicht größer als 1000 ist.
select * from emp where job not in ('CLERK', 'MANAGER');
Ermittelt werden alle Datensätze der Tabelle emp, bei denen der Job weder CLERK noch MANAGER ist.


Prioritätsregeln

Wie schon aus der Schulmathematik bekannt, geht Punktrechnung vor Strichrechnung. Bei SQL kommen nun neben dieser Regel auch noch die Logikoperatoren ins Spiel. Die Reihenfolge der Auswertung ist:
  1. Vergleichsoperatoren (=, <>, >=, <=).
  2. NOT
  3. AND
  4. OR
Die Reihenfolge der Anordnung spielt hierbei keine Rolle. Das heißt, sal >1000 and sal <3000 and sal <>500 entspricht sal <>500 and sal >1000 and sal <3000.
select * from emp where sal >= 1000 and sal <= 3000 or sal > 5000;
Diese Anweisung ermittelt die Mitarbeiter, deren Gehalt zwischen 1000 und 3000 liegt oder deren Gehalt größer als 5000 ist. Durch Klammersetzung kann die Reihenfolge der Abarbeitung verändert werden.
select * from emp where sal >= 1000 and (sal <= 3000 or sal > 5000);
Diese Anweisung ermittelt die Mitarbeiter, deren Gehalt entweder kleiner gleich 3000 oder größer 5000 ist. Es werden nur die Datensätze angezeigt, deren Gehalt zusätzlich größer gleich 1000 ist.


ORDER BY - Sortierung in SQL

Die Datenbanktheorie besagt, dass die Reihenfolge der Datensätze, die zurückgegeben werden, 'zufällig' ist. Das bedeutet, dass sich das Datenbankmanagementsystem das Recht vorbehält, die Datensätze in einer beliebigen Reihenfolge zurückzugeben.

Wird eine bestimmte Reihenfolge bei der Rückgabe der Datensätze gewünscht, so ist dies entsprechend durch ein Schlüsselwort ORDER BY anzugeben. Es können mehrere ORDER BY Spalten angegeben werden. Auch ist es möglich, anstelle des Spaltennamens hier den numerischen Spaltenindex anzugeben. Es kann auch nach einem Alias sortiert werden.

ASC hinter dem Sortierkriterium heißt aufsteigend sortieren. Standardmäßig wird aufsteigend sortiert. DESC hinter dem Sortierkriterium heißt absteigend sortieren.

Bei alphanumerischen Zeichen wird von A bis Z an den entsprechenden Stellen sortiert. Das früheste Datum wird bei aufsteigender Sortierung als erstes angezeigt. NULL-Werte werden bei aufsteigender Sortierung als letzte angezeigt und bei absteigender Sortierung demnach als erste.

select spaltenname1, spaltenname2 from tabellenname 
  order by spaltenname_x, spaltenname_y .. ;
select empno, ename from emp order by empno;
select empno, ename from emp order by empno asc;
Es werden die Mitarbeiter aufsteigend sortiert nach der Mitarbeiternummer (empno) angezeigt.
select empno, ename from emp order by empno desc;
Es werden die Mitarbeiter absteigend sortiert nach der Mitarbeiternummer (empno) angezeigt
select empno, ename from emp order by job,hiredate;
Es werden die Mitarbeiter aufsteigend sortiert nach ihrem Job (job) angezeigt. Bei Mitarbeitern mit gleichem Job wird nochmals aufsteigend nach dem Einstellungsdatum sortiert.
select empno as Mitarbeiternummer, ename from emp 
  order by Mitarbeiternummer
;
Es werden die Mitarbeiter aufsteigend sortiert nach der Mitarbeiternummer (empno) angezeigt. Als Sortierkriterium wurde hier der Alias einer Spalte benutzt.
select empno as Mitarbeiternummer, ename from emp order by 2;
Es werden die Mitarbeiter aufsteigend sortiert nach ihrem Namen (ename) angezeigt. Als Sortierkriterium wurde hier der Spaltenindex benutzt (2 Spalte zwischen select und from).
next Single Row Functions
up Einführung in PL / SQL Oracle 8i/9i
previous Einführung in PL / SQL Oracle 8i/9i
  Contents   Index


Stefan Hietel dama.go GmbH, Robert Warnke http://rowa.giso.de