vorheriges KapitelInhaltsverzeichnisIndexInfoseite



D


Lösungen

Antworten für Tag 1

Antworten für Tag 2

Antworten für Tag 3

Antworten für Tag 4

Antworten für Tag 5

Antworten für Tag 6

Antworten für Tag 7

Antworten für Tag 8

Antworten für Tag 9

Antworten für Tag 10

Antworten für Tag 11

Antworten für Tag 12

Antworten für Tag 13

Antworten für Tag 14

Antworten für Tag 15

Antworten für Tag 16

Antworten für Tag 17

Antworten für Tag 18

Antworten für Tag 19

Antworten für Tag 20

Antworten für Tag 21



Antworten für Tag 1


Antworten zu den Kontrollfragen

1. SQL bestimmt, was und nicht wie etwas zu tun ist. Der Algorithmus zur Lösung der SQL-Anfrage ist in der Datenbank implementiert. Diese Eigenschaft stellt einen großen Vorteil für die plattform- und sprachunabhängige Entwicklung dar.


2. Wenden Sie die 12 Regeln von Dr. Codds an (wir wissen, daß es eigentlich 13 sind).


3. Per SQL lassen sich Informationen in einer Datenbank auswählen, einfügen, modifizieren und löschen, Funktionen der Systemsicherheit und Benutzerberechtigungen auf Tabellen und Datenbank ausführen, die Online-Transaktionsverarbeitung innerhalb einer Anwendung behandeln, gespeicherte Prozeduren und Trigger erstellen, um den Anwendungscode zu reduzieren, sowie Daten zwischen verschiedenen Datenbanken übertragen.


4. Bei der Normalisierung überführt man komplexe Strukturen der darüberliegenden Ebene in einfachere Strukturen und verringert Wiederholungen.



Lösung zur Übung

(Hier kann keine Lösung angegeben werden, da die Antwort von Ihrer Datenbank abhängig ist.)



Antworten für Tag 2


Antworten zu den Kontrollfragen

1. Der einzige Unterschied zwischen beiden Anweisungen besteht in der Schreibweise. Die SQL-Syntax ist normalerweise nicht von der Groß-/Kleinschreibung abhängig. Allerdings sollte man genau auf die Schreibweise der Daten achten.


2. a. Es fehlt die FROM-Klausel. Die beiden obligatorischen Komponenten einer SELECT-Anweisung sind SELECT und FROM.


b. Es fehlt das Semikolon, das eine SQL-Anweisung abschließt. (In ISQL von Borland ist das Semikolon allerdings optional.)


c. Zwischen den Spaltennamen muß jeweils ein Komma stehen: Select betrag, name, zahl_empf FROM schecks;


3. Alle Anweisungen funktionieren.



Lösungen zu den Übungen

1. SELECT SCHECK#, BEMERKUNGEN FROM SCHECKS;


2. SELECT BEMERKUNGEN, SCHECK# FROM SCHECKS;


3. SELECT DISTINCT BEMERKUNGEN FROM SCHECKS;



Antworten für Tag 3


Antworten zu den Kontrollfragen

1. SELECT * FROM FREUNDE WHERE NACHNAME LIKE 'M%';


2. SELECT * FROM FREUNDE
WHERE STAAT = 'IL'
AND VORNAME = 'AL';


3. Verwenden Sie INTERSECT. Diese Anweisung gibt die Zeilen zurück, die beiden Abfragen gemeinsam sind.


SELECT TEILNR FROM TEIL1
INTERSECT
SELECT TEILNR FORM TEIL2;


4. WHERE a BETWEEN 10 AND 30;


5. Es wird nichts zurückgegeben, da beide Bedingungen nicht TRUE sind.



Lösungen zu den Übungen

1.


SQL> SELECT VORNAME || 'AUS' NAME, STAAT
2 FROM FREUNDE
3 WHERE STAAT = 'IL'
4 AND
5 NACHNAME = 'BUNDY';


2.


SQL> SELECT NACHNAME || ', ' || VORNAME NAME,
2 VORWAHL || '-' || TELEFON TELEFON
3 FROM FREUNDE
4 WHERE VORWAHL BETWEEN 300 AND 400;



Antworten für Tag 4


Antworten zu den Kontrollfragen

1. INITCAP


2. Die Bezeichnungen Gruppenfunktion und Aggregatfunktion sind gleichbedeutend.


3. Ja. Diese Abfrage liefert die Gesamtzahl der Zeilen zurück.


4. Diese Abfrage funktioniert nicht, weil NACHNAME ein Zeichenfeld ist.


5. Die Funktion CONCAT und das Symbol ||.


6. Das Ergebnis 6 gibt die Anzahl der Datensätze in der Tabelle an.


7. Nein. Es fehlen die Klammern um NACHNAME,1,5. Außerdem empfiehlt es sich, der Spalte einen Alias zu geben. Die Anweisung sollte folgendermaßen aussehen:


SQL> SELECT SUBSTR(NACHNAME,1,5) NAME FROM NAME_TBL;



Lösungen zu den Übungen

1.


SQL> SELECT NAME FROM TEAMSTATS
2 WHERE (HITS/AB) < .25


NAME
-------------
HAMCOKER
CASEY


2.


SQL> SELECT SUBSTR(VORNAME,1,1)||'.'||
2 SUBSTR(M,1,1)||'.'||
3 SUBSTR(NACHNAME,1,1)||'.' INITIALEN, CODE
4 FROM ZEICHEN
5 WHERE CODE = 32;



Antworten für Tag 5


Antworten zu den Kontrollfragen

1. STARTING WITH


2. Die Klausel GROUP BY gruppiert die Daten der Ergebnismenge, die mit verschiedenen Funktionen manipuliert wurden. Die Klausel verhält sich wie die Klausel ORDER BY, da sie ebenfalls die Ergebnisse der Abfrage in der Reihenfolge der in GROUP BY aufgeführten Spalten anordnet.


3. Nein. Die Syntax stimmt nicht. Die Klausel GROUP BY muß vor ORDER BY stehen. Außerdem müssen alle ausgewählten Spalten in der Klausel GROUP BY aufgeführt sein.


4. Ja.


5. Ja. Die in der Klausel ORDER BY aufgeführten Spalten müssen nicht unbedingt in der SELECT-Anweisung erscheinen.



Lösungen zu den Übungen

1. Als Ausgangspunkt können Sie zunächst ermitteln, wie viele Mitarbeiter jedes Team hat:


SELECT TEAM, COUNT(TEAM)
FROM ORGDIAGRAMM
GROUP BY TEAM;


TEAM COUNT
=============== ===========

FORSCHUNG 2
KONSTRUKTION 2
MARKETING 3
PR 1


Vergleichen Sie das Ergebnis mit der Abfrage, die die Frage löst:


SELECT TEAM, COUNT(TEAM)
FROM ORGDIAGRAMM
WHERE KRANKHEIT >= 30
GROUP BY TEAM;


TEAM COUNT
=============== ===========

FORSCHUNG 1
KONSTRUKTION 1
MARKETING 1


Die Ausgabe zeigt die Anzahl der Mitarbeiter in jedem Team mit 30 oder mehr Krankheitstagen.


2.


SQL> SELECT SCHECK#, ZAHL_EMPF, BETRAG
2 FROM SCHECKS
3 WHERE SCHECK# = 1;


Das gleiche Ergebnis läßt sich auf verschiedene Arten erhalten. Können Sie weitere Anweisungen angeben?



Antworten für Tag 6


Antworten zu den Kontrollfragen

1. 5,000,000,000 Zeilen.


2. Es handelt sich um eine Equi Join (Gleichverbund). Die Auswahl bezieht sich auf die in beiden Tabellen übereinstimmenden mitarbeiter_ids.


3. a. Nein. Die Spalten und Tabellen sind nicht in der geeigneten Weise benannt. Denken Sie an die Aliasnamen für Spalten und Tabellen.


b. Nein. In der WHERE-Klausel ist keine Verknüpfung spezifiziert.


c. Ja. Die Syntax ist korrekt.


4. Die Verknüpfungen sollten vor den Bedingungen stehen.


5. Verknüpfungen lassen sich über mehrere Spalten erzeugen. Es kann sogar sein, daß man mit mehreren Spalten arbeiten muß, beispielsweise um die Eindeutigkeit einer Datenzeile herzustellen oder um spezielle Bedingungen für die abzurufenden Daten zu spezifizieren.



Lösungen zu den Übungen

1.


SELECT A.TEILNUM, A.BESCHREIBUNG,
B.TEILNUM, B.BESCHREIBUNG
FROM TEIL A, TEIL B
WHERE A.TEILNUM = B.TEILNUM
AND A.BESCHREIBUNG <> B.BESCHREIBUNG
AND A.BESCHREIBUNG > B.BESCHREIBUNG

TEILNUM BESCHREIBUNG TEILNUM BESCHREIBUNG
=========== ==================== =========== ====================

76 SCHALTUNG 76 ROAD BIKE


2. SQL> select b.bestdatum BEST_DATUM, b.name NAME, t.teilnum TEIL#,
t.preis PREIS, t.beschreibung BESCHREIBUNG
from bestellungen b,
teil t
where b.teilnum = t.teilnum
and b.bestdatum like '%SEP%'
order by BEST_DATUM;


3.


select b.bestdatum BESTDATUM, b.name NAME, t.teilnum TEILNUM,
b.menge MENGE
from bestellungen b,
teil t
where b.teilnum = t.teilnum
and b.bestdatum like '%SEP%';


Für diese Aufgabe gibt es noch weitere Lösungen.



Antworten für Tag 7


Antworten zu den Kontrollfragen

1. Die Ergebnismenge enthält keine Duplikate, da die Abfrage


SELECT ALL C.NAME, C.ADDRESS, C.STATE, C.ZIP
FROM CUSTOMER C
WHERE C.NAME IN


(die die Unterabfrage aufruft) nur die Zeilen zurückgibt, in denen NAME in der durch IN untersuchten Liste steht. Verwechseln Sie nicht diese einfache IN-Anweisung mit der komplexeren Verknüpfung.


2. a. Falsch. Alle genannten Aggregatfunktionen geben einen einzelnen Wert zurück.


b. Falsch. Die Implementierung bestimmt, wie viele Unterabfragen sich verschachteln lassen.


c. Falsch. Korrelierte Unterabfragen erlauben die Verwendung einer äußeren Referenz.


3. a. Nein. Es fehlen die Klammern um die Unterabfrage.


b. Nein. Die SQL-Engine kann nicht alle Spalten in der Tabelle TEIL mit dem Operator = korrelieren.


c. Ja. Diese Unterabfrage ist korrekt.



Lösung zur Übung

SELECT NAME, BESTDATUM
FROM BESTELLUNGEN
WHERE NAME >
(SELECT NAME
FROM BESTELLUNGEN
WHERE NAME = 'JACKS BIKE')

NAME BESTDATUM
========== ===========

TRUE WHEEL 15-MAY-1997
TRUE WHEEL 19-MAY-1997
TRUE WHEEL 2-SEP-1997
TRUE WHEEL 30-JUN-1997
LE SHOPPE 17-JAN-1997
LE SHOPPE 1-JUN-1997



Antworten für Tag 8


Antworten zu den Kontrollfragen

1. Die Syntax für das Löschen aller Datensätze aus der Tabelle SAMMLUNG lautet:


DELETE FROM SAMMLUNG;


Denken Sie daran, daß diese Anweisung alle Datensätze löscht. Man kann die zu löschenden Datensätze mit der folgenden Syntax näher spezifizieren:


DELETE FROM SAMMLUNG
WHERE WERT = 125


Diese Anweisung löscht alle Datensätze mit einem Wert von 125.


2. Diese Anweisung soll alle Datensätze aus TABELLE_2 in die Tabelle SAMMLUNG einfügen. Das Hauptproblem besteht hier in der Verwendung des Schlüsselwortes INTO mit der Anweisung INSERT. Beim Kopieren von Daten von einer Tabelle in eine andere ist mit folgender Syntax zu arbeiten:


INSERT SAMMLUNG
SELECT * FROM TABELLE_2;


Denken Sie auch daran, daß die Datentypen der aus TABELLE_2 ausgewählten Felder exakt mit den Datentypen und der Anordnung der Felder in der Tabelle SAMMLUNG übereinstimmen müssen.


3. Diese Anweisung vermischt die Funktion UPDATE (aktualisieren) mit der Funktion INSERT (einfügen). Um Werte in der Tabelle SAMMLUNG zu aktualisieren, ist die folgende Syntax zu verwenden:


UPDATE SAMMLUNG
SET NAME = 'EINTRITTSKARTE',
WERT = 25000,
BEMERKUNGEN = 'GEFUNDEN';


4. Aufgrund der falschen Syntax wird überhaupt nichts gelöscht. Das Sternchen (*) ist hier nicht erforderlich.


5. Alle Zeilen in der Tabelle SAMMLUNG werden gelöscht.


6. Alle Werte in der Tabelle SAMMLUNG für die Spalte WERT lauten jetzt 555, und alle Anmerkungen in der Tabelle SAMMLUNG heißen jetzt AUSGEHEND VON 525. Diese Anweisung liegt sicher nicht im Sinne des Erfinders!


7. Nein. Die Syntax ist nicht korrekt. Die Befehle INSERT und SET funktionieren nicht zusammen.


8. Ja. Die Syntax ist in Ordnung.



Lösungen zu den Übungen

1. Unabhängig von der verwendeten Implementierung sollte eine Fehlermeldung darauf hinweisen, daß die Datentypen der einzufügenden Daten nicht mit den Datentypen der Zieltabelle kompatibel sind.


2. Die genaue Syntax für das Exportieren oder Importieren von Daten entnehmen Sie bitte Ihrer Dokumentation. Bei wiederholten Import-Operationen sollte man alle Zeilen aus der Tabelle löschen. Testen Sie immer Ihre Dienstprogramme zum Exportieren/Importieren, bevor Sie sie auf die Produktionsdaten anwenden. Falls für die Spalten der Tabellen Eindeutigkeitsregeln definiert sind und Sie die Daten vor dem Import nicht aus diesen Tabellen löschen, werden Sie mit Fehlermeldungen wegen Verstößen gegen die Eindeutigkeit überschüttet.



Antworten für Tag 9


Antworten zu den Kontrollfragen

1. Falsch. Die meisten Systeme kennen einen Befehl wie ALTER DATABASE nicht. Die Struktur einer existierenden Tabelle ändert man mit dem Befehl ALTER TABLE.


2. Falsch. Der Befehl DROP TABLE ist nicht zum Befehl DELETE FROM <Tabellenname> äquivalent. Der Befehl DROP TABLE löscht die Tabelle zusammen mit ihrer Struktur vollständig aus der Datenbank, während DELETE FROM... nur die Datensätze aus der Tabelle entfernt. Die Struktur der Tabelle bleibt bei DELETE FROM in der Datenbank erhalten.


3. Richtig.


4. Diese Anweisung enthält zwei Probleme. Erstens taucht die Bezeichnung ID innerhalb der Tabelle wiederholt auf. Selbst wenn die Datentypen unterschiedlich sind, ist die mehrfache Verwendung eines Feldnamens innerhalb einer Tabelle unzulässig. Zweitens fehlt die schließende Klammer am Ende der Anweisung. Die Anweisung sollte folgendermaßen aussehen:


CREATE TABLE Tabelle_Neu (
ID NUMBER,
FELD1 char(40),
FELD2 char(80));


5. Der Befehl zum Modifizieren von Datentyp oder Länge eines Feldes lautet ALTER TABLE und nicht ALTER DATABASE.


6. Der Eigentümer der neuen Tabelle ist derjenige, der die Tabelle erstellt hat. Wenn Sie sich mit Ihrer ID angemeldet haben, ist Ihre ID der Eigentümer. Haben Sie sich zum Beispiel mit SYSTEM angemeldet, lautet der Eigentümer SYSTEM.


7. Der Datentyp VARCHAR2 stellt die beste Wahl dar. Das folgende Beispiel zeigt, was beim Datentyp CHAR passiert, wenn die Länge der Daten variiert:


SQL> SELECT *
2 FROM NAME_TBL;

NACHNAME VORNAME
--------------- ---------------
JONES NANCY
SMITH JOHN

2 Zeilen ausgewählt.

SQL> SELECT NACHNAME
2 FROM NAME_TBL
3 WHERE NACHNAME LIKE '%MITH';

Es wurden keine Zeilen ausgewählt


Der Name SMITH existiert zwar in der Tabelle, die Suche verläuft aber negativ, da die Spalte NACHNAME vom Typ CHAR ist und Leerzeichen nach SMITH bis zur vollen Feldbreite aufgefüllt werden. Die SELECT-Anweisung berücksichtigt diese Leerzeichen nicht. Mit der folgenden Anweisung läßt sich SMITH finden:

SQL> SELECT NACHNAME
2 FROM NAME_TBL
3 WHERE NACHNAME LIKE '%MITH%';

NACHNAME
---------------
SMITH

1 Zeile wurde ausgewählt.


Durch das hinzugefügte Prozentzeichen (%) nach MITH kann die SELECT-Anweisung SMITH mit den anhängigen Leerzeichen nach dem Namen ermitteln.

Wenn Sie Ihre Tabellen anlegen, sollten Sie die Datentypen genau planen, um derartige Situationen zu vermeiden. Vergewissern Sie sich, wie die einzelnen Datentypen reagieren. Wenn man 30 Bytes für eine Spalte zuweist und einige Werte in der Spalte weniger als 30 Bytes enthalten, füllt dann der betreffende Datentyp die restlichen Bytes bis zur Länge von 30 Zeichen mit Leerzeichen auf? In diesem Fall muß man die Auswirkungen auf die SELECT-Anweisung berücksichtigen. Es sind also Kenntnisse der Daten und deren Struktur erforderlich.

8. Ja. Solange nicht der Eigentümer oder das Schema gleich ist.



Lösungen zu den Übungen

1. Um die Tabellen zu erstellen, sollten Sie mit dem Befehl CREATE TABLE arbeiten. Mögliche SQL-Anweisungen sehen etwa folgendermaßen aus:


SQL> CREATE TABLE BANK (
2 KONTO_ID NUMBER(30) NOT NULL,
3 BANK_NAME VARCHAR2(30) NOT NULL,
4 ADRESSE VARCHAR2(30) NOT NULL,
5 STADT VARCHAR2(15) NOT NULL,
6 STAAT CHAR(2) NOT NULL,
7 ZIP NUMBER(5) NOT NULL);

SQL> CREATE TABLE KONTOTYP (
2 KONTO_ID NUMBER(30) NOT NULL,
3 GIRO CHAR(30),
4 DEPOT CHAR(30));


2. SQL> ALTER TABLE RECHNUNGEN DROP PRIMARY KEY;
SQL> ALTER TABLE RECHNUNGEN ADD (PRIMARY KEY (KONTO_ID));
SQL> ALTER TABLE FIRMA ADD (PRIMARY KEY (KONTO_ID));


3. Da wir die Tabellen in der vorherigen Übung geändert und die Spalte KONTO_ID als Schlüsselfeld festgelegt haben, lassen sich alle Tabellen über diese Spalte verknüpfen. Man kann die Tabellen - auch alle fünf Tabellen - in jeder Kombination verknüpfen. Vergessen Sie nicht, die Spalten und Tabellen vollständig zu bezeichnen.



Antworten für Tag 10


Antworten zu den Kontrollfragen

1. Je nach verwendeter Datenbank erhalten Sie eine Fehlermeldung, und es wird kein Index erzeugt. Die Felder, aus denen sich ein eindeutiger Index aufbaut, müssen einen eindeutigen Wert ergeben.


2. a. Falsch. Nur Indizes belegen physikalisch Platz.


b. Falsch. Wird eine Tabelle aktualisiert, zeigt die Ansicht die aktualisierten Daten.


c. Falsch. Manchmal können zu viele Indizes die Abfragen verlangsamen.


3. Nein. Die Klammern sind nicht erforderlich. Außerdem ist das Wort ALL durch ein Sternchen (*) zu ersetzen.


4. Nein. Etwas wie eine eindeutige Sicht gibt es nicht.


5. Nein. Die korrekte Syntax lautet:


drop view offen;


6. Ja. Die Syntax ist korrekt.



Lösungen zu den Übungen

1. Überprüfen Sie den Systemkatalog Ihrer Implementierung in bezug auf Tabellen, die sich nach Informationen über Sichten abfragen lassen.


2. Microsoft Access bietet den Entwicklern grafische Werkzeuge, um Indizes in eine Tabelle aufzunehmen. Diese Indizes können mehrere Felder kombinieren, und die Sortierreihenfolge läßt sich ebenfalls grafisch einstellen. Bei anderen Systemen muß man die Anweisung CREATE INDEX auf der Befehlszeile eingeben.


3. Indizes verbessern die Leistungsbilanz, wenn die Operation eine kleine Teilmenge von Datensätzen zurückgibt. Wenn Abfragen einen größeren Teil der Datensätze einer Tabelle liefern, sind die durch Indizes erzielbaren Leistungsgewinne zu vernachlässigen. In bestimmten Fällen kann die Verwendung von Indizes sogar die Abfragen verlangsamen.



Antworten für Tag 11


Antworten zu den Kontrollfragen

1. Nein. Beim Verschachteln von Transaktionen bricht jede Rollback-Operation alle momentan in der Verarbeitung befindlichen Transaktionen ab. Die Ergebnisse aller Transaktionen werden tatsächlich erst gespeichert, wenn man die äußere Transaktion bestätigt hat.


2. Ja. Der Programmierer kann Anweisungen bis zu einem definierten Sicherungspunkt absichern. Falls gewünscht, kann man dann die Transaktion bis zu diesem Sicherungspunkt rückgängig machen, statt bis zum Beginn der Transaktion zurückgehen zu müssen.


3. Ein COMMIT-Befehl läßt sich allein oder in der Transaktion ausführen.


4. Ja und Nein. Man kann den Befehl zwar ausführen, er macht aber nicht die Änderungen rückgängig.


5. Nein. Ein Sicherungspunkt ist nur in Verbindung mit einem ROLLBACK-Befehl wirksam. Der ROLLBACK-Befehl macht dann nur die Änderungen rückgängig, die nach dem Sicherungspunkt ausgeführt wurden.



Lösungen zu den Übungen

1. SQL> SET TRANSACTION;
INSERT INTO KUNDEN VALUES
('SMITH', 'JOHN');
SQL> COMMIT;


2. SQL> SET TRANSACTION;
UPDATE SALDEN SET SALDO_AKT = 25000;
SQL> COMMIT;


Die Anweisung ist korrekt und funktioniert. Allerdings haben Sie gerade den Kontostand aller Kunden auf $25.000 aktualisiert!


3. Die Anweisung ist korrekt. Es wird nichts eingefügt.



Antworten für Tag 12


Antworten zu den Kontrollfragen

1. Die Rolle CONNECTION ist nicht vorhanden. Die richtige Syntax lautet:


SQL> GRANT CONNECT TO DAVID;


2. Diese Aussage ist nur richtig, wenn die Anweisung DROP USER Benutzername CASCADE ausgeführt wird. Die Option CASCADE weist das System an, alle diesem Benutzer gehörenden Objekte sowie diesen Benutzer zu löschen.


3. Aus Ihrer Tabelle kann jeder auswählen, selbst Benutzer, denen Sie keinen Einblick in Ihre Daten gewähren möchten.


4. Ja. Diese Syntax erzeugt einen Benutzer. Allerdings erhält der Benutzer die Standardeinstellungen, die gegebenenfalls nicht wünschenswert sind. Informieren Sie sich über diese Einstellungen in der Dokumentation zu Ihrem Datenbanksystem.


5. Nein. Es fehlt das Schlüsselwort USER. Die korrekte Syntax lautet:


SQL> ALTER USER RON
IDENTIFIED BY RON;


6. Ja. Die Syntax ist korrekt.


7. Nur Benutzer mit dem SELECT-Privileg für Ihre Tabelle können aus dieser Tabelle auswählen.



Lösungen zu den Übungen

(Bitte selbständig erledigen.)



Antworten für Tag 13


Antworten zu den Kontrollfragen

1. Falsch. Microsoft Visual C++ verkapselt die ODBC-Bibliothek in einem Satz von C++-Klassen. Diese Klassen bieten eine Schnittstelle zu den ODBC-Funktionen auf höherer Ebene, was in einem leichter anzuwendenden Satz von Funktionen resultiert. Allerdings ist die Funktionalität als Ganzes etwas eingeschränkt. Wenn man das ODBC Software Development Kit (SDK) kauft (das Sie als Mitglied des Microsoft Developers Network erhalten), können Sie das API direkt aus einer Visual-C++-Anwendung heraus aufrufen.


2. Falsch. Das ODBC API residiert in DLLs, die sich mit verschiedenen Sprachen binden lassen, einschließlich Visual Basic von Microsoft und Object Pascal von Borland.


3. Falsch. Statisches SQL erfordert einen Präcompiler. Dynamisches SQL ist, was der Name verspricht: dynamisch. Die mit dynamischem SQL erstellten SQL-Anweisungen lassen sich zur Laufzeit vorbereiten und ausführen.


4. SQL Server kennzeichnet mit dem Nummernzeichen (#) temporäre Tabellen.


5. Der Cursor ist freizugeben. Die Syntax lautet:


SQL> deallocate cursor Cursorname;


6. Nein. Trigger werden bei UPDATE, DELETE oder INSERT ausgeführt.


7. Nein. Der Trigger wird automatisch gelöscht, wenn die Tabelle gelöscht wird.



Lösungen zu den Übungen

(Bitte selbständig ausführen.)



Antworten für Tag 14


Antworten zu den Kontrollfragen

1. In der Elementfunktion GetDefaultSQL des Objekts CRecordSet. Denken Sie daran, daß man den hier gespeicherten String zur Manipulation der Tabelle ändern kann.


2. Im Objekt TQuery.


3. ODBC steht für Open Database Connectivity. Diese Technik erlaubt Windows-basierten Programmen, auf eine Datenbank über einen Treiber zuzugreifen.


4. Delphi stellt eine skalierbare Schnittstelle für verschiedene Datenbanken bereit.



Lösungen zu den Übungen

1. Ändern Sie den Rückgabewert von GetDefaultSQL, wie es das folgende Codefragment zeigt:


CString CTyssqlSet::GetDefaultSQL()
{
return " SELECT * FROM KUNDE ORDER DESC BY STAAT ";
}


2. (Bitte selbständig lösen.)



Antworten für Tag 15


Antworten zu den Kontrollfragen

1. Beim Optimieren einer SQL-Anweisung strebt man sozusagen den Weg des geringsten Widerstandes an, indem man die Anweisung sorgfältig plant und die Elemente innerhalb der Klauseln in geeigneter Weise anordnet.


2. Überhaupt nicht. Speichern Sie nach Möglichkeit immer Tabellen und Indizes separat, um den Konkurrenzbetrieb von Datenträgern zu vermeiden.


3. Um den Zugriff auf die Daten effizienter zu gestalten (den Weg des geringsten Widerstandes zu gehen).


4. Bei der vollständigen Suche wird die Tabelle zeilenweise gelesen, während ein Index direkt auf eine bestimmte Zeile zeigt.


5. Eine vollständige Tabellensuche läßt sich vermeiden, indem man einen Index erzeugt oder die indizierten Bedingungen in einer SQL-Anweisung neu anordnet.


6. Zu den Leistungsbremsen gehören vor allem:



Lösungen zu den Übungen

1. Die SQL-Anweisung sollten Sie etwa nach dem folgenden Beispiel neu formatieren. Wenden Sie dabei Ihre bevorzugten Formatkonventionen einheitlich an.


SELECT M.NACHNAME, M.VORNAME, M.INITIALEN,
M.ADRESSE, M.TELFON, G.GEHALT,
G.POSITION, M.SVN, G.EINST_DATUM
FROM MITARBEITER M,
GEHALTSLISTE G
WHERE M.SVN = G.SVN
AND M.NACHNAME LIKE 'S%'
AND G.GEHALT > 20000;


2. Entsprechend der Statistik sollte Ihre neue Abfrage wie folgt aussehen. Die restriktivste Bedingung ist NAME LIKE 'SMITH%', da sie die wenigsten Zeilen zurückgibt:


SELECT A.NAME, A.ADRESSE, A.STADT, A.STAAT, A.ZIP,
S.GESCHLECHT, S.PERS_STAND, S.GEHALT
FROM ADRESSEN A,
PERS_STAT_TBL S
WHERE A.PERSONAL_NR = S.PERSONAL_NR
AND S.PERS_STAND = 'S'
AND S.GESCHLECHT = 'M'
AND S.GEHALT >= 30000
AND A.STADT = 'INDIANAPOLIS'
AND A.NAME LIKE 'SMITH%';



Antworten für Tag 16


Antworten zu den Kontrollfragen

1. Durch Auswahl von USER_CATALOG oder CAT. Der Name des Systemkatalogobjekts ist von der konkreten Implementierung abhängig. Grundsätzlich sind aber in allen Versionen die gleichen Informationen über Objekte wie Tabellen und Ansichten verfügbar.


2. Datenbankdesign, Benutzerstatistiken, Prozesse, Objekte, Wachstum von Objekten, Leistungsstatistiken, gespeicherter SQL-Code, Datenbanksicherheit.


3. Leistungsstatistiken zeigen Wege auf, wie sich die Leistungsbilanz der Datenbank durch Modifikation von Datenbankparametern und Optimierung von SQL verbessern läßt. Dazu kann auch der Einsatz von Indizes und die Auswertung der Effizienz von Indizes gehören.


4. Tabellen, Indizes, Synonyme, Cluster, Ansichten.



Lösungen zu den Übungen

1. Holen Sie anhand der Datenbankdokumentation nähere Informationen zum Fehler ein.


2. Fragen Sie den Systemkatalog ab, um Angaben über die Tabelle, ihre momentane Größe, die Quoten des Benutzers für den Tabellenbereich und den im Tabellenbereich (für die Zieltabelle) zugewiesenen Platz zu erhalten.


3. Bestimmen Sie, wieviel Platz der Benutzer braucht, um das Einfügen der Daten abzuschließen.


4. Wo liegt das eigentliche Problem? Muß man den quotierten Tabellenbereich des Benutzers vergrößern, oder muß man dem Tabellenbereich mehr Platz zuweisen?


5. Wenn der Benutzer nicht über ausreichende Quoten verfügt, dann erhöhen Sie die Quoten. Wenn der aktuelle Tabellenbereich gefüllt ist, können Sie mehr Platz zuweisen oder die Zieltabelle in einen größeren Tabellenbereich verschieben.


6. Wenn Sie weder die Quoten des Benutzers erhöhen noch zusätzlichen Platz im Tabellenbereich zuweisen möchten, müssen Sie gegebenenfalls alte Daten löschen oder die Daten auf Band archivieren.


Diese Schritte sind nicht als Dogma zu verstehen. Der Aktionsplan kann je nach Firmenpolitik oder persönlicher Situation variieren.



Antworten für Tag 17


Antworten zu den Kontrollfragen

1. SQL-Skripts lassen sich aus Datenbanktabellen und dem Systemkatalog generieren.


2. Ja. Die SQL-Anweisung generiert ein SQL-Skript, aber das generierte Skript funktioniert nicht. In der literalen Zeichenfolge fehlt vor COUNT(*)ein SELECT:


SELECT 'SELECT COUNT(*) FROM ' || TABLE_NAME || ';'


Andernfalls erhalten Sie


COUNT(*) FROM TABLE_NAME;


als Ausgabe, was keine gültige SQL-Anweisung darstellt.


3. Auch hier wieder Jein. Die Anweisung generiert ein SQL-Skript, aber das generierte SQL ist unvollständig. Es ist noch ein Komma zwischen die Privilegien CONNECT und DBA zu setzen:


SELECT 'GRANT CONNECT, DBA TO ' || USERNAME || ';'


4. Ja. Die Syntax der Hauptanweisung ist gültig. Das generierte SQL gewährt die Privilegien CONNECT und DBA an alle ausgewählten Benutzer.


5. Falsch. Man braucht sich nicht um die Anzahl der ausgewählten Zeilen zu kümmern, da dies nicht zur Syntax der generierten Anweisungen gehört.


6. Falsch. Man leitet die Ausgaben in eine Befehlsdatei um. Den Namen der Datei legen Sie mit dem SPOOL-Befehl fest. Fehlt die Angabe der Dateierweiterung, nimmt Oracle die Standarderweiterung .SQL an. Innerhalb der generierten Datei können Sie allerdings andere Spool-Operationen vorsehen.


7. Richtig. Allein schon deshalb, um auf der sicheren Seite zu sein.


8. Der Befehl ED öffnet normalerweise den Standardeditor des jeweiligen Betriebssystems, zum Beispiel vi unter UNIX oder den Windows-Editor (Notepad).


9. Der Befehl SPOOL OFF schließt eine geöffnete Spool-Datei.



Lösungen zu den Übungen

1. SQL> SET ECHO OFF
SQL> SET FEEDBACK OFF
SQL> SPOOL GRANTS.SQL
SQL> SELECT 'GRANT SELECT ON HISTORY_TBL TO ' || USERNAME || ';'
2 FROM SYS.DBA_USERS
3 WHERE USERNAME IN ('JOHN','KEVIN','RYAN','RON','CHRIS')
4 /

GRANT SELECT ON HISTORY_TBL TO JOHN;
GRANT SELECT ON HISTORY_TBL TO KEVIN;
GRANT SELECT ON HISTORY_TBL TO RYAN;
GRANT SELECT ON HISTORY_TBL TO RON;
GRANT SELECT ON HISTORY_TBL TO CHRIS;


2. Solange die Syntax in den generierten Anweisungen korrekt ist, gibt es praktisch keine falschen Antworten.


Bevor Sie mit generierten SQL-Anweisungen vorhandene Daten oder Datenbankstrukturen modifizieren, sollten Sie die in diesem Kapitel dargestellten Konzepte sicher beherrschen.


Antworten für Tag 18


Antworten zu den Kontrollfragen

1. Ein Datenbanktrigger führt die festgelegte Aktion aus, wenn Daten in einer spezifizierten Tabelle manipuliert werden. Bei Änderungen an einer Tabelle kann man zum Beispiel mit einem Trigger eine Datenzeile in eine Protokolltabelle einfügen, um die Änderungen später zu überprüfen.


2. Verwandte Prozeduren lassen sich zusammen in einem Paket speichern.


3. Richtig.


4. Falsch. DDL läßt sich in einer PL/SQL-Anweisung nicht verwenden. Es empfiehlt sich nicht, strukturelle Änderungen an einer Datenbank zu automatisieren.


5. Die Textausgabe ist nicht direkt ein Teil der PL/SQL-Sprache, wird aber vom Standardpaket DBMS_OUTPUT unterstützt.


6. Die Abschnitte DECLARE, PROCEDURE und EXCEPTION.


7. DECLARE, OPEN, FETCH, CLOSE.



Lösungen zu den Übungen

1. DECLARE
Stundenlohn number(4,2);


2. DECLARE
cursor c1 is
select * from kunden
where stadt = 'INDIANAPOLIS';


3. DECLARE
UnbekannterCode EXCEPTION;


4. IF ( CODE = 'A' ) THEN
update BETRAG_TABELLE
set BETRAG = 10;
ELSEIF ( CODE = 'B' ) THEN
update BETRAG_TABELLE
set BETRAG = 20;
ELSE
raise UnbekannterCode;
END IF;



Antworten für Tag 19


Antworten zu den Kontrollfragen

1. Falsch. Das Wort SQL ist nicht per Copyright geschützt. Die erwähnten Produkte gehen zum großen Teil mit dem ANSI-Standard konform, erfüllen aber nicht alle Punkte dieses Standards.


2. Richtig. Statisches SQL erfordert einen Präcompiler, und die Abfragen lassen sich nicht zur Laufzeit vorbereiten. Demzufolge ist statisches SQL nicht so flexibel wie dynamisches SQL. Da aber die Abfrage bei statischem SQL bereits verarbeitet ist, kann die Leistungsbilanz besser aussehen.



Lösungen zu den Übungen

1. Da sich nahezu alles von Tag 19 mit Transact-SQL beschäftigt, sind wir auf die vielen anderen Erweiterungen zu ANSI SQL nicht eingegangen. Die meisten Dokumentationen, die zum Lieferumfang der Datenbankprodukte gehören, erläutern ausführlich die bereitgestellten SQL-Erweiterungen. Denken Sie daran, daß die Verwendung dieser Erweiterungen die Portierung Ihrer Abfragen auf andere Datenbanken schwieriger gestaltet.


2. Diese Operation erfordert eine IF-Anweisung. Solange Sie die Syntax der heute behandelten logischen Anweisungen (IF-Anweisungen) beachten, gibt es praktisch keine falschen Antworten.



Antworten für Tag 20


Antworten zu den Kontrollfragen

1. Mit SET-Befehlen lassen sich die in einer SQL-Sitzung verfügbaren Einstellungen ändern.


2. Ja. Ihr Skript kann Parameter von einem Benutzer entgegennehmen und an Variablen übergeben.


3. Die Gruppen werden Sie wahrscheinlich nach Kunden unterteilen, da Sie aus der Tabelle KUNDEN auswählen.


4. Die einzigen Einschränkungen bestehen darin, daß der Text in der Datei LOGIN.SQL gültige Befehle von SQL und SQL*Plus darstellen muß.


5. Falsch. Die Funktion DECODE verhält sich ähnlich wie eine IF...THEN-Anweisung.


6. Falsch. Die neue Ausgabe überschreibt die ursprüngliche Datei.



Lösungen zu den Übungen

1. SQL> compute sum of count(*) on report
SQL> break on report
SQL> select ART_ID, ART_NAME, EINZELPREIS, count(*)
2 from ARTIKEL
3 group by ART_ID, ART_NAME, EINZELPREIS;


2. SQL> set heading off
SQL> select to_char(sysdate,' "Heute ist "Day", der" dd. Month yyyy')
2 from dual;


3. Der gesamte Ablauf stellt sich wie folgt dar:


SQL> l
1 select *
2 from auftraege
3 where kunden_id = '001'
4* order by kunden_id
SQL> l2
2* from auftraege
SQL> c/auftraege/kunde
2* from kunde
SQL> l4
4* order by kunden_id
SQL> append DESC
4* order by kunden_id DESC
SQL>


Beachten Sie beim Bearbeiten der Zeile 4, daß zwischen dem Befehl append und dem anzufügenden DESC zwei Leerzeichen stehen müssen. Wenn Sie nur ein Leerzeichen schreiben, lautet die resultierende Zeile:


4* order by kunden_idDESC



Antworten für Tag 21


Antworten zu den Kontrollfragen

1. Im ersten Moment sagen Sie sich: »Natürlich hat er sein Kennwort vergessen.« Dieser Fehler kann aber auch entstehen, wenn eine Frontend-Anwendung keine Verbindung zur Datenbank herstellen konnte. Wenn Sie jedoch genau wissen, daß die Datenbank funktionsfähig ist, ändern Sie einfach das Kennwort mit dem Befehl ALTER USER und teilen dem Benutzer das neue Kennwort mit.


2. Damit Tabellen nicht die Standardeinstellungen für die Speicherung annehmen, muß man die Speicherklausel einbinden. Andernfalls werden mittlere oder große Tabellen aufgefüllt und nehmen Ausmaße an, die zu einer Verschlechterung der Leistung führen. Darüber hinaus kann es zu Speichermangel kommen, was eine Unterbrechung Ihrer Arbeit nach sich zieht, bis der DBA das Platzproblem lösen kann.



Lösungen zu den Übungen

1. Da Sie als SYSTEM angemeldet sind, sollten Sie die Tabelle vollständig mit dem Eigentümer bezeichnen. Wenn Sie den Eigentümer der Tabelle nicht angeben, könnten Sie versehentlich eine Tabelle namens HISTORY im Schema SYSTEM löschen, falls diese existiert.


SQL> DROP TABLE JSMITH.HISTORY;


2. In Oracle-SQL ist DATE ein reserviertes Wort. Wenn Sie eine Spaltenüberschrift mit DATE bezeichnen wollen, müssen Sie das Wort in Anführungszeichen setzen: "DATE".



Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH.
Elektronische Fassung des Titels: SQL in 21 Tagen, ISBN: 3-8272-2020-3


vorheriges KapitelTop Of PageInhaltsverzeichnisIndexInfoseite