Title: DQL

Feedback shared by this category's questions, if right: Die Antwort ist richtig.
Feedback shared by this category's questions, if partly right: Die Antwort ist teilweise richtig.
Feedback shared by this category's questions, if wrong: Die Antwort ist falsch.

Q: Ein Fremdschlüssel einer Relation ist in einer anderen Relation als Schlüssel definiert. Mittels eines [...] wird die Beziehung der Tupel über jeweils gleiche Werte gleicher Attributnamen hergestellt.

Ein Fremdschlüssel einer Relation ist in derselben Relation als Schlüssel definiert. Die Schlüssel-Fremdschlüssel-Beziehung wird mittels eines [...] hergestellt. Die Join-Bedingung wird durch [...] der semantisch passenden Attribute hergestellt.
A: natürlichen Joins; Self-Joins; Gleichheit der Werte
Gap 1 offers: natürlichen Joins; Equi-Joins; Outer Joins
Gap 2 offers: Theta-Joins; Self-Joins; natürlichen Joins; Kreuz-Produkts
Gap 3 offers: Gleichheit der Relation; Ungleichheit der Relation; Gleichheit der Werte; Ungleichheit der Werte; *
Feedback: Bei einem natürlichen Join werden Tupel selektiert, deren Werte ihrer gleich benamten Attribute gleich sind. Diese Bedingung ist möglich, da die Attributnamen nur innerhalb einer Relation unterschiedlich benamt werden müssen. Umgekehrt kann ein natürlicher Join mit SQL NATURAL JOIN nur bei Namensgleichheit der Attribute der Join-Bedingung angewendet werden. Aber auch innerhalb einer Relation kann eine Fremdschlüssel-Schlüssel-Beziehung für einen Join verwendet werden, einem Selbstjoin. Dabei stehen Tupel einer Relation mit anderen Tupeln derselben Relation in Beziehung, beispielsweise bei einer hierarchischen Beziehung wie in einer Unternehmensorganisation oder Teilelisten. Wir sprechen aber nicht von einem natürlichen Join, da die Attributnamen des Join unterschiedlich heißen. Stattdessen werden in der Joinbedingung die Attributnamen über einen Tabellenalias eindeutig referenziert und über Gleichheit der Werte – einen Equi-Join - selektiert. Eine SQL-Anweisung der folgenden Form macht hier keinen Sinn: -- nicht sinnvoll: SELECT […] FROM Tabelle1 NATURAL JOIN Tabelle1 Sinnvoll ist eine Anweisung der folgenden Form mit Tabellenalias A und B: -- sinnvoll: SELECT […] FROM Tabelle1 A, Tabelle1 B WHERE A.Schlüssel = B.Fremdschlüssel;

Q: Betrachten Sie eine Tabelle Spiel, in der die Ergebnisse der Bundesliga abgespeichert sind:

Spiel
Heimmannschaft | Gastmannschaft | Heimpunkte | Gastpunkte
Bayern München | Borussia Dortmund | 1 | 1
Borussia Dortmund | Bayern München | 0 | 3
Bayern München | Schalke | 3 | 0
Schalke | Bayern München | 0 | 3

Welche Abfrage beantwortet die folgende Frage: Welche Mannschaft hat die meisten Gastpunkte erreicht?
- SELECT Gastmannschaft, MAX(Gastpunkte) FROM ( SELECT Gastmannschaft, SUM(Gastpunkte) as Gastpunkte FROM Spiel GROUP BY Gastmannschaft )
- SELECT Gastmannschaft FROM Spiel WHERE SUM(Gastpunkte) > ALL ( SELECT SUM(Gastpunkte) FROM Spiel )
- SELECT Gastmannschaft FROM Spiel GROUP BY Gastmannschaft HAVING SUM(Gastpunkte) = MAX(Gastpunkte)
- SELECT Gastmannschaft FROM Spiel GROUP BY Gastmannschaft HAVING SUM(Gastpunkte)>= ALL ( SELECT SUM(Gastpunkte) FROM Spiel GROUP BY Gastmannschaft )
- Keine der Abfragen
A: SELECT Gastmannschaft FROM Spiel GROUP BY Gastmannschaft HAVING SUM(Gastpunkte)>= ALL ( SELECT SUM(Gastpunkte) FROM Spiel GROUP BY Gastmannschaft )
Feedback: Abfrage 1 ist syntaktisch falsch: Wenn die Aggregatfunktion MAX anwendet wird, dann kann keine 2. Spalte des Datensatzes selektiert werden. MAX liefert genau einen Wert, aber es kann mehrere Gastmannschaften geben, die diese maximale Toranzahl geschossen haben und damit ist die Anzeige nicht eindeutig. Es kann nicht ermittelt werden, welche der möglichen Mannschaften für den MAX-Wert angezeigt werden soll. Abfrage 2 ist syntaktisch falsch: Aggregatfunktionen können nicht in der WHERE-Klausel verwendet werden, nur in der SELECT-, HAVING- und GROUP BY-Klausel. Abfrage3 ist falsch: MAX muss in einer eigenen Unteranfrage (Sub-SELECT) ermittelt werden. Abfrage 4 ist richtig: Der obere und der untere SELECT ermittelt für die verschiedenen Länder die Summer ihrer Tore (gleiche Anfragen). Der >= ALL-Operator nimmt nur die Datensätze, die dem maximalen Wert in der Unteranfrage entspricht.

Q: Gegeben sei folgender Ausschnitt eines relationalen Schemas einer Datenbank:

Spieler (Spieler_id, Name, Adresse, Geburtsdatum)
Vereine (V_Kuerzel, Vereinsname, Ort, Gruendungsjahr )
Spiele (Spiel_id, Heim_V_Kuerzel, Gast_V_Kuerzel, Spieltag, Ergebnis, Anzahl_Zuschauer)
Spieleinsatz (Spiel_id, Spieler_id, von_Minute, bis_Minute)

Welche der angegeben SQL-Abfragen beantwortet/en die Frage: Welche Vereine (Kürzel, Name) haben wenigstens ein Auswärtsspiel, also wenigstens ein Spiel als Gastmannschaft, in der Rückrunde (Spieltag 18-34) absolviert?
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag BETWEEN 18 AND 34;
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag >= 18 AND <= 34;
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE spieltag BETWEEN 18 AND 34;
- SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 );
- SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 GROUP BY gast_v_kuerzel HAVING COUNT (*) >=1 );
A: SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag BETWEEN 18 AND 34;; SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag >= 18 AND <= 34;; SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 );; SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 GROUP BY gast_v_kuerzel HAVING COUNT (*) >=1 );
Feedback: Anfrage 3 ist semantisch falsch: Es wird hier das kartesische Produkt (Cross Join) der beiden Tabellen gebildet und nicht der Natural Join. Die übrigen Anfragen sind alle richtig.

Q: Was ist das Ergebnis der gesamten Bedingung, wenn sie über den folgenden Datensätzen ausgewertet wird?

WHERE geburtsdatum BETWEEN TO_DATE(01.01.1970 DD.MM.YYYY) AND TO_DATE(31.12.1980 DD.MM.YYYY) OR gehalt < 3000

Nachname | Vorname | Geburtsdatum | Gehalt | Ergebnis der Bedingung
Meier | Anton | 13.12.1980 | 2000,- | [...]
Meister | Elfriede | 31.01.1981 |  | [...]
Müller | Edwin |  | 1000,- | [...]
A: TRUE; UNKNOWN; TRUE
Gap 1 offers: TRUE; FALSE; UNKNOWN
Gap 2 offers: TRUE; FALSE; UNKNOWN
Gap 3 offers: TRUE; FALSE; UNKNOWN
Feedback: Beim 1. Datensatz werden beide Teilbedingungen zu TRUE ausgewertet, also TRUE OR TRUE und somit die das Gesamtergebnis ebenfalls TRUE. Beim 2. Datensatz wird die erste Teilbedingung zu FALSE ausgewertet, die zweite aber zu UNKNOWN, da die 2. Spalte leer ist (NULL). Die Bedingung lautet also FALSE OR UNKNOWN und das wird insgesamt zu UNKNOWN. Beim 3. Datensatz wird die zweite Teilbedingung zu TRUE ausgewertet, die erste aber zu UNKNOWN, da die 1. Spalte leer ist (NULL). Die Bedingung lautet also UNKNOWN OR TRUE und das wird insgesamt zu TRUE.

Q: Betrachten Sie die folgende Tabelle.

Tabelle
ROWNUM | ID | Name | Platz
1 | 1 | Karl |
2 | 2 | Hans | 20
3 |  |  |
4 | 3 |  | 15
5 | $ | Elli |

Welches Resultat liefert die Abfrage:
SELECT COUNT(*), AVG(Platz) FROM Tabelle;
- 3, 15
- 3, 20
- 5, 17.5
- 5, 20
A: 5, 17.5
Feedback: Die COUNT(*)-Funktion liefert 5 als Ergebnis, die AVG-Funktion berücksichtigt nur von NULL verschiedene Werte, also ist das Ergebnis 17.5.

Q: Sie wollen mit Hilfe einer Auftrags-/Kunden-Tabelle herausfinden, welche Kunden einen Auftrag aufgegeben haben.

Welche der folgenden Abfragen liefert das gewünschte Ergebnis?
- SELECT Kunden.Kun_Nr, Kunden.Vorname, Kunden.Nachname FROM Kunden WHERE EXISTS ( SELECT * FROM Auftraege WHERE Kunden.Kun_Nr = Auftraege.Kun_Nr );
- SELECT DISTINCT Kunden.Kun_Nr, Kunden.Vorname, Kunden.Nachname FROM Kunden, Auftraege WHERE Auftraege.Kun_Nr=Kunden.Kun_Nr;
- SELECT Kunden.Kun_Nr, Kunden.Vorname, Kunden.Nachname FROM Kunden WHERE EXISTS ( SELECT * FROM Auftraege );
- SELECT Kunden.Kun_Nr, Kunden.Vorname, Kunden.Nachname FROM Kunden, Auftraege WHERE Auftraege.Kun_Nr=Kunden.Kun_Nr;
- SELECT Kunden.Kun_Nr, Kunden.Vorname, Kunden.Nachname FROM Kunden WHERE Kunden_nr IN ( SELECT DISTINCT Kun_Nr FROM Auftraege );
- SELECT DISTINCT Kunden.Kun_Nr, Kunden.Vorname, Kunden.Nachname FROM Kunden, Auftraege;
A: SELECT Kunden.Kun_Nr, Kunden.Vorname, Kunden.Nachname FROM Kunden WHERE EXISTS ( SELECT * FROM Auftraege WHERE Kunden.Kun_Nr = Auftraege.Kun_Nr );; SELECT DISTINCT Kunden.Kun_Nr, Kunden.Vorname, Kunden.Nachname FROM Kunden, Auftraege WHERE Auftraege.Kun_Nr=Kunden.Kun_Nr;; SELECT Kunden.Kun_Nr, Kunden.Vorname, Kunden.Nachname FROM Kunden, Auftraege WHERE Auftraege.Kun_Nr=Kunden.Kun_Nr;; SELECT Kunden.Kun_Nr, Kunden.Vorname, Kunden.Nachname FROM Kunden WHERE Kunden_nr IN ( SELECT DISTINCT Kun_Nr FROM Auftraege );
Feedback: Eine Exists-Bedingung liefert den Wahrheitswert wahr, wenn der SELECT (hier SELECT * FROM auftraege) mindestens einen Datensatz ergibt. Das ist hier der Fall, falls die Auftraege-Relation nicht leer ist, beantwortet aber nicht die oben gestellte Frage.

Q: Betrachten Sie folgende Relationen:

Angestellte(Ang_Nr, Nachname, Ort, Abt_Nr, Jahresgehalt)
Abteilungen(Abt_Nr, Name, Ort, Leiter)

Welche SELECT-Abfragen verknüpfen alle Angestellten mit den Daten aus der Relation Abteilung, der sie angehören?
- SELECT * FROM Abteilungen NATURAL JOIN Angestellte;
- SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);
- SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr, Ort);
- SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr;
- SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Abteilungen.Ort = Angestellte.Ort;
A: SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);; SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr;
Feedback: SELECT * FROM Abteilungen NATURAL JOIN Angestellte; SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr, Ort); SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Abteilungen.Ort = Angestellte.Ort; Diese drei Anfragen haben zwar die gleiche Semantik, aber leider eine andere als die Aufgabenstellung: Welche Angestellte wohnen im gleichen Ort, in dem sie auch arbeiten?

Q: Was versteht man unter der Abkürzung DQL?

D [...]
Q [...]
L [...]
A: ata / Data; uery / Query; anguage / Language
Feedback: Die DQL (Data Query Language) besteht nur aus einer einzigen SQL-Anweisung, der SELECT-Anweisung.

Q: Welchen Wert gibt die SQL-Gruppenfunktion COUNT auf einer Tabelle test aus, wenn diese keine Zeilen enthält?
SELECT COUNT(*) FROM test;
- 0
- NULL
A: 0
Feedback: COUNT gibt immer einen numerischen Wert zurück. Dieser ist 0, wenn die Tabelle keine Tupel enthält

Q: Worauf muss man bei Gruppierungen in SQL achten?
- Nach allen nicht aggregierten Projektionsattributen der SELECT-Klausel muss gruppiert werden.
- In der SELECT-Klausel darf nur auf aggregierte Attribute projiziert werden.
- Die WHERE-Klausel darf keine Aggregationsfunktionen (SUM, AVG, MIN, MAX, COUNT) benutzen.
- Die Having-Klausel darf keine Aggregationsfunktionen (SUM, AVG, MIN, MAX, COUNT) benutzen.
- In der WHERE-Klausel dürfen nur Gruppierungsattribute auftreten.
A: Nach allen nicht aggregierten Projektionsattributen der SELECT-Klausel muss gruppiert werden.; Die WHERE-Klausel darf keine Aggregationsfunktionen (SUM, AVG, MIN, MAX, COUNT) benutzen.
Feedback: Die WHERE-Klausel bezieht sich auf einzelne Tupel, daher sind Aggregationsfunktionen nicht zulässig.

Q: Betrachten Sie den folgende Relationen:

Angestellte(Ang_Nr, Nachname, Ort, Abt_Nr, Jahresgehalt)
Abteilungen(Abt_Nr, Name, Ort, Leiter)

Welche SELECT-Abfragen haben das gleiche Ergebnis?
- SELECT * FROM Abteilungen NATURAL JOIN Angestellte;
- SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);
- SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr;
- SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Abteilungen.Ort = Angestellte.Ort;
A: SELECT * FROM Abteilungen NATURAL JOIN Angestellte;; SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);; SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Abteilungen.Ort = Angestellte.Ort;
Feedback: Die Semantik der 3. Anfrage ist: "Welche Angestellten arbeiten in Abteilungen?" Die Semantik der drei anderen SELECTs ist: "Welche Angestellten arbeiten in den gleichen Orten, in denen sie auch wohnen." Grund dafür ist, dass beim NATURAL JOIN alle Spalten, die gleich heißen auf Gleichheit verknüpft werden und das sind in diesem Fall Abt_Nr und Ort.

Q: Was ist das Ergebnis der SELECT-Anfrage, wenn sie auf der folgenden Mitarbeiter-Tabelle ausgeführt wird?

Mitarbeiter
Nachname | Vorname | Geburtsdatum | Gehalt
Meier | Anton | 13.12.1980 | 2000,-
Meister | Elfriede | 31.01.1981 |
Müller | Edwin |  | 1000,-

SELECT AVG(Gehalt) FROM Mitarbeiter;
A: 1500
Feedback: (2000 + 1000)/2 = 3000 / 2 = 1500 Bei den Aggregatfunktionen - hier AVG - werden die Datensätze mit NULL als Wert der Aggregationsspalte nicht berücksichtigt, so dass nur 2 Datensätze berücksichtigt werden.

Q: Was ist das Ergebnis der SELECT-Anfrage, wenn sie auf der folgenden Kunden-Tabelle ausgeführt wird?

Kunden
Kunden_Nr | Vorname | Nachname | Ort
1 | Bianca | Schmidt | Köln
2 | Heini | Müller | Düsseldorf
3 | Bianca | Jack | Essen
4 | Elli | Schmidt | Gummersbach
5 | Bianca | Schmidt | Dortmund

SELECT ROWNUM, * FROM Kunden;
- Jede Zeile der Kunden-Tabelle wird ausgegeben und zusätzlich eine vom System generierte Zeilennummer.
- Die Abfrage wirft einen Fehler, da neben dem *-Ausgabe keine anderen Spalten zugelassen sind.
- Die Abfrage wirft einen Fehler, da es die Spalte ROWNUM nicht gibt.
A: Die Abfrage wirft einen Fehler, da neben dem *-Ausgabe keine anderen Spalten zugelassen sind.
Feedback: Die Pseudospalte ROWNUM ist unter ORACLE-SQL immer vorhanden, allerdings gibt es neben der *-Ausgabe keine Möglichkeit, andere Spalten aufzuzählen.

Q: Welche SELECT-Klauseln sind obligatorisch?
- FROM
- WHERE
- GROUP BY
- HAVING
- ORDER BY
- SELECT
A: FROM; SELECT
Feedback: Eine SELECT-Anweisung muss mindestens eine Spalte aus einer Tabelle selektieren, also eine SELECT-Klausel und eine FROM-Klausel enthalten. Alle anderen Klauseln sind optional.

Q: Mit welcher SELECT-Klausel kann man die Reihenfolge der Datensätze der Ergebnismenge einer SELECT-Abfrage festlegen?
- FROM
- WHERE
- GROUP BY
- HAVING
- ORDER BY
- Eine solche Komponente gibt es nicht
A: GROUP BY; ORDER BY
Feedback: Mit der ORDER BY-Klausel kann auf- (ASC) oder absteigend (DESC) sortiert werden. Die GROUP BY-Klausel sortiert als "Nebenergebnis" der Gruppierung die Gruppen auch, aber nur aufsteigend. Mit den WHERE- und HAVING-Klauseln können einzelne Datensätze bzw. Gruppen selektiert werden, aber nicht sortiert. Die FROM-Klausel verknüpft die angegebenen Tabellen mittels kartesischem Produkt bzw. Join, sortiert aber nicht.

Q: Betrachten Sie folgende Relationen:

Angestellte(Ang_Nr, Nachname, Ort, Abt_Nr, Jahresgehalt)
Abteilungen(Abt_Nr, Name, Ort, Leiter)

Welche SELECT-Abfragen sind syntaktisch korrekt?
- SELECT * FROM Abteilungen NATURAL JOIN Angestellte;
- SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);
- SELECT * FROM Abteilungen JOIN Angestellte;
- SELECT * FROM Abteilungen, Angestellte OUTER JOIN Angestellte;
- SELECT * FROM Abteilungen, Angestellte FULL OUTER JOIN Angestellte USING (Abt_nr);
- SELECT * FROM Abteilungen, Angestellte THETA JOIN Angestellte USING (Abt_nr);
A: SELECT * FROM Abteilungen NATURAL JOIN Angestellte;; SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);; SELECT * FROM Abteilungen, Angestellte FULL OUTER JOIN Angestellte USING (Abt_nr);; SELECT * FROM Abteilungen, Angestellte THETA JOIN Angestellte USING (Abt_nr);
Feedback: SELECT * FROM Abteilungen JOIN Angestellte; SELECT * FROM Abteilungen OUTER JOIN Angestellte; Bei diesen beiden SELECTs fehlt eine USING- oder ON-Klausel, damit das DBS weiß, mittels welcher Spalten die beiden Tabellen verknüpft werden sollen. Daher sind diese beiden Abfragen syntaktisch falsch. Die anderen Abfragen sind syntaktisch korrekt.

Q: Wann wird ein Datensatz in die Ergebnismenge einer SQL-Anfrage aufgenommen?
- Wenn die WHERE-Bedingung zu FALSE ausgewertet wird.
- Wenn die WHERE-Bedingung zu UNKNOWN ausgewertet wird.
- Wenn die WHERE-Bedingung zu TRUE ausgewertet wird.
A: Wenn die WHERE-Bedingung zu TRUE ausgewertet wird.
Feedback: Achtung: SQL basiert auf einer drei-wertigen Logik! D.h. es gibt die drei Wahrheitwerte: TRUE, FALSE, UNKNOWN. Bei SELECT-Anfragen wird UNKNOWN wie FALSE behandelt und ein Datensatz kommt nur in die Ergebnismenge, wenn die WHERE-Bedingung zu TRUE ausgewertet wird. Wird die WHERE-Bedingung zu UNKNOWN oder FALSE ausgewertet, dann wird der Datensatz "fallen gelassen". Achtung: Bei der Integritätsprüfung ist das etwas anders: Ein Constraint in SQL ist erfüllt wenn es zu TRUE oder zu UNKNOWN ausgewertet wird. Gründe: 1. Die Constraints werden bereits beim CREATE TABLE das erste Mal geprüft und damit über der leeren Tabelle. Wenn jetzt UNKNOWN wie FALSE behandelt würde, könnte der CREATE TABLE gar nicht ausgeführt werden. 2. Potentiell leere Spalten sollen für die Constraints trotzdem erfüllt sein. Z.B. kann bei einem Detail-Datensatz eine Fremdschlüsselspalte leer sein oder UNIQUE-Spalten dürfen leer sein, ohne dass das Constraint gleich verletzt ist.

Q: Betrachten Sie eine Tabelle Spiel, in der die Ergebnisse der Bundesliga abgespeichert sind:

Spiel
Heimmannschaft | Gastmannschaft | Heimpunkte | Gastpunkte
Bayern München | Borussia Dortmund | 1 | 1
Borussia Dortmund | Bayern München | 0 | 3
Bayern München | Schalke | 3 | 0
Schalke | Bayern München | 0 | 3

Was ist die Ausgabe für folgende Anfrage?

SELECT Gastmannschaft
FROM Spiel
GROUP BY Gastmannschaft
HAVING SUM(Gastpunkte) > ALL (
  SELECT SUM(Gastpunkte)
  FROM Spiel
  GROUP BY Gastmannschaft
)
- Bayern München
- Borussia Dortmund
- Schalke
- 3
- 0
- 1
- No rows
A: No rows
Feedback: Die Anfrage liefert kein Ergebnis, weil im oberen und unteren SELECT die gleichen Zahlen ermittelt werden: in dem Fall kann keine Zahl größer als alle anderen sein. Die Semantik der Anfrage ist: "Welche Mannschaften haben als Gastmannschaft mehr Punkte erzielt als alle Mannschaften als Gastmannschaft erzielt haben?". Das geht nicht. Wenn die Abfrage mit >= formuliert worden wäre, wäre die Semantik der Anfrage: "Welche Mannschaften haben die meisten Punkte als Gastmannschaft erzielt?"

Q: Die Duplikate der Ergebnismenge einer Anfrage sollen nur einmal angezeigt werden. Welches Schlüsselwort ist in der Anfrage dafür zuständig?
- DESC
- DISTINCT
- UNIQUE
- ASC
- Diese Problematik gibt es bei SQL nicht, da Duplikate nicht zugelassen sind und automatisch unterdrückt werden.
A: DISTINCT
Feedback: Anders als bei der Relationalen Algebra, in der Duplikate nicht zugelassen sind und daher automatisch eliminiert werden, sind in SQL Duplikate zugelassen. Um Duplikate in SQL zu unterdrücken, muss man in der SELECT-Anweisung explizit die Option DISTINCT verwenden: SELECT DISTINCT spaltenname, .... FROM ....; UNIQUE ist ein Constraint und zwar das für die Zweitschlüssel. ASC/DESC sind die Schlüsselwörter für die ab-/aufsteigende Sortierung in der ORDER BY-Klausel von SELECT-Anfragen.

Q: Welche SELECT-Abfrage mit DISTINCT filtert aus einer Tabelle(Spalte1, Spalte2) alle Werte heraus, die sowohl in der Spalte1 als auch in der Spalte2 verschiedene Werte haben?
- SELECT DISTINCT SPALTE1, SPALTE2 FROM Tabelle;
- SELECT DISTINCT SPALTE1, DISTINCT SPALTE2 FROM Tabelle;
- SELECT SPALTE1, DISTINCT SPALTE2 FROM Tabelle;
A: SELECT DISTINCT SPALTE1, SPALTE2 FROM Tabelle;
Feedback: Das Schlüsselwort DISTINCT kann nur einmal in der SELECT-Klausel vorkommen, und zwar vor dem ersten Spaltennamen.

Q: Betrachten Sie eine Tabelle Spiel, in der die Ergebnisse der Bundesliga abgespeichert sind:

Spiel
Heimmannschaft | Gastmannschaft | Heimpunkte | Gastpunkte
Bayern München | Borussia Dortmund | 1 | 1
Borussia Dortmund | Bayern München | 0 | 3
Bayern München | Schalke | 3 | 0
Schalke | Bayern München | 0 | 3

Was ist die Ausgabe für folgende Anfrage?

SELECT Gastmannschaft
FROM Spiel
GROUP BY Gastmannschaft
HAVING SUM(Gastpunkte) >= ANY (
  SELECT SUM(Gastpunkte)
  FROM Spiel
  GROUP BY Gastmannschaft
)
- Bayern München
- Borussia Dortmund
- Schalke
- 3
- 0
- 1
- No rows
A: Bayern München; Borussia Dortmund; Schalke
Feedback: Die Anfrage liefert als Ergebnis alle drei Vereine: "Dortmund, Bayern München, Schalke", weil im oberen und unteren SELECT die gleichen Zahlen ermittelt und diese dann mit >= ANY, also "größer gleich irgendeiner Zahl" verglichen werden. Die Semantik der Anfrage wäre: "Welche Mannschaften haben die meisten Punkte als Gastmannschaft erzielt?", wenn die Abfrage mit ">= ALL" formuliert worden wäre.

Q: Welche der folgenden Abfragen sind in SQL syntaktisch korrekt?
- SELECT Abt_Nr FROM Angestellte GROUP BY Abt_Nr WHERE COUNT(*) > = 5;
- SELECT Abt_Nr FROM Angestellte GROUP BY Abt_Nr HAVING COUNT(*) > = 5;
- SELECT Abt_Nr FROM Angestellte WHERE COUNT(*) > = 5 GROUP BY Abt_Nr;
A: SELECT Abt_Nr FROM Angestellte GROUP BY Abt_Nr HAVING COUNT(*) > = 5;
Feedback: Die GROUP-BY-Klausel wird mit einer HAVING- und nicht einer WHERE-Klausel genutzt.

Q: Gegeben sei folgender Ausschnitt eines relationalen Schemas einer Datenbank:

Angestellte(Ang_Nr, Nachname, Ort, Abt_Nr, Jahresgehalt)

Welche Abfragen liefern die Angestellten, die das höchste Jahresgehalt haben?
- SELECT Ang_Nr FROM Angestellte WHERE Jahresgehalt > ALL;
- SELECT max( ALL Jahresgehalt) FROM Angestellte;
- SELECT Nachname, max(Jahresgehalt) FROM Angestellte GROUP BY Nachname;
- SELECT Nachname, max(Jahresgehalt) FROM Angestellte;
- SELECT a.Nachname, a.Jahresgehalt FROM Angestellte a WHERE a.Jahresgehalt = max(Jahresgehalt);
- SELECT Ang_Nr, Jahresgehalt FROM Angestellte WHERE Jahresgehalt = ( SELECT max(Jahresgehalt) FROM Angestellte );
- SELECT Ang_Nr FROM Angestellte WHERE Jahresgehalt > ALL( SELECT Jahresgehalt FROM Angestellte );
- SELECT Ang_Nr, Jahresgehalt FROM Angestellte WHERE Jahresgehalt >= ALL( SELECT Jahresgehalt FROM Angestellte );
A: SELECT Ang_Nr, Jahresgehalt FROM Angestellte WHERE Jahresgehalt = ( SELECT max(Jahresgehalt) FROM Angestellte );; SELECT Ang_Nr, Jahresgehalt FROM Angestellte WHERE Jahresgehalt >= ALL( SELECT Jahresgehalt FROM Angestellte );
Feedback: Die Abfrage SELECT Nachname, max(Jahresgehalt) FROM Angestellte GROUP by Nachname; ist syntaktisch korrekt, aber nicht semantisch, da die höchsten Jahresgehälter je Nachname berechnet werden. Die Abfrage SELECT Ang_Nr, Jahresgehalt FROM Angestellte WHERE Jahresgehalt = ( SELECT max(Jahresgehalt) FROM Angestellte ); vergleicht das Jahresgehalt mit dem höchsten Jahresgehalt und wählt somit nur den Angestellten mit dem höchsten Jahresgehalt aus. Die Abfrage SELECT Ang_Nr, Jahresgehalt FROM Angestellte WHERE Jahresgehalt >= ALL( SELECT Jahresgehalt FROM Angestellte ); vergleicht das Jahresgehalt mit allen Jahresgehältern und wählt nur die aus, die mindestens gleich hoch sind. Dadurch, dass mit allen verglichen wird, müssen die Gehälter auch mit dem größten verglichen werden. Dadurch bleibt nur das höchste Gehalt übrig. Alle anderen Abfragen sind falsch.

Q: Betrachten Sie die folgende Tabelle:

Spalte_1 | Spalte_2
ab | 123
cd | NULL
ef | 234

Was ist das Ergebnis von SELECT SUM(Spalte_2)?

Wenn die Funktion nicht ausführbar ist, geben Sie bitte 0 ein.
A: 357
Feedback: NULL-Werte werden bei den Gruppenfunktionen in SQL (z.B. SUM) nicht berücksichtigt. Wird nun mit SELECT SUM(Spalte_2) über Spalte_2 gezählt, so lautet das Ergebnis: 357 Datensätze.

Q: Der Ausdruck "SELECT Vorname FROM KUNDEN ORDER BY Nachname DESC" ...
- ist nicht ausführbar, da über eine Spalte "Nachname" sortiert wird, die gar nicht angezeigt wird.
- bewirkt eine absteigende Sortierung über den Nachnamen
- bewirkt eine aufsteigende Sortierung über den Nachnamen
- bewirkt eine Gruppierung
- bewirkt keine Sortierung
A: bewirkt eine absteigende Sortierung über den Nachnamen
Feedback: Die Sortierung kann ausgeführt werden, weil die ORDER BY-Klausel als vorletzte Klausel ausgeführt wird, unmittelbar vor der letzten Klausel der SELECT-Klausel. Daher kann auch über Spalten sortiert werden, die anschließend mittels der SELECT-Klausel "weg projiziert" werden. Die ORDER BY-Klausel mit der Option ASC sortiert aufsteigend, mit DESC absteigend. ASC ist die Default-Option, so dass bei fehlender Option immer aufsteigend sortiert wird. Wird gar keine ORDER BY-Klausel angegeben, so erfolgt auch keine Sortierung. Eine Gruppierung erfolgt nur mit einer GROUP BY-Klausel.

Q: Ordnen Sie die Operatoren der relationalen Algebra den SQL-Ausdrücken zu
- FROM | Kartesisches Produkt
- MINUS | Differenz
- INTERSECTION | Durchschnitt
- ORDER BY | keine der Operatoren
- SELECT | Projektion
- UNION | Vereinigung
- WHERE | Selektion
Also offered: Division
Feedback: Die Zuordnung Relationale Algebra <-> SQL entnehmen Sie bitte der folgenden Tabelle: Relationale Algebra | SQL Projektion | SELECT Selektion | WHERE Kartesisches Produkt | FROM Theta Join | FROM + WHERE Natural Join | FROM + WHERE + SELECT Vereinigung | UNION Differenz | EXCEPT / MINUS / NOT IN / NOT EXISTS Durchschnitt | INTERSECTION Division | "doppeltes NOT EXISTS"/"Zählen"

Q: Betrachten Sie zwei Relationen R und S mit nur einer Spalte A bzw. B und dem Datentyp Integer. R habe den Primärschlüssel A, S den Primärschlüssel B.

Welcher SELECT- Anweisung entspricht dem RA-Ausdruck R-S (Differenz)?
- SELECT * FROM R MINUS SELECT * FROM S;
- SELECT * FROM R JOIN S USING (R.id !0 S.ID);
- SELECT * FROM R,S WHERE R.ID <> S.ID;
- SELECT A FROM R LEFT OUTER JOIN S ON S.B = R.A WHERE B is NULL;
- SELECT * FROM R WHERE NOT EXISTS ( SELECT B FROM S WHERE a = b );
- SELECT * FROM R NATURAL JOIN S;
A: SELECT * FROM R MINUS SELECT * FROM S;; SELECT A FROM R LEFT OUTER JOIN S ON S.B = R.A WHERE B is NULL;; SELECT * FROM R WHERE NOT EXISTS ( SELECT B FROM S WHERE a = b );
Feedback: Die Differenz kann mit dem Minus-Operator (Reihenfolge beachten!) oder mit NOT IN bzw. NOT EXISTS oder einem LEFT Outer Join ausgedrückt werden.

Q: Betrachten Sie eine Relation Test(Spalte_1, Spalte_2, Spalte_3), in die fünf Tupel eingetragen sind. Gehen Sie davon aus, dass Spalte_2 der Primärschlüssel ist.

Geben Sie in jeder Zeile an, wie viele Tupel die Operation ergibt.

Nr | Operation | Anzahl der Tupel
1 | Natural Join der Tabelle Test mit sich selber | [...]
2 | Differenz der Tabelle Test mit sich selber | [...]
3 | Projektion der Tabelle Test auf die Spalten Spalte_1,Spalte_2 | [...]
4 | Durchschnitt der Tabelle Test mit sich selber | [...]
5 | Kartesisches Produkt der Tabelle Test mit sich selber | [...]
6 | Selektion der Tabelle Test auf einen Wert der Spalte_3 | [...]
7 | Vereinigungsmenge der Tabelle Testmit sich selber | [...]
A: 5; 0; 5; 5; 25; 1; 5
Feedback: 1. Der Natural Join einer Tabelle mit sich selber ergibt wieder die Ursprungstabelle. 2. Die Differenz einer Tabelle mit sich selber ist die leere Menge. x-x = 0 :-), das gilt sogar für Relationen. 3. Primärschlüssel sind eindeutig, wodurch alle Tupel abgebildet werden. 4. Der Durchschnitt einer Tabelle mit sich selber ist die Ursprungstabelle selber. 5. Beim kartesischen Produkt wird jedes Tupel mit der beteiligten Tabellen miteinander verknüpft, im Beispiel ergibt das 5 * 5 = 25 Tupel. 6. 1 = 1 :-). 7. Die Vereinigungsmenge der Tabelle Test mit sich selber ist wieder die Tabelle Test.

Q: Welcher JOIN-Tabellen-Typ hat eine USING-Klausel?
- CROSS-JOIN
- NATURAL-JOIN
- THETA-JOIN
A: THETA-JOIN
Feedback: Beim CROSS JOIN, dem kartesischen Produkt, gibt es keine Verknüpfungsspalten. Jeder Datensatz der einen Relation wird bedingungslos mit jedem Datensatz aus der anderen Relation verknüpft. Beim NATURAL JOIN gibt es eine vordefinierte Bedingung, die nicht mittels ON-Klausel spezifiziert oder verändert werden kann. Die vordefinierte Bedingung heißt: Alle Spalten mit gleichen Namen werden auf Gleichheit geprüft und die Teilbedingungen ggf. mit AND verknüpft. Lediglich beim THETA JOIN können Spalten mittels ON/USING-Klauses spezifiziert und somit als Bedingung für die JOIN-Bedingung angegeben werden.

Q: Welcher JOIN-Tabellen-Typ hat eine ON-Klausel?
- CROSS-JOIN
- NATURAL-JOIN
- THETA-JOIN
A: THETA-JOIN
Feedback: Beim CROSS JOIN, dem kartesischen Produkt, gibt es keine Verknüpfungsspalten. Jeder Datensatz der einen Relation wird bedingungslos mit jedem Datensatz aus der anderen Relation verknüpft. Beim NATURAL JOIN gibt es eine vordefinierte Bedingung, die nicht mittels USING-Klausel spezifiziert oder verändert werden kann. Die vordefinierte Bedingung heißt: Alle Spalten mit gleichen Namen werden auf Gleichheit geprüft und die Teilbedingungen ggf. mit AND verknüpft. Lediglich beim THETA JOIN können Spalten mittels ON/USING-Klauses spezifiziert und somit als Bedingung für die JOIN-Bedingung angegeben werden.

Q: Der Ausdruck "SELECT Vorname FROM KUNDEN ORDER BY Nachname ASC" ...
- ist nicht ausführbar, da über eine Spalte "Nachname" sortiert wird, die gar nicht angezeigt wird.
- bewirkt eine absteigende Sortierung über den Nachnamen
- bewirkt eine aufsteigende Sortierung über den Nachnamen
- bewirkt eine Gruppierung
- bewirkt keine Sortierung
A: bewirkt eine aufsteigende Sortierung über den Nachnamen
Feedback: Die Sortierung kann ausgeführt werden, weil die ORDER BY-Klausel als vorletzte Klausel ausgeführt wird, unmittelbar vor der letzten Klausel der SELECT-Klausel. Daher kann auch über Spalten sortiert werden, die anschließend mittels der SELECT-Klausel "weg projiziert" werden. Die ORDER BY-Klausel mit der Option ASC sortiert aufsteigend, mit DESC absteigend. ASC ist die Default-Option, so dass bei fehlender Option immer aufsteigend sortiert wird. Wird gar keine ORDER BY-Klausel angegeben, so erfolgt auch keine Sortierung. Eine Gruppierung erfolgt nur mit einer GROUP BY-Klausel.

Q: Der Ausdruck "SELECT Nachname FROM KUNDEN" ...
- bewirkt eine absteigende Sortierung über den Nachnamen
- bewirkt eine aufsteigende Sortierung über den Nachnamen
- bewirkt eine Gruppierung
- bewirkt keine Sortierung
A: bewirkt keine Sortierung
Feedback: Die ORDER BY-Klausel mit der Option ASC sortiert aufsteigend, mit DESC absteigend. ASC ist die Default-Option, so dass bei fehlender Option immer aufsteigend sortiert wird. Wird gar keine ORDER BY-Klausel angegeben, so erfolgt auch keine Sortierung. Eine Gruppierung erfolgt nur mit einer GROUP BY-Klausel.

Q: Der Ausdruck "SELECT Nachname FROM KUNDEN ORDER BY Nachname ASC" ...
- bewirkt eine absteigende Sortierung über den Nachnamen
- bewirkt eine aufsteigende Sortierung über den Nachnamen
- bewirkt eine Gruppierung
- bewirkt keine Sortierung
A: bewirkt eine aufsteigende Sortierung über den Nachnamen
Feedback: Die ORDER BY-Klausel mit der Option ASC sortiert aufsteigend, mit DESC absteigend. ASC ist die Default-Option, so dass bei fehlender Option immer aufsteigend sortiert wird. Wird gar keine ORDER BY-Klausel angegeben, so erfolgt auch keine Sortierung. Eine Gruppierung erfolgt nur mit einer GROUP BY-Klausel.

Q: Der Ausdruck "SELECT Nachname FROM KUNDEN ORDER BY Nachname DESC" ...
- bewirkt eine absteigende Sortierung über den Nachnamen
- bewirkt eine aufsteigende Sortierung über den Nachnamen
- bewirkt eine Gruppierung
- bewirkt keine Sortierung
A: bewirkt eine absteigende Sortierung über den Nachnamen
Feedback: Die ORDER BY-Klausel mit der Option ASC sortiert aufsteigend, mit DESC absteigend. ASC ist die Default-Option, so dass bei fehlender Option immer aufsteigend sortiert wird. Wird gar keine ORDER BY-Klausel angegeben, so erfolgt auch keine Sortierung. Eine Gruppierung erfolgt nur mit einer GROUP BY-Klausel.

Q: Betrachten Sie die folgende Tabelle:

Spalte_1 | Spalte_2
ab | 123
cd | NULL
ef | 234

Was ist das Ergebnis von SELECT SUM(Spalte_1)?

Wenn die Funktion nicht ausführbar ist, geben Sie bitte 0 ein.
A: 0
Feedback: Wird mit SELECT SUM(Spalte_1) über Spalte_1 gezählt, so lautet das Ergebnis: geht nicht, weil der Datentyp nicht numerisch ist.

Q: Betrachten Sie die folgende Tabelle:

Spalte_1 | Spalte_2
ab | 123
cd | NULL
ef | 234

Was ist das Ergebnis von SELECT COUNT(Spalte_1)?

Wenn die Funktion nicht ausführbar ist, geben Sie bitte 0 ein.
A: 3
Feedback: Wird mit SELECT COUNT(Spalte_1) über Spalte_1 gezählt, so lautet das Ergebnis: 3 Datensätze. Die Semantik der Anfrage ist: "Wie viele Datensätze hat die Tabelle?"

Q: Betrachten Sie die folgende Tabelle:

Spalte_1 | Spalte_2
ab | 123
cd | NULL
ef | 234

Was ist das Ergebnis von SELECT COUNT(Spalte_2)?

Wenn die Funktion nicht ausführbar ist, geben Sie bitte 0 ein.
A: 2
Feedback: NULL-Werte werden bei den Gruppenfunktionen in SQL (z.B. COUNT) nicht berücksichtigt. Wird nun mit SELECT COUNT(Spalte_2) über Spalte_2 gezählt, so lautet das Ergebnis: 2 Datensätze. Die Semantik der Anfrage ist: "Wie viele Datensätze sind in Spalte_2 nicht leer?"

Q: Wann wird ein Datensatz nicht in die Ergebnismenge einer SQL-Anfrage aufgenommen?
- Wenn die WHERE-Bedingung zu FALSE ausgewertet wird.
- Wenn die WHERE-Bedingung zu UNKNOWN ausgewertet wird.
- Wenn die WHERE-Bedingung zu TRUE ausgewertet wird.
A: Wenn die WHERE-Bedingung zu FALSE ausgewertet wird.; Wenn die WHERE-Bedingung zu UNKNOWN ausgewertet wird.
Feedback: Achtung: SQL basiert auf einer drei-wertigen Logik! D.h. es gibt die drei Wahrheitwerte: TRUE, FALSE, UNKNOWN. Bei SELECT-Anfragen wird UNKNOWN wie FALSE behandelt und ein Datensatz kommt nur in die Ergebnismenge, wenn die WHERE-Bedingung zu TRUE ausgewertet wird. Wird die WHERE-Bedingung zu UNKNOWN oder FALSE ausgewertet, dann wird der Datensatz "fallen gelassen". Achtung: Bei der Integritätsprüfung ist das etwas anders: Ein Constraint in SQL ist erfüllt wenn es zu TRUE oder zu UNKNOWN ausgewertet wird. Gründe: 1. Die Constraints werden bereits beim CREATE TABLE das erste Mal geprüft und damit über der leeren Tabelle. Wenn jetzt UNKNOWN wie FALSE behandelt würde, könnte der CREATE TABLE gar nicht ausgeführt werden. 2. Potentiell leere Spalten sollen für die Constraints trotzdem erfüllt sein. Z.B. kann bei einem Detail-Datensatz eine Fremdschlüsselspalte leer sein oder UNIQUE-Spalten dürfen leer sein, ohne dass das Constraint gleich verletzt ist.

Q: Was ist das Ergebnis der SELECT-Anfrage, wenn sie auf der folgenden Mitarbeiter-Tabelle ausgeführt wird?

Mitarbeiter
Nachname | Vorname | Geburtsdatum | Gehalt
Meier | Anton | 13.12.1980 | 2000,-
Meister | Elfriede | 31.01.1981 |
Müller | Edwin |  | 1000,-

SELECT SUM(Gehalt) FROM Mitarbeiter;
A: 3000
Feedback: 2000 + 1000 = 3000 Bei den Aggregatfunktionen - hier z.B. SUM - werden die Datensätze mit NULL als Wert der Aggregationsspalte nicht berücksichtigt, so dass nur 2 Datensätze summiert werden. Und anders als beim Additions-Operator (+) wird das Gesamtergebnis nicht zu NULL.

Q: Was ist das Ergebnis der SELECT-Anfrage, wenn sie auf der folgenden Mitarbeiter-Tabelle ausgeführt wird?

Mitarbeiter
Nachname | Vorname | Geburtsdatum | Gehalt
Meier | Anton | 13.12.1980 | 2000,-
Meister | Elfriede | 31.01.1981 |
Müller | Edwin |  | 1000,-

SELECT COUNT(Gehalt) FROM Mitarbeiter;
A: 2
Feedback: COUNT zählt, also 2 Datensätze Bei den Aggregatfunktionen - hier z.B. COUNT - werden die Datensätze mit NULL als Wert der Aggregationsspalte nicht berücksichtigt, so dass nur 2 Datensätze gezählt werden.

Q: Die SQL-Gruppenfunktionen (COUNT, SUM, AVG, MIN, MAX) geben immer genau einen Wert zurück.
- Wahr
- Falsch
A: Wahr
Feedback: Die SQL-Gruppenfunktionen (COUNT, SUM, AVG, MIN, MAX) gehören zum SQL-Standard und fassen Werte aus unterschiedlichen Tupeln zu genau einem Wert zusammen.

Q: Gegeben sei folgender Ausschnitt eines relationalen Schemas einer Datenbank:

Angestellte(Ang_Nr, Nachname, Ort, Abt_Nr, Jahresgehalt)

Welche Abfragen liefern die Angestellten, die in Köln oder Gummersbach wohnen?
- SELECT Ang_nr, Nachname FROM Angestellte WHERE Ort = 'Köln' AND Ort = 'Gummersbach'
- SELECT Ang_nr, Nachname FROM Angestellte WHERE Ort = 'Köln' OR Ort = 'Gummersbach'
- SELECT Ang_nr, Nachname FROM Angestellte WHERE Ort = ( 'Köln', 'Gummersbach')
- SELECT Ang_nr, Nachname FROM Angestellte WHERE Ort = ALL ( 'Köln', 'Gummersbach')
- SELECT Ang_nr, Nachname FROM Angestellte WHERE Ort IN ( 'Köln', 'Gummersbach')
A: SELECT Ang_nr, Nachname FROM Angestellte WHERE Ort = 'Köln' OR Ort = 'Gummersbach'; SELECT Ang_nr, Nachname FROM Angestellte WHERE Ort IN ( 'Köln', 'Gummersbach')
Feedback: Der logische Operator "=" kann nur mit einem einzelnen Wert vergleichen. Eine Ort kann nicht gleichzeitig Köln und Gummersbach heißen.

Q: Betrachten Sie eine Tabelle Spiel, in der die Ergebnisse der Bundesliga abgespeichert sind:

Spiel
Heimmannschaft | Gastmannschaft | Heimpunkte | Gastpunkte
Bayern München | Borussia Dortmund | 1 | 1
Borussia Dortmund | Bayern München | 0 | 3
Bayern München | Schalke | 3 | 0
Schalke | Bayern München | 0 | 3

Was ist die Ausgabe für folgende Anfrage?

SELECT Gastmannschaft
FROM Spiel
GROUP BY Gastmannschaft
HAVING SUM(Gastpunkte) <= ALL (
  SELECT SUM(Gastpunkte)
  FROM Spiel
  GROUP BY Gastmannschaft
)
- Bayern München
- Borussia Dortmund
- Schalke
- 3
- 0
- 1
- No rows
A: Schalke
Feedback: Die Semantik der Anfrage ist: "Welche Mannschaften haben die wenigsten Punkte als Gastmannschaft erzielt?" Und das ist Schalke mit 0 Punkten.

Q: Betrachten Sie eine Tabelle Spiel, in der die Ergebnisse der Bundesliga abgespeichert sind:

Spiel
Heimmannschaft | Gastmannschaft | Heimpunkte | Gastpunkte
Bayern München | Borussia Dortmund | 1 | 1
Borussia Dortmund | Bayern München | 0 | 3
Bayern München | Schalke | 3 | 0
Schalke | Bayern München | 0 | 3

Was ist die Ausgabe für folgende Anfrage?

SELECT Gastmannschaft
FROM Spiel
GROUP BY Gastmannschaft
HAVING SUM(Gastpunkte) >= ALL (
  SELECT SUM(Gastpunkte)
  FROM Spiel
  GROUP BY Gastmannschaft
)
- Bayern München
- Borussia Dortmund
- Schalke
- 3
- 0
- 1
- No rows
A: Bayern München
Feedback: Die Semantik der Anfrage ist: "Welche Mannschaften haben die meisten Punkte als Gastmannschaft erzielt?" Und das ist Bayern München mit 6 Punkten.

Q: Gegeben sei folgender Ausschnitt eines relationalen Schemas einer Datenbank:

Spieler (Spieler_id, Name, Adresse, Geburtsdatum)
Vereine (V_Kuerzel, Vereinsname, Ort, Gruendungsjahr )
Spiele (Spiel_id, Heim_V_Kuerzel, Gast_V_Kuerzel, Spieltag, Ergebnis, Anzahl_Zuschauer)
Spieleinsatz (Spiel_id, Spieler_id, von_Minute, bis_Minute)

Welche der angegeben SQL-Abfragen beantwortet/en die Frage: Welche Spieler (Name, Adresse) haben noch nie in einem Spiel mit mehr als 30000 Zuschauern mitgespielt?
- SELECT Name, Adresse FROM Spieler s, Spieleinsatz e WHERE s.Spieler_Id = e.Spieler_Id AND Anzahl_Zuschauer > 30000 AND COUNT (s.Spieler_Id ) IS NULL;
- SELECT Name, Adresse FROM Spieler s, Spieleinsatz e WHERE s.Spieler_Id = e.Spieler_Id AND Anzahl_Zuschauer > 30000 HAVING COUNT(s.Spieler_Id ) = 0;
- SELECT Name, Adresse FROM Spieler WHERE Spieler_id NOT IN ( SELECT Spieler_Id FROM Spieleinsatz, Spiele WHERE Anzahl_Zuschauer > 30000 AND Spiele.Spiel_Id = Spieleinsatz.Spiel_Id );
- SELECT Name, Adresse FROM Spieler se WHERE NOT EXISTS ( SELECT Spieler_Id FROM Spieleinsatz se WHERE Anzahl_Zuschauer > 30000 ) AND se.Spieler_Id = sp.Spieler_Id;
- SELECT Name, Adresse FROM Spieler se WHERE NOT EXISTS ( SELECT Spieler_Id FROM Spieleinsatz se WHERE Anzahl_Zuschauer > 30000 );
A: SELECT Name, Adresse FROM Spieler WHERE Spieler_id NOT IN ( SELECT Spieler_Id FROM Spieleinsatz, Spiele WHERE Anzahl_Zuschauer > 30000 AND Spiele.Spiel_Id = Spieleinsatz.Spiel_Id );
Feedback: Antwort 1 ist syntaktisch falsch: Aggregatfunktionen können nicht in der WHERE-Klausel verwendet werden, nur in der SELECT-, GROUP BY, HAVING-Klausel. Antwort 2 ist semantisch falsch: Mit dem Natural Join werden nur die Spiele mit mehr als 3000 Zuschauern ermittelt. Anschließend wird mit der HAVING-Bedingung versucht, die Spieler zu ermitteln, die kein solches Spiel haben. Ergebnis: aufgrund dieses Widerspruchs immer die leere Menge. Antwort 3 ist richtig! Antwort 4 ist semantisch und syntaktisch falsch: Die schließende Klammer steht falsch. Richtig wäre die Abfrage, wenn die AND-Bedingung zur Unterabfrage gehören würde. In diesem Fall gehört sie zur Hauptabfrage und damit ist das Ganze nicht ausführbar. Z.B. der Tabellenalias se ist im oberen SELECT nicht bekannt, nur im unteren. Antwort 5 ist semantisch falsch: Der Unterabfrage fehlt der Bezug zur oberen Abfragen (unkorrelierter EXISTS). So liefert die obere Abfrage immer die leere Menge als Ergebnis, sobald es wenigstens ein Spiel mit mehr als 3000 Zuschauern gibt, also wenn der untere SELECT wenigstens einen Datensatz liefert.

Q: Eine Verneinung von Unterabfragen mit ALL und ANY ist möglich, d.h. eine Unterabfrage der Form

SELECT Nachname, Gehalt
FROM Angestellte
WHERE Gehalt > NOT ALL(
  SELECT Gehalt
  FROM Angestellte a, Abteilungen b
  WHERE a.Abt_Nr = b.Abt_Nr
  AND Leiter = 4
);

ist syntaktisch korrekt.
- Wahr
- Falsch
A: Falsch
Feedback: Unterabfragen mit ANY oder All könen leider nicht verneint werden.

Q: Welche Aussagen über Unterabfragen sind wahr?
- Die Spalten einer Unterabfrage müssen immer einen Tabellennamen oder einen Tabellealias haben.
- Eine Unterabfrage kann Daten aus ein oder mehreren Tabellen oder Views auslesen.
- Falls eine Unterabfrage als Ergebnis 0 Zeilen hat, wird NULL zurückgegeben.
- In einer SELECT-Anweisung können nur zwei Unterabfragen parallel genutzt werden.
- In einer WHERE-Klausel können Unterabfragen höchstens dreimal ineinander geschachtelt werden.
A: Eine Unterabfrage kann Daten aus ein oder mehreren Tabellen oder Views auslesen.; Falls eine Unterabfrage als Ergebnis 0 Zeilen hat, wird NULL zurückgegeben.

Q: Was ist das Ergebnis der SELECT-Anfrage, wenn sie auf der folgenden Mitarbeiter-Tabelle ausgeführt wird?

Mitarbeiter
Nachname | Vorname | Geburtsdatum | Gehalt
Meier | Anton | 13.12.1980 | 2000,-
Meister | Elfriede | 31.01.1981 |
Müller | Edwin |  | 1000,-

SELECT MIN(Gehalt) FROM Mitarbeiter;
A: 1000
Feedback: Der kleinste Wert ist 1000 Bei den Aggregatfunktionen - hier MIN - werden die Datensätze mit NULL als Wert der Aggregationsspalte nicht berücksichtigt, so dass nur 2 Datensätze berücksichtigt werden.

Q: Was ist das Ergebnis der SELECT-Anfrage, wenn sie auf der folgenden Mitarbeiter-Tabelle ausgeführt wird?

Mitarbeiter
Nachname | Vorname | Geburtsdatum | Gehalt
Meier | Anton | 13.12.1980 | 2000,-
Meister | Elfriede | 31.01.1981 |
Müller | Edwin |  | 1000,-

SELECT MAX(Gehalt) FROM Mitarbeiter;
A: 2000
Feedback: Der größte Wert ist 2000 Bei den Aggregatfunktionen - hier MAX - werden die Datensätze mit NULL als Wert der Aggregationsspalte nicht berücksichtigt, so dass nur 2 Datensätze berücksichtigt werden.

Q: Betrachten Sie den folgende Relationen:

Angestellte(Ang_Nr, Nachname, Ort, Abt_Nr, Jahresgehalt)
Abteilungen(Abt_Nr, Name, Ort, Leiter)

Welche SELECT-Abfragen verknüpfen alle Angestellten mit den Daten aus der Relation Abteilung, der sie angehören?
- SELECT * FROM Abteilungen NATURAL JOIN Angestellte;
- SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);
- SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr, Ort);
- SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr;
- SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Abteilungen.Ort = Angestellte.Ort;
A: SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);; SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr;
Feedback: SELECT * FROM Abteilungen NATURAL JOIN Angestellte; SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr, Ort); SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Abteilungen.Ort = Angestellte.Ort; Diese drei Anfragen haben zwar die gleiche Semantik, aber leider eine andere als die Aufgabenstellung: Welche Angestellte wohnen im gleichen Ort, in dem sie auch arbeiten?

Q: Ordnen Sie den Vergleichen die jeweils erzeugten Ergebnisse zu:
- < ALL | Kein Wert der Menge
- <= ALL | Kleinster Wert der Menge
- < ANY | Alle Werte der Menge außer dem Maximum
- <= ANY | Alle Werte der Menge
Feedback: Wenn ein Wert kleiner ist als jeder Wert (< ALL) des Ergebnisses einer Unterabfrage, ist er insbesondere auch kleiner als das Minimum der Werte der Unterabfrage, also wird kein Wert der Menge ausgewählt. Wenn ein Wert kleiner ist als oder gleich ist wie jeder Wert (<= ALL) des Ergebnisses einer Unterabfrage, wird nur das Minimum ausgewählt. Wenn ein Wert kleiner ist als irgendein Wert (< ANY) des Ergebnisses einer Unterabfrage, ist er insbesondere auch kleiner als das Maximum der Werte der Unterabfrage, also werden alle Werte außer dem Maximum ausgewählt. Wenn ein Wert kleiner ist als oder gleich ist wie irgendein Wert (<= ANY) des Ergebnisses einer Unterabfrage, werden alle Werte der Menge ausgewählt.

Q: Ordnen Sie den Vergleichen die jeweils erzeugten Ergebnisse zu:
- > ALL | Kein Wert der Menge
- >= ALL | Größter Wert der Menge
- > ANY | Alle Werte der Menge außer dem Minimum
- >= ANY | Alle Werte der Menge
Feedback: Wenn ein Wert größer ist als jeder (> ALL) Wert des Ergebnisses einer Unterabfrage, ist er insbesondere auch größer als das Maximum der Werte der Unterabfrage, also wird kein Wert der Menge ausgewählt. Wenn ein Wert größer als oder gleich ist wie jeder (>= ALL) Wert des Ergebnisses einer Unterabfrage, wird nur das Maximum ausgewählt. Wenn ein Wert größer ist als irgendein (> ANY) Wert des Ergebnisses einer Unterabfrage, ist er insbesondere auch größer als das Minimum der Werte der Unterabfrage, also werden alle Werte außer dem Minimum ausgewählt. Wenn ein Wert größer als oder gleich ist wie irgendein (>= ANY) Wert des Ergebnisses einer Unterabfrage, werden alle Werte der Menge ausgewählt.

Q: Unterabfragen mit ALL und ANY können verneint werden, d.h. eine Unterabfrage der Form

SELECT Nachname, Gehalt
FROM Angestellte
WHERE Gehalt > NOT ALL(
  SELECT Gehalt
  FROM Angestellte a, Abteilungen b
  WHERE a.Abt_Nr = b.Abt_Nr
  AND Leiter = 4
);

ist syntaktisch korrekt.
- Wahr
- Falsch
A: Falsch
Feedback: Unterabfragen mit ANY oder All könen leider nicht verneint werden.

Q: Betrachten Sie eine Tabelle Spiel, in der die Ergebnisse der Bundesliga abgespeichert sind:

Spiel
Heimmannschaft | Gastmannschaft | Heimpunkte | Gastpunkte
Bayern München | Borussia Dortmund | 1 | 1
Borussia Dortmund | Bayern München | 0 | 3
Bayern München | Schalke | 3 | 0
Schalke | Bayern München | 0 | 3

Welche Abfrage beantwortet die folgende Frage: Welche Mannschaft hat die meisten Gastpunkte erreicht?
- SELECT Gastmannschaft, MAX(Gastpunkte) FROM ( SELECT Gastmannschaft, SUM(Gastpunkte) as Gastpunkte FROM Spiel GROUP BY Gastmannschaft )
- SELECT Gastmannschaft FROM Spiel WHERE SUM(Gastpunkte) > ALL ( SELECT SUM(Gastpunkte) FROM Spiel )
- SELECT Gastmannschaft FROM Spiel GROUP BY Gastmannschaft HAVING SUM(Gastpunkte) = MAX(Gastpunkte)
- SELECT Gastmannschaft FROM Spiel GROUP BY Gastmannschaft HAVING SUM(Gastpunkte)>= ALL ( SELECT SUM(Gastpunkte) FROM Spiel GROUP BY Gastmannschaft )
- Keine der Abfragen
A: SELECT Gastmannschaft FROM Spiel GROUP BY Gastmannschaft HAVING SUM(Gastpunkte)>= ALL ( SELECT SUM(Gastpunkte) FROM Spiel GROUP BY Gastmannschaft )
Feedback: Abfrage 1 ist syntaktisch falsch: Wenn die Aggregatfunktion MAX anwendet wird, dann kann keine 2. Spalte des Datensatzes selektiert werden. MAX liefert genau einen Wert, aber es kann mehrere Gastmannschaften geben, die diese maximale Toranzahl geschossen haben und damit ist die Anzeige nicht eindeutig. Welche der möglichen Mannschaften sollte für den MAX-Wert angezeigt werden? Abfrage 2 ist syntaktisch falsch: Aggregatfunktionen können nicht in der WHERE-Klausel verwendet werden, nur in der SELECT-, HAVING- und GROUP BY-Klausel. Abfrage3 ist falsch: MAX muss in einer eigenen Unteranfrage (Sub-SELECT) ermittelt werden. Abfrage 4 ist richtig: Der obere und der untere SELECT ermittelt für die verschiedenen Länder die Summer ihrer Tore (gleiche Anfragen). Der >= ALL-Operator nimmt nur die Datensätze, die dem maximalen Wert in der Unteranfrage entspricht.

Q: Gegeben sei folgender Ausschnitt eines relationalen Schemas einer Datenbank:

Spieler (Spieler_id, Name, Adresse, Geburtsdatum)
Vereine (V_Kuerzel, Vereinsname, Ort, Gruendungsjahr )
Spiele (Spiel_id, Heim_V_Kuerzel, Gast_V_Kuerzel, Spieltag, Ergebnis, Anzahl_Zuschauer)
Spieleinsatz (Spiel_id, Spieler_id, von_Minute, bis_Minute)

Welche der angegeben SQL-Abfragen beantwortet/en die Frage: Welche Vereine (Kürzel, Name) haben wenigstens ein Auswärtsspiel, also wenigstens ein als Spiel als Gastmannschaft, in der Rückrunde (Spieltag 18-34) absolviert?
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag BETWEEN 18 AND 34;
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag >= 18 AND <= 34;
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE spieltag BETWEEN 18 AND 34;
- SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 );
- SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 GROUP BY gast_v_kuerzel HAVING COUNT (*) >=1 );
A: SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag BETWEEN 18 AND 34;; SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag >= 18 AND <= 34;; SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 );; SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 GROUP BY gast_v_kuerzel HAVING COUNT (*) >=1 );
Feedback: Anfrage 3 ist semantisch falsch: Es wird hier das kartesische Produkt zwischen den beiden Tabellen ausgeführt und nicht der Natural Join. Die übrigen Anfragen sind alle richtig.

Q: Betrachten Sie den folgende Relationen:

Angestellte(Ang_Nr, Nachname, Ort, Abt_Nr, Jahresgehalt)
Abteilungen(Abt_Nr, Name, Ort, Leiter)

Welche SELECT-Abfragen verknüpfen alle Angestellten mit den Daten aus der Abteilungsrelation, der sie angehören?
- SELECT * FROM Abteilungen NATURAL JOIN Angestellte;
- SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);
- SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr, Ort);
- SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr;
- SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Abteilungen.Ort = Angestellte.Ort;
A: SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);; SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr;
Feedback: SELECT * FROM Abteilungen NATURAL JOIN Angestellte; SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr, Ort); SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Abteilungen.Ort = Angestellte.Ort; Diese drei Anfragen haben zwar die gleiche Semantik, aber leider eine andere als die Aufgabenstellung: Welche Angestellte wohnen im gleichen Ort, in dem sie auch arbeiten?

Q: Betrachten Sie den folgende Relationen:

Angestellte(Ang_Nr, Nachname, Ort, Abt_Nr, Jahresgehalt)
Abteilungen(Abt_Nr, Name, Ort, Leiter)

Welche SELECT-Abfragen haben das gleiche Ergebnis?
- SELECT * FROM Abteilungen NATURAL JOIN Angestellte;
- SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);
- SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr;
- SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Abteilungen.Ort = Angestellte.Ort;
A: SELECT * FROM Abteilungen NATURAL JOIN Angestellte;; SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);; SELECT * FROM Abteilungen, Angestellte WHERE Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Abteilungen.Ort = Angestellte.Ort;
Feedback: Die Semantik der 3. Anfrage ist: "Welche Angestellten arbeiten in Abteilungen?" Die Semantik der drei anderen SELECTs ist: "Welche Angestellten arbeiten, in den gleichen Orten, in denen sie auch wohnen." Grund dafür ist, dass beim NATURAL JOIN alle Spalten, die gleich heißen auf Gleichheit verknüpft werden und das sind in diesem Fall Abt_Nr und Ort.

Q: Betrachten Sie den folgende Relationen:

Angestellte(Ang_Nr, Nachname, Ort, Abt_Nr, Jahresgehalt)
Abteilungen(Abt_Nr, Name, Ort, Leiter)

Welche SELECT-Abfragen sind syntaktisch korrekt?
- SELECT * FROM Abteilungen NATURAL JOIN Angestellte;
- SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);
- SELECT * FROM Abteilungen JOIN Angestellte;
- SELECT * FROM Abteilungen, Angestellte OUTER JOIN Angestellte;
- SELECT * FROM Abteilungen, Angestellte FULL OUTER JOIN Angestellte USING (Abt_nr);
- SELECT * FROM Abteilungen, Angestellte THETA JOIN Angestellte USING (Abt_nr);
A: SELECT * FROM Abteilungen NATURAL JOIN Angestellte;; SELECT * FROM Abteilungen JOIN Angestellte USING (Abt_nr);; SELECT * FROM Abteilungen, Angestellte FULL OUTER JOIN Angestellte USING (Abt_nr);; SELECT * FROM Abteilungen, Angestellte THETA JOIN Angestellte USING (Abt_nr);
Feedback: SELECT * FROM Abteilungen JOIN Angestellte; SELECT * FROM Abteilungen OUTER JOIN Angestellte; Bei diesen beiden SELECTs fehlt eine USING- oder ON-Klausel, damit das DBS weiß, mittels welcher Spalten die beiden Tabellen verknüpft werden sollen. Daher sind diese beiden Abfragen syntaktisch falsch. Die anderen Abfragen sind syntaktisch korrekt.

Q: Wann wird ein Datensatz in die Ergebnismenge einer SQL-Anfrage aufgenommen?
- Wenn die WHERE-Bedingung zu FALSE ausgewertet wird.
- Wenn die WHERE-Bedingung zu UNKNOWN ausgewertet wird.
- Wenn die WHERE-Bedingung zu TRUE ausgewertet wird.
A: Wenn die WHERE-Bedingung zu TRUE ausgewertet wird.
Feedback: Achtung: SQL basiert auf einer drei-wertigen Logik! D.h. es gibt die drei Wahrheitwerte: TRUE, FALSE, UNKNOWN. Bei SELECT-Anfragen wird UNKNOWN wie FALSE behandelt und ein Datensatz kommt nur in die Ergebnismenge, wenn die WHERE-Bedingung zu TRUE ausgewertet wird. Wird die WHERE-Bedinung zu UNKNOWN oder FALSE ausgewertet, dann wird der Datensatz "fallen gelassen". Achtung: Bei der Integritätsprüfung ist das etwas anders: Ein Constraint in SQL ist erfüllt wenn es zu TRUE oder zu UNKNOWN ausgewertet wird. Grund ist: Die Constraints werden bereits beim CREATE TABLE das erste Mal geprüft und damit über der leeren Tabelle. Wenn jetzt UNKNOWN wie FALSE behandelt würde, könnte der CREATE TABLE gar nicht ausgeführt werden. Der andere Punkt sind die (potentiell) leeren Spalten für die die Constraints trotzdem erfüllt sein sollen. Z.B. kann bei einem Detail-Datensatz eine Fremdschlüsselspalte leer sein oder UNIQUE-Spalten dürfen leer sein, ohne dass das Constraint gleich verletzt ist.

Q: Betrachten Sie eine Tabelle Spiel, in der die Ergebnisse der Bundesliga abgespeichert sind:

Spiel
Heimmannschaft | Gastmannschaft | Heimpunkte | Gastpunkte
Bayern München | Borussia Dortmund | 1 | 1
Borussia Dortmund | Bayern München | 0 | 3
Bayern München | Schalke | 3 | 0
Schalke | Bayern München | 0 | 3

Was ist die Ausgabe für folgende Anfrage?

SELECT Gastmannschaft
FROM Spiel
GROUP BY Gastmannschaft
HAVING SUM(Gastpunkte) > ALL (
  SELECT SUM(Gastpunkte)
  FROM Spiel
  GROUP BY Gastmannschaft
)
- Bayern München
- Borussia Dortmund
- Schalke
- 3
- 0
- 1
- No rows
A: No rows
Feedback: Die Anfrage liefert kein Ergebnis, weil im oberen und unteren SELECT die gleichen Zahlen ermittelt werden: dann kann naturgemäß keine Zahl größer als alle anderen sein. Die Semantik der Anfrage ist: "Welche Mannschaften haben mehr Punkte als alle Mannschaften als Gastmannschaft erzielt?", das geht nicht. Wenn die Abfrage mit >= formuliert worden wäre, wäre die Semantik der Anfrage: "Welche Mannschaften haben die meisten Punkte als Gastmannschaft erzielt?"

Q: Die Duplikate der Ergebnismenge einer Anfrage sollen nur einmal angezeigt werden. Welches Schlüsselwort ist in der Anfrage dafür zuständig?
- DESC
- DISTINCT
- UNIQUE
- ASC
- Diese Problematik gibt es bei SQL nicht, da Duplikate nicht zugelassen sind und automatisch unterdrückt werden.
A: DISTINCT
Feedback: Anders als bei der Relationalen Algebra, in der Duplikate nicht zugelassen sind und daher automatisch eliminieren werden, sind in SQL Duplikate zugelassen. Um Duplikate in SQL zu unterdrücken, muss man in der SELECT-Anweisung explizit die Option DISTINCT verwenden: SELECT DISTINCT spaltenname, .... FROM ....; UNIQUE ist ein Constraint und zwar das für die Zweitschlüssel. ASC/DESC sind die Schlüsselwörter für die ab-/aufsteigende Sortierung in der ORDER BY-Klausel von SELECT-Anfragen.

Q: Welche SELECT-Abfrage mit DISTINCT filtert aus einer Tabelle(Spalte1, Spalte2) alle Werte heraus, dies sowohl in der Spalte1 als auch in der Spalte2 verschiedene Werte haben?
- SELECT DISTINCT SPALTE1, SPALTE2 FROM Tabelle;
- SELECT DISTINCT SPALTE1, DISTINCT SPALTE2 FROM Tabelle;
- SELECT SPALTE1, DISTINCT SPALTE2 FROM Tabelle;
A: SELECT DISTINCT SPALTE1, SPALTE2 FROM Tabelle;
Feedback: Das Schlüsselwort DISTINCT kann nur einmal in der SELECT-Klausel vorkommen, und zwar vor dem ersten Spaltennamen.

Q: Betrachten Sie eine Tabelle Spiel, in der die Ergebnisse der Bundesliga abgespeichert sind:

Spiel
Heimmannschaft | Gastmannschaft | Heimpunkte | Gastpunkte
Bayern München | Borussia Dortmund | 1 | 1
Borussia Dortmund | Bayern München | 0 | 3
Bayern München | Schalke | 3 | 0
Schalke | Bayern München | 0 | 3

Was ist die Ausgabe für folgende Anfrage?

SELECT Gastmannschaft
FROM Spiel
GROUP BY Gastmannschaft
HAVING SUM(Gastpunkte) >= ANY (
  SELECT SUM(Gastpunkte)
  FROM Spiel
  GROUP BY Gastmannschaft
)
- Bayern München
- Borussia Dortmund
- Schalke
- 3
- 0
- 1
- No rows
A: Bayern München; Borussia Dortmund; Schalke
Feedback: Die Anfrage liefert als Ergebnis alle drei Vereine: "Dortmund, Bayern München, Schalke", weil im oberen und unteren SELECT die gleichen Zahlen ermittelt werden und dann werden die Zahlen mit >= ANY, also "größer gleich irgendeiner Zahl" verglichen. Die Semantik der Anfrage wäre: "Welche Mannschaften haben die meisten Punkte als Gastmannschaft erzielt?", wenn die Abfrage mit ">= ALL" formuliert worden wäre.

Q: Welche der folgenden Abfragen sind in SQL syntaktisch korrekt?
- SELECT Abt_Nr FROM Angestellte GROUP BY Abt_Nr WHERE COUNT(*) > = 5;
- SELECT Abt_Nr FROM Angestellte GROUP BY Abt_Nr HAVING COUNT(*) > = 5;
- SELECT Abt_Nr FROM Angestellte WHERE COUNT(*) > = 5 GROUP BY Abt_Nr;
A: SELECT Abt_Nr FROM Angestellte GROUP BY Abt_Nr HAVING COUNT(*) > = 5;
Feedback: Eine Spalte, die nicht in der GROUP-BY-Klausel vorkommt, muss in der SELECT-Klausel eine Gruppenfunktion (AVG, SUM , MIN, MAX oder COUNT) haben.

Q: Gegeben sei folgender Ausschnitt eines relationalen Schemas einer Datenbank:

Angestellte(Ang_Nr, Nachname, Ort, Abt_Nr, Jahresgehalt)

Welche Abfragen liefern die Angestellten, die das höchste Jahresgehalt haben?
- SELECT Ang_Nr FROM Angestellte WHERE Jahresgehalt > ALL;
- SELECT max( ALL Jahresgehalt) FROM Angestellte;
- SELECT Nachname, max(Jahresgehalt) FROM Angestellte GROUP BY Nachname;
- SELECT Nachname, max(Jahresgehalt) FROM Angestellte;
- SELECT a.Nachname, a.Jahresgehalt FROM Angestellte a WHERE a.Jahresgehalt = max(Jahresgehalt);
- SELECT Ang_Nr, Jahresgehalt FROM Angestellte WHERE Jahresgehalt = ( SELECT max(Jahresgehalt) FROM Angestellte );
- SELECT Ang_Nr FROM Angestellte WHERE Jahresgehalt > ALL( SELECT Jahresgehalt FROM Angestellte );
- SELECT Ang_Nr, Jahresgehalt FROM Angestellte WHERE Jahresgehalt >= ALL( SELECT Jahresgehalt FROM Angestellte );
A: SELECT Ang_Nr, Jahresgehalt FROM Angestellte WHERE Jahresgehalt = ( SELECT max(Jahresgehalt) FROM Angestellte );; SELECT Ang_Nr, Jahresgehalt FROM Angestellte WHERE Jahresgehalt >= ALL( SELECT Jahresgehalt FROM Angestellte );
Feedback: Die Abfrage SELECT nachname, max(jahresgehalt) FROM angestellte GROUP by nachname; ist syntaktisch korrekt, aber nicht semantisch, da die höchsten Jahresgehälter je Nachname berechnet werden. Ansonsten kann das Ergebnis über WHERE jahresgehalt >= ALL(...) berechnet werden.

Q: Welche SELECT-Komponenten lassen sich in der relationalen Algebra ausdrücken?
- GROUP BY
- FROM
- HAVING
- ORDER BY
- SELECT
- WHERE
A: GROUP BY; FROM; SELECT; WHERE
Feedback: Kein ORDER BY: Sortiert wird in der Relationalen Algebra nicht Kein GROUP BY, kein HAVING: Gruppiert wird in der Relationalen Algebra nicht. Die Zuordnung Relationale Algebra <-> SQL entnehmen Sie bitte der folgenden Tabelle: Relationale Algebra | SQL Projektion | SELECT Selektion | WHERE Kartesisches Produkt | FROM Theta Join | FROM + WHERE Natural Join | FROM + WHERE + SELECT Vereinigung | UNION Differenz | EXCEPT / MINUS / NOT IN / NOT EXISTS Durchschnitt | INTERSECTION Division | "doppeltes NOT EXISTS"/"Zählen"

Q: Welcher JOIN-Tabellen-Typ hat eine USING-Klausel?
- CROSS-JOIN
- NATURAL-JOIN
- THETA-JOIN
A: THETA-JOIN
Feedback: Beim CROSS JOIN, dem kartesischen Produkt, gibt es gar keine Verknüpfungsspalten. Jeder Datensatz der einen Relation wird "grundlos" mit jedem anderen aus der anderen Relation verknüpft. Beim NATURAL JOIN gibt es zwar eine Bedingung, aber die ist vordefiniert, so dass keine Spalten mittels ON spezifiziert werden müssen. Die vordefinierte Bedingung heißt: Alle Spalten mit gleichen Namen werden auf Gleichheit verglichen und die Teilbedingungen ggf. mit AND verknüpft. Lediglich beim THETA JOIN können Spalten für die JOIN-Bedingung angegeben werden.

Q: Welcher JOIN-Tabellen-Typ hat eine ON-Klausel?
- CROSS-JOIN
- NATURAL-JOIN
- THETA-JOIN
A: THETA-JOIN
Feedback: Beim CROSS JOIN, dem kartesischen Produkt, gibt es gar keine Verknüpfungsspalten. Jeder Datensatz der einen Relation wird "grundlos" mit jedem anderen aus der anderen Relation verknüpft. Beim NATURAL JOIN gibt es zwar eine Bedingung, aber die ist vordefiniert, so dass keine Spalten mittels ON spezifiziert werden müssen. Die vordefinierte Bedingung heißt: Alle Spalten mit gleichen Namen werden auf Gleichheit verglichen und die Teilbedingungen ggf. mit AND verknüpft. Lediglich beim THETA JOIN können Spalten für die JOIN-Bedingung angegeben werden.

Q: Wann wird ein Datensatz nicht in die Ergebnismenge einer SQL-Anfrage aufgenommen?
- Wenn die WHERE-Bedingung zu FALSE ausgewertet wird.
- Wenn die WHERE-Bedingung zu UNKNOWN ausgewertet wird.
- Wenn die WHERE-Bedingung zu TRUE ausgewertet wird.
A: Wenn die WHERE-Bedingung zu FALSE ausgewertet wird.; Wenn die WHERE-Bedingung zu UNKNOWN ausgewertet wird.
Feedback: Achtung: SQL basiert auf einer drei-wertigen Logik! D.h. es gibt die drei Wahrheitwerte: TRUE, FALSE, UNKNOWN. Bei SELECT-Anfragen wird UNKNOWN wie FALSE behandelt und ein Datensatz kommt nur in die Ergebnismenge, wenn die WHERE-Bedingung zu TRUE ausgewertet wird. Wird die WHERE-Bedinung zu UNKNOWN oder FALSE ausgewertet, dann wird der Datensatz "fallen gelassen". Achtung: Bei der Integritätsprüfung ist das etwas anders: Ein Constraint in SQL ist erfüllt wenn es zu TRUE oder zu UNKNOWN ausgewertet wird. Grund ist: Die Constraints werden bereits beim CREATE TABLE das erste Mal geprüft und damit über der leeren Tabelle. Wenn jetzt UNKNOWN wie FALSE behandelt würde, könnte der CREATE TABLE gar nicht ausgeführt werden. Der andere Punkt sind die (potentiell) leeren Spalten für die die Constraints trotzdem erfüllt sein sollen. Z.B. kann bei einem Detail-Datensatz eine Fremdschlüsselspalte leer sein oder UNIQUE-Spalten dürfen leer sein, ohne dass das Constraint gleich verletzt ist.

Q: Gegeben sei folgender Ausschnitt eines relationalen Schemas einer Datenbank:

Spieler (Spieler_id, Name, Adresse, Geburtsdatum)
Vereine (V_Kuerzel, Vereinsname, Ort, Gruendungsjahr )
Spiele (Spiel_id, Heim_V_Kuerzel, Gast_V_Kuerzel, Spieltag, Ergebnis, Anzahl_Zuschauer)
Spieleinsatz (Spiel_id, Spieler_id, von_Minute, bis_Minute)

Welche der angegeben SQL-Abfragen beantwortet/en die Frage: Welche Spieler (Name, Adresse) haben noch nie in einem Spiel mit mehr als 30000 Zuschauern mitgespielt?
- SELECT Name, Adresse FROM Spieler s, Spieleinsatz e WHERE s.Spieler_Id = e.Spieler_Id AND Anzahl_Zuschauer > 30000 AND COUNT (s.Spieler_Id ) IS NULL;
- SELECT Name, Adresse FROM Spieler s, Spieleinsatz e WHERE s.Spieler_Id = e.Spieler_Id AND Anzahl_Zuschauer > 30000 HAVING COUNT(s.Spieler_Id ) = 0;
- SELECT Name, Adresse FROM Spieler WHERE Spieler_id NOT IN ( SELECT Spieler_Id FROM Spieleinsatz, Spiele WHERE Anzahl_Zuschauer > 30000 AND Spiele.Spiel_Id = Spieleinsatz.Spiel_Id );
- SELECT Name, Adresse FROM Spieler se WHERE NOT EXISTS ( SELECT Spieler_Id FROM Spieleinsatz se WHERE Anzahl_Zuschauer > 30000 ) AND se.Spieler_Id = sp.Spieler_Id;
- SELECT Name, Adresse FROM Spieler se WHERE NOT EXISTS ( SELECT Spieler_Id FROM Spieleinsatz se WHERE Anzahl_Zuschauer > 30000 );
A: SELECT Name, Adresse FROM Spieler WHERE Spieler_id NOT IN ( SELECT Spieler_Id FROM Spieleinsatz, Spiele WHERE Anzahl_Zuschauer > 30000 AND Spiele.Spiel_Id = Spieleinsatz.Spiel_Id );
Feedback: Antwort 1 ist syntaktisch falsch: Aggregatfunktionen können nicht in der WHERE-Klausel verwendet werden, nur in der SELECT-, GROUP BY, HAVING-Klausel. Antwort 2 ist semantisch falsch: Mit dem Natural Join werden nur die Spiele mit mehr als 3000 Zuschauern ermittelt. Anschließend wird mit der HAVING-Bedingung versucht, die Spieler zu ermitteln, die kein solches Spiel haben. Ergebnis: aufgrund dieses Widerspruchs immer die leere Menge. Antwort 3 ist richtig! Antwort 4 ist semantisch und syntaktisch falsch: Die schließende Klammer steht falsch. Richtig wäre die Anfrage, wenn die AND-Bedingung zur Unteranfrage gehören würde. Aber so, gehört sie zur oberen Anfrage und damit ist das Ganze nicht ausführbar, denn z.B. der Tabellenalias se ist im oberen SELECT nicht bekannt, nur im unteren. Antwort 5 ist semantisch falsch: Der Unteranfrage fehlt die Korrelation zur oberen Anfragen (unkorrelierter EXISTS). So liefert die obere Anfrage immer die leere Menge als Ergebnis, sobald es wenigstens ein Spiel mit mehr als 3000 Zuschauern gibt, also wenn der untere SELECT wenigstens einen Datensatz liefert.

Q: Ordnen Sie den Vergleichen die jeweils erzeugten Ergebnisse zu:
- < ALL | Kein Wert der Menge
- <= ALL | Kleinster Wert der Menge
- < ANY | Alle Werte der Menge außer dem Maximum
- <= ANY | Alle Werte der Menge
Feedback: Wenn ein Wert kleiner ist als jeder (< ALL) Wert des Ergebnis einer Unterabfrage, ist er insbesondere auch kleiner als das Minimum der Werte der Unterabfrage, also wird kein Wert der Menge ausgewählt. Wenn ein Wert kleiner oder gleich ist wie jeder (<= ALL) Wert des Ergebnis einer Unterabfrage, wird nur das Minimum ausgewählt Wenn ein Wert kleiner ist als irgendein (< ANY) Wert des Ergebnis einer Unterabfrage, ist er insbesondere auch kleiner als das Maximum der Werte der Unterabfrage, also werden alle Werte aaußer dem Maximum ausgewählt. Wenn ein Wert kleiner oder gleich ist wie irgendein (<= ANY) Wert des Ergebnis einer Unterabfrage, werden alle Werte der Menge ausgewählt.

Q: Ordnen Sie den Vergleichen die jeweils erzeugten Ergebnisse zu:
- > ALL | Kein Wert der Menge
- >= ALL | Größter Wert der Menge
- > ANY | Alle Werte der Menge außer dem Minimum
- >= ANY | Alle Werte der Menge
Feedback: Wenn ein Wert größer ist als jeder (> ALL) Wert des Ergebnis einer Unterabfrage, ist er insbesondere auch größer als das Maximum der Werte der Unterabfrage, also wird kein Wert der Menge ausgewählt. Wenn ein Wert größer oder gleich ist wie jeder (>= ALL) Wert des Ergebnis einer Unterabfrage, wird nur das Maximum ausgewählt. Wenn ein Wert größer ist als irgendein (> ANY) Wert des Ergebnis einer Unterabfrage, ist er insbesondere auch größer als das Minimum der Werte der Unterabfrage, also werden alle Werte aaußer dem Minimum ausgewählt. Wenn ein Wert größer oder gleich ist wie irgendein (>= ANY) Wert des Ergebnis einer Unterabfrage, werden alle Werte der Menge ausgewählt.

Q: Gegeben sei folgender Ausschnitt eines relationalen Schemas einer Datenbank:

Spieler (Spieler_id, Name, Adresse, Geburtsdatum)
Vereine (V_Kuerzel, Vereinsname, Ort, Gruendungsjahr )
Spiele (Spiel_id, Heim_V_Kuerzel, Gast_V_Kuerzel, Spieltag, Ergebnis, Anzahl_Zuschauer)
Spieleinsatz (Spiel_id, Spieler_id, von_Minute, bis_Minute)

Welche der angegeben SQL-Abfragen beantwortet/en die Frage: Welche Vereine (Kürzel, Name) haben wenigstens ein Auswärtsspiel, also wenigstens ein Spiel als Gastmannschaft, in der Rückrunde (Spieltag 18-34) absolviert?
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag BETWEEN 18 AND 34;
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag >= 18 AND <= 34;
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE spieltag BETWEEN 18 AND 34;
- SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 );
- SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 GROUP BY gast_v_kuerzel HAVING COUNT (*) >=1 );
A: SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag BETWEEN 18 AND 34;; SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag >= 18 AND <= 34;; SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 );; SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 GROUP BY gast_v_kuerzel HAVING COUNT (*) >=1 );
Feedback: Anfrage 3 ist semantisch falsch: Es wird hier das kartesische Produkt zwischen den beiden Tabellen ausgeführt und nicht der Natural Join. Die übrigen Anfragen sind alle richtig.

Q: Gegeben sei folgender Ausschnitt eines relationalen Schemas einer Datenbank:

Spieler (Spieler_id, Name, Adresse, Geburtsdatum)
Vereine (V_Kuerzel, Vereinsname, Ort, Gruendungsjahr )
Spiele (Spiel_id, Heim_V_Kuerzel, Gast_V_Kuerzel, Spieltag, Ergebnis, Anzahl_Zuschauer)
Spieleinsatz (Spiel_id, Spieler_id, von_Minute, bis_Minute)

Welche der angegeben SQL-Abfragen beantwortet/en die Frage: Welche Vereine (Kürzel, Name) haben wenigstens ein Auswärtsspiel - also wenigstens ein Spiel als Gastmannschaft - in der Rückrunde (Spieltag 18-34) absolviert?
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag BETWEEN 18 AND 34;
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag >= 18 AND <= 34;
- SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE spieltag BETWEEN 18 AND 34;
- SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 );
- SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 GROUP BY gast_v_kuerzel HAVING COUNT (*) >=1 );
A: SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag BETWEEN 18 AND 34;; SELECT v_kuerzel, vereinsname FROM verein, spiele WHERE v_kuerzel = gast_v_kuerzel AND spieltag >= 18 AND <= 34;; SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 );; SELECT v_kuerzel, vereinsname FROM verein WHERE v_kuerzel IN ( SELECT gast_v_kuerzel FROM spiele WHERE spieltag BETWEEN 18 AND 34 GROUP BY gast_v_kuerzel HAVING COUNT (*) >=1 );
Feedback: Anfrage 3 ist semantisch falsch: Es wird hier das kartesische Produkt zwischen den beiden Tabellen ausgeführt und nicht der Natural Join. Die übrigen Anfragen sind alle richtig.

Q: Betrachten Sie eine Tabelle Employee, in der die Angestellten einer Firma, die Zuordnung zu ihren Vorgesetzen (Mgr = Manager) und ihre Jobbezeichnungen abgespeichert sind:

Employee
EmpNo | Name | Job | Mgr
m01 | Maria | CEO | null
m02 | Anna | Admin | m01
m03 | Heinz | Redaktion | m02
m04 | Lisa | Redaktion | m02

Wählen Sie eine oder mehrere Anweisungen aus, die einen syntaktisch korrekten Self-Join enthalten.
- SELECT Emp.EmpNo, Emp.Name FROM Employee Emp, Employee Chef WHERE Emp.Mgr = Chef.EmpNo AND Chef.Job = 'Admin'; (Syntax: Der Self-Join stellt eine Beziehung innerhalb der gleichen Tabelle her mit zwei Bedingungen: 1. Es wird eine Schlüssel-Fremdschlüssel-Beziehung zwischen Mgr und EmpNo hergestellt für die Zuordnung von Angestellten und Mitarbeitern. 2. Die Job-Bezeichnung ist ‚Admin‘. Durch die Bedingungen werden die Angestellten selektiert, auf die diese Bedingungen zutreffen. Semantik: Welche Angestellten haben einen Admin als Chef?)
- SELECT A.Name, B.Name, FROM Employee A, Employee B WHERE A.Job = B.Job AND A.EmpNo > B.EmpNo; (Syntax: Der Self-Join stellt eine Beziehung innerhalb der gleichen Tabelle her mit zwei Bedingungen: 1. Bedingung: Es wird eine Schlüssel-Fremdschüssel-Beziehung durch das Attribut Job hergestellt. 2. Bedingung: Das Attribut EmpNo muss verschieden sein. Es werden nur die Jobs verschiedener Personen betrachtet. Um inhaltlich gleiche Ausgaben („Heinz, Lisa“ und „Lisa, Heinz“) zu vermeiden wird nicht auf Ungleichheit (<> oder !=) sondern auf Größer als geprüft (>). Durch die Projektions-Bedingung werden jeweils zwei Angestellte mit dem gleichen Job ausgegeben. Semantik: Welche Angestellten haben den gleichen Job?)
- SELECT A.EmpNo, B.Name FROM Employee A NATURAL JOIN Employee B; (Ein Natural Join stellt die Schlüssel-Fremdschlüssel-Beziehung per Definition über gleiche Attributnamen her. Bei einem Natural Join mit der gleichen Tabelle sind alle Attributnamen gleich, also ist das Ergebnis die Ausgangstabelle. Die Verwendung des Natural Join-Konstrukts entsprechend sinnlos.)
- SELECT Emp.EmpNo, Emp.Name FROM Employee, Employee WHERE Mgr = EmpNo AND Job = 'Admin'; (Fehler 1: Die Selektion greift auf einen nicht definierten Bezeichner "Emp" zurück. Fehler 2: Die Selektionsbedingung ist nicht eindeutig, da Mgr, EmpNo und Job jeweils in beiden Tabellen vorkommen.)
A: SELECT Emp.EmpNo, Emp.Name FROM Employee Emp, Employee Chef WHERE Emp.Mgr = Chef.EmpNo AND Chef.Job = 'Admin';; SELECT A.Name, B.Name, FROM Employee A, Employee B WHERE A.Job = B.Job AND A.EmpNo > B.EmpNo;

Q: In welcher Reihenfolge müssen in einem SELECT-Befehl die folgenden Klauseln stehen? Die eckigen Klammern geben die Optionalität der Klauseln an.

1. [...]

2. [...]

3. [...]

4. [...]

5. [...]

6. [...]
A: SELECT ...; FROM ...; [ WHERE ... ]; [ GROUP BY ... ]; [ HAVING ... ]; [ ORDER BY ... ]
Feedback: Die Reihenfolge der Klauseln einer SELECT-Anfrage sind: 1. SELECT ... 2. FROM ... 3. [ WHERE ... ] 4. [ GROUP BY ... ] 5. [ HAVING ... ] 6. [ ORDER BY ... ]

Q: In welcher Reihenfolge werden die Klauseln eines SELECT-Befehls vom Computer ausgeführt? Die eckigen Klammern geben die Optionalität der Klauseln an.

1. [...]

2. [...]

3. [...]

4. [...]

5. [...]

6. [...]
A: FROM ...; [ WHERE ... ]; [ GROUP BY ... ]; [ HAVING ... ]; [ ORDER BY ... ]; SELECT ...
Feedback: Die Reihenfolge der Ausführung von Klauseln einer SELECT-Anfrage durch den Computer ist wie folgt: 1. FROM ... 2. [ WHERE ... ] 3. [ GROUP BY ... ] 4. [ HAVING ... ] 5. [ ORDER BY ... ] 6. SELECT ...

Q: Sortieren Sie die Vergleichs- und logischen Operatoren nach der Priorität von 1 (höchste) bis 4 (niedrigste) unter SQL!

1. [...]

2. [...]

3. [...]

4. [...]
A: Vergleichsoperatoren (=, <=, >=, ...); NOT; AND; OR
Feedback: Die Ausführungsreihenfolge bei den Vergleichs- und logischen Operatoren ist folgende: 1. Vergleichsoperatoren (=, <=, >=, ...) 2. NOT 3. AND 4. OR Am einfachsten ist es jedoch, Klammern zu setzen - da kann man bei der Ausführungsreihenfolge nichts falsch machen ;-)

Q: Welche SQL-Abfragen liefern das gleiche Ergebnis?
- SELECT Nachname, Vorname, Gehalt FROM Angestellte WHERE Gehalt BETWEEN 3000 AND 3600;
- SELECT Nachname, Vorname, Gehalt FROM Angestellte WHERE Gehalt > 3000 AND Gehalt < 3600
- SELECT Nachname, Vorname, Gehalt FROM Angestellte WHERE Gehalt >= 3000 AND Gehalt <= 3600
- SELECT Nachname, Vorname, Gehalt FROM Angestellte WHERE Gehalt IN (3000, 3600)
A: SELECT Nachname, Vorname, Gehalt FROM Angestellte WHERE Gehalt BETWEEN 3000 AND 3600; / SELECT Nachname, Vorname, Gehalt FROM Angestellte WHERE Gehalt >= 3000 AND Gehalt <= 3600
Feedback: Der BETWEEN-Vergleichsoperator schließt die Grenzwerte beim Vergleich mit ein, so dass die WHERE-Klausel "Gehalt >= 3000 AND Gehalt <= 3600" die gleichen Datensätze in der Ergebnisdatenmenge liefert. IN vergleicht nur mit den beiden Werten 3000 und 3600, aber nicht die Zwischenwerte 3001 ... 3599.