Martin-Luther-Universität Halle-Wittenberg
Institut für Informatik
Datenbanken

Umfrage zu semantischen Fehlern in SQL-Anfragen

Christian Goldberg, Stefan Braß


Inhalt und Ziel der Umfrage

Diese Umfrage hat zum Ziel, statistische Erhebungen bzgl. semantischer Fehler, Laufzeitfehler und des Stils von SQL-Anfragen durchzuführen. Insbesondere ist Ihre Meinung zu bestimmten Fehlerarten und Stilfragen erwünscht.

Die SQL-Statements beziehen sich sämtlich auf die folgenden 2 Tabellen der Oracle-Beispieldatenbank EMP-DEPT:


CREATE TABLE EMP(
   EMPNO  NUMERIC(4)  PRIMARY KEY,
   ENAME  VARCHAR(20) NOT NULL,
   JOB    VARCHAR(20) NOT NULL,
   SAL    NUMERIC(4)  NOT NULL,
   COMM   NUMERIC(4)  NULL,
   MGR    NUMERIC(4)  REFERENCES EMP,
   DEPTNO NUMERIC(2)  NOT NULL REFERENCES DEPT);

CREATE TABLE DEPT(
   DEPTNO NUMERIC(2)  PRIMARY KEY,
   DNAME  VARCHAR(20) NOT NULL,
   LOC    VARCHAR(20));


Personenbezogene Daten

Vorname:
Nachname:
Password:

Es wird Ihr Name und Passwort abgefragt, damit Missbrauch dieses Formulars verhindert wird (es sollen nur Teilnehmer der Vorlesung DB1 dieses Formular ausfüllen, und jeder auch nur einmal). Es wird hierbei nur die Menge der Teilnehmer abgespeichert, die das Formular ausgefüllt hat, und die Menge der abgegebenen Formulare, ohne eine Beziehung zwischen beiden. Sobald also mindestens zwei Teilnehmer ein ausgefülltes Formular abgeschickt haben, sind diese Formulare den Teilnehmern nicht mehr eindeutig zuzuordnen. Die Anonymität steigt natürlich direkt proportional mit der Anzahl der abgegebenen Formulare.


1. Teil: Semantische Fehler

1.1. Geben Sie Nummer, Name und Abteilungsname aller Verkäufer (SALESMAN) an.

SELECT EMPNO, ENAME, DNAME
FROMEMP, DEPT
WHEREJOB = 'SALESMAN'

Ist das SQL-Statement korrekt, nicht unnötig kompliziert und liefert genau die geforderten Tupel?

Falls nein, warum nicht?


1.2. Geben sie Nummer und Name des/der Angestellten mit dem geringsten Gehalt von den Analysten und Managern aus.

SELECT EMPNO, ENAME, SAL
FROMEMP
WHEREJOB = 'ANALYST'
ANDJOB = 'MANAGER'
ANDSAL = (SELECTMIN(SAL)
FROMEMP )

Ist das SQL-Statement korrekt, nicht unnötig kompliziert und liefert genau die geforderten Tupel?

Falls nein, warum nicht?


1.3. Welche Jobs gibt es in der Abteilung in New York?

SELECT DISTINCT JOB
FROMEMP
WHEREDEPTNO = (SELECTDEPTNO
FROMDEPT
WHERELOC = 'NEW YORK' )

Ist das SQL-Statement korrekt, nicht unnötig kompliziert und liefert genau die geforderten Tupel?

Falls nein, warum nicht?


1.4. Geben Sie Nummer, Name und Abteilungsnummer aller Manager aus.

SELECT EMPNO, ENAME, D.DEPTNO
FROMDEPT D, EMP E
WHERED.DEPTNO = E.DEPTNO
ANDE.JOB = 'MANAGER'

Ist das SQL-Statement korrekt, nicht unnötig kompliziert und liefert genau die geforderten Tupel?

Falls nein, warum nicht?


1.5. Geben Sie Nummer, Namen und Job aller Angestellten aus, die nicht Vorgesetzte für jemand anderes sind.

SELECT EMPNO, ENAME, JOB
FROMEMP
WHERE EMPNO NOT IN (SELECTMGR
FROMEMP )

Ist das SQL-Statement korrekt, nicht unnötig kompliziert und liefert genau die geforderten Tupel?

Falls nein, warum nicht?


1.6. Geben Sie Nummer, Name und Gehalt des Verkäufers mit der maximalen Provision (COMM) aus.

SELECT EMPNO, ENAME, MAX(COMM)
FROMEMP
WHEREJOB = 'SALESMAN'
GROUP BYEMPNO, ENAME

Ist das SQL-Statement korrekt, nicht unnötig kompliziert und liefert genau die geforderten Tupel?

Falls nein, warum nicht?


2. Teil: Stilfragen

2.1. Joins

Welches der beiden äquivalenten SQL-Statements würden Sie bevorzugen?

SELECT EMPNO, ENAME, LOC SELECT EMPNO, ENAME, LOC
FROMEMP E, DEPT D FROMEMP NATURAL JOIN DEPT
WHEREE.DEPTNO = D.DEPTNO
  

Aus welchem Grund? (optional)


2.2. Klammersetzung

Welches der beiden äquivalenten SQL-Statements würden Sie bevorzugen?

SELECT EMPNO, ENAME, JOB, LOC SELECT EMPNO, ENAME, JOB, LOC
FROMEMP E, DEPT D FROMEMP E, DEPT D
WHEREE.DEPTNO = D.DEPTNO WHERE((E.DEPTNO = D.DEPTNO)
AND(JOB='MANAGER' AND(((JOB='MANAGER')
ANDLOC='NEW YORK' AND(LOC='NEW YORK'))
ORJOB='CLERK' OR((JOB='CLERK')
ANDLOC='DALLAS') AND(LOC='DALLAS'))))

Aus welchem Grund? (optional)


2.3. EXISTS / IN

Welches der beiden äquivalenten SQL-Statements würden Sie bevorzugen?

SELECT EMPNO, ENAME, JOB SELECT EMPNO, ENAME, JOB
FROMEMP M FROMEMP M
WHEREEXISTS (SELECT* WHEREEMPNO IN (SELECTMGR
FROMEMP E FROMEMP E
WHEREE.MGR = M.EMPNO WHEREE.DEPTNO <> M.DEPTNO )
ANDE.DEPTNO <> M.DEPTNO )

Aus welchem Grund? (optional)


2.4. Argument von COUNT()

Welches der beiden äquivalenten SQL-Statements würden Sie bevorzugen?

SELECT DNAME, COUNT(*) SELECT DNAME, COUNT(ENAME)
FROMEMP E, DEPT D FROMEMP E, DEPT D
WHEREE.DEPTNO = D.DEPTNO WHEREE.DEPTNO = D.DEPTNO
GROUP BYDNAME GROUP BYDNAME

Aus welchem Grund? (optional)


2.5. Verwendung von Tupelvariablen

Welches der beiden äquivalenten SQL-Statements würden Sie bevorzugen?
Die linke Anfrage verwendet Tupelvariablen nur dort wo es notwendig ist, die rechte überall.

SELECT EMPNO, ENAME, SAL, DNAME SELECT E.EMPNO, E.ENAME, E.SAL, D.DNAME
FROMEMP E, DEPT D FROMEMP E, DEPT D
WHEREE.DEPTNO = D.DEPTNO WHEREE.DEPTNO = D.DEPTNO
ANDLOC = 'DALLAS' ANDD.LOC = 'DALLAS'
ANDJOB = 'ANALYST' ANDE.JOB = 'ANALYST'
ANDSAL >= (SELECTMAX(SAL) ANDE.SAL >= (SELECTMAX(F.SAL)
FROMEMP F, DEPT G FROMEMP F, DEPT G
WHEREF.DEPTNO = G.DEPTNO WHEREF.DEPTNO = G.DEPTNO
ANDLOC = 'NEW YORK' ANDG.LOC = 'NEW YORK'
ANDJOB = 'MANAGER' ) ANDF.JOB = 'MANAGER' )

Aus welchem Grund? (optional)


Die Umfrage ist damit beendet.Vielen Dank für Ihre Mithilfe.

   

Bei Hinweisen oder Fragen zu dieser Umfrage (die sich nicht auf die Lösung der Aufgaben beziehen) schreiben Sie mir bitte eine E-Mail an:
goldberg "at" informatik . uni-halle . de.


CG, Halle (Saale), den 10.02.2005 16:41:57

Valid HTML 4.01! Valid CSS!