Inhaltsverzeichnis

ÜBUNGEN

bearbeiten

Übung 1

Aufgabe 1
Übung: Selektieren des Datensatzes für Hamlet, Cleopatra, Romeo oder Julia (einzelne Abfragen)

SELECT * FROM CHARACTER WHERE charname = 'Hamlet';
SELECT * FROM CHARACTER WHERE charname = 'Cleopatra';
SELECT * FROM CHARACTER WHERE charname = 'Romeo';
SELECT * FROM CHARACTER WHERE charname = 'Julia';  -- liefert die falsche Julia, da sie im Englischen Juliet heißt.

Aufgabe 2
Übung: Selektieren aller Charaktere mit genau 17 speeches.

SELECT * FROM CHARACTER WHERE speechcount = 17;

Aufgabe 3
Übung: Selektieren aller Charaktere mit 15 bis 20 speeches.

SELECT * FROM CHARACTER WHERE speechcount BETWEEN 15 AND 20;

Aufgabe 4
Übung: Selektieren aller Charaktere, die eine Beschreibung (description) haben, d.h. wo die Beschreibung nicht NULL ist.

SELECT * FROM CHARACTER WHERE description IS NOT NULL;

Übung 2

Aufgabe 1
Übung: Gesamtsumme aller speeches aus den Charakteren abfragen

SELECT SUM(speechcount)
FROM CHARACTER;

Aufgabe 2
Übung: Anzahl aller Werke

SELECT COUNT(*)
FROM WORK;

Aufgabe 3
Übung: Minimum und Maximum der speeches

SELECT MIN(speechcount),MAX(speechcount)
FROM CHARACTER;

Aufgabe 4
Übung: Die Anzahl der Werke vor 1600

-- sinnig:
SELECT COUNT(YEAR)
FROM WORK
WHERE YEAR < '1600';
 
-- unsinnig (aber verschachtelt)
SELECT COUNT(*)
FROM WORK
WHERE YEAR < (
  SELECT DISTINCT(YEAR)
  FROM WORK
  WHERE YEAR = '1600'
);

Übung 3

Aufgabe 1
Übung: Alle Werke vor 1600 nach Jahr sortiert

SELECT YEAR, title
FROM WORK
WHERE YEAR < '1600'
ORDER BY YEAR ASC;

Aufgabe 2
Übung: Alle Werke nach 1605 nach Anzahl der Worte

SELECT YEAR, title
FROM WORK
WHERE YEAR > '1605'
ORDER BY totalwords ASC;

Aufgabe 3
Übung: Alle Werke nach Anzahl der Absätze

SELECT YEAR, title, totalparagraphs
FROM WORK
ORDER BY totalparagraphs;

Übung 4

Aufgabe 1
Übung: alle Absätze aus Hamlet mit mehr als 1000 Zeichen

SELECT workid, charcount, plaintext
FROM paragraph
WHERE (workid = 'hamlet') AND (charcount > 1000);

Aufgabe 2
Übung: alle Absätze aus Macbeth mit mehr als 250 Wörtern

SELECT workid, wordcount, plaintext
FROM paragraph
WHERE (workid = 'macbeth') AND (wordcount > 250);

Aufgabe 3
Übung: alle Werke zwischen 1600 und 1605

SELECT YEAR, title
FROM WORK
WHERE (YEAR >= 1600) AND (YEAR <= 1605);

Übung 5

Aufgabe 1
Übung: alle Absätze aus Hamlet mit mehr als 1000 Zeichen oder 300 Wörtern

SELECT workid, charcount, wordcount, plaintext
FROM paragraph
WHERE (workid = 'hamlet') AND ((charcount > 1000) OR (wordcount > 300))
ORDER BY wordcount, charcount;

Aufgabe 2
Übung: alle Absätze aus Macbeth mit weniger als 100 Zeichen oder mehr als 250 Wörtern

SELECT workid, charcount, wordcount, plaintext
FROM paragraph
WHERE (workid = 'macbeth') AND ((charcount < 100) OR (wordcount > 250))
ORDER BY wordcount, charcount;

Übung 6

Aufgabe 1
Übung: alle Absätze aus Macbeth, die das Wort love enthalten

SELECT workid, charcount, wordcount, plaintext
FROM paragraph
WHERE (workid = 'macbeth') AND (plaintext LIKE '%love%');

Aufgabe 2
Übung: alle Absätze aus Macbeth, die das Wort love enthalten und von einem Charakter mit 'mac' im Namen gesprochen werden

SELECT workid, charcount, wordcount, plaintext
FROM paragraph
WHERE (workid = 'macbeth') AND ((plaintext LIKE '%love%') AND (charid LIKE '%mac%'));

Aufgabe 3
Übung: was ist wichtiger in Hamlet: Liebe oder Tod?

SELECT COUNT(*)
FROM paragraph
WHERE (workid = 'macbeth') AND (plaintext LIKE '%love%');
 
SELECT COUNT(*)
FROM paragraph
WHERE (workid = 'macbeth') AND (plaintext LIKE '%death%');

Übung 7

Aufgabe 1
Übung: alle Zahlen (mit Namen) kleiner als 3

SELECT *
FROM
  (numbers CROSS JOIN names)
WHERE (numbers.id = names.id) AND (VALUE < 3);

Aufgabe 2
Übung: Gewichtstabelle für alle Lebensmittel, die 'flour' im Namen enthalten

SELECT food_des.ndb_no, long_desc, amount, msre_desc, gm_wgt
FROM
    food_des
    CROSS JOIN weight
WHERE
    (food_des.ndb_no = weight.ndb_no)
    AND (long_desc ILIKE '%flour%');

Aufgabe 3
Übung: Inhaltsstoffe Ihres Lieblingsessens

SELECT food_des.ndb_no, long_desc, nutr_val, units, nutrdesc, nut_data.nutr_no
FROM 
    food_des
    CROSS JOIN nut_data
    CROSS JOIN nutr_def
WHERE
    food_des.ndb_no = nut_data.ndb_no
    AND nut_data.nutr_no = nutr_def.nutr_no
    AND (long_desc ILIKE '%McDONALD_S, Cheeseburger%')
;

Übung 8

Aufgabe 1
Übung: Finde das Lebensmittel, das am meisten Koffein enthält.

SELECT ndb_no, long_desc, nutr_val, units, nutrdesc, nutr_no
FROM 
    food_des
    INNER JOIN nut_data USING (ndb_no)
    INNER JOIN nutr_def USING (nutr_no)
WHERE
    (nutrdesc = 'Caffeine')
ORDER BY nutr_val DESC
LIMIT 1
 
-- Alternative Lösung 1
 
SELECT ndb_no, long_desc, nutr_val, units, nutrdesc, nutr_no
FROM 
    food_des
    INNER JOIN nut_data USING (ndb_no)
    INNER JOIN nutr_def USING (nutr_no)
WHERE
    nutrdesc = 'Caffeine'
    AND nutr_val = (
        SELECT MAX(nutr_val)
        FROM 
            nut_data
            INNER JOIN nutr_def USING (nutr_no)
        WHERE
            (nutrdesc = 'Caffeine')
    )
 
-- Alternative Lösung 2
 
SELECT ndb_no, long_desc, nutr_val, units, nutrdesc, nut_data.nutr_no
FROM 
    food_des
    INNER JOIN nut_data USING (ndb_no)
    INNER JOIN nutr_def USING (nutr_no)
    INNER JOIN
        (SELECT MAX(nutr_val) AS maxval, nutr_no
        FROM
            nut_data
            INNER JOIN nutr_def USING (nutr_no)
        GROUP BY nutr_no) AS max_nutr
        ON
            (max_nutr.nutr_no = nut_data.nutr_no
            AND max_nutr.maxval = nut_data.nutr_val)
WHERE
    nutr_val > 0
    AND nutrdesc = 'Caffeine';

Übung 9

Aufgabe 1
Übung: Gibt es Zahlen, die keinen Namen haben? Gibt es Namen, die keine Zahl haben? In einer Antwort, bitte!

SELECT *
FROM
  numbers
  FULL OUTER JOIN names USING (id)
WHERE
  (VALUE IS NULL)
  OR (name IS NULL)
;

Aufgabe 2
Übung: Gibt es ein Lebensmittel, von dem wir gar nichts wissen?

SELECT ndb_no, long_desc
FROM 
    food_des
    LEFT OUTER JOIN nut_data USING (ndb_no)
WHERE
  (nutr_no IS NULL);

Übung 10

Aufgabe 1
Übung: alle Teilnehmer

SELECT *
FROM employee
WHERE (rolle = 'Teilnehmer')

Aufgabe 2
Übung: alle Teilnehmer unter Johannes

SELECT employee.name AS name, boss.name AS boss
FROM
    employee
    INNER JOIN employee AS boss ON employee.manager = boss.id
WHERE
  (boss.id = 2)
  AND (employee.rolle = 'Teilnehmer')

Aufgabe 3
Übung: alle Trainer unter Ingo

SELECT employee.name AS name, boss.name AS boss
FROM
    employee
    INNER JOIN employee AS boss ON employee.manager = boss.id
WHERE
  (boss.id = 1)
  AND (employee.rolle = 'Trainer')

Aufgabe 4
Übung: alle Angestellten ohne Manager, und deren Untertanen

SELECT nomanager.name, employee.name
FROM
  employee
RIGHT OUTER JOIN (
  SELECT *
  FROM employee
  WHERE manager IS NULL
) AS nomanager ON ( nomanager.id = employee.manager)
 
-- Alternative Lösung
 
SELECT nomanager.name, employee.name
FROM
  employee
  RIGHT OUTER JOIN employee AS nomanager 
  ON ( nomanager.id = employee.manager)
WHERE manager.manager IS NULL

Übung (eigen)

Aufgabe 1
Übung: Erstelle eine Tabelle chars und fülle sie mit denselben Inhalten wie die Tabelle character.

CREATE TABLE chars (
  charid CHARACTER VARYING(32) NOT NULL,
  cahrname CHARACTER VARYING(64) NOT NULL,
  abbrev CHARACTER VARYING(32),
  description CHARACTER VARYING(2056),
  speechcount INTEGER
);
 
INSERT INTO chars
SELECT * FROM CHARACTER;

Aufgabe 2
Übung: Lösche Tabellen, die mit einem bestimmten Prefix beginnen

SET @TABLE_PREFIX = 'patrick\_2\_\_pm';
SET @DATABASE_SOURCE = 'd0173311';
SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME)
               FROM information_schema.TABLES
              WHERE TABLE_SCHEMA = @DATABASE_SOURCE
                AND TABLE_NAME LIKE CONCAT(@TABLE_PREFIX,'%'));
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SHOW TABLES;