DB

Datenbanken

Datenbanken


T. G.
Diese Lernkarten behandeln fortgeschrittene SQL-Konzepte für Universitätsstudenten in der Informatik. Sie decken Themen wie Tabellen, Relationen, Integrität, SQL-Befehle und Optimierung ab, mit Fokus auf Klauseln, Indizes und Performance-Tuning. Nutzer lernen, effiziente Abfragen zu schreiben und Datenbanken zu optimieren, was für Datenbankadministratoren und Entwickler besonders nützlich ist.
Cartes-fiches
152
Utilisateurs
5
Langue
Allemand
Catégorie
Informatique
Niveau
Université
Créé / Mis à jour
15.02.2015 / 05.03.2016

Cartes-fiches

Was tut : 

SELECT NVL(Telefonnr, 'Ohne Tel_Nr')
FROM Lieferanten;

Selektiert alle Telefonnummern aus der Lieferanten-Tabelle , 
wenn die Spalte einen NULL-Wert enthält wird "Ohne Tel_NR' angezeigt. 

Wähle aus der Tabelle angestellte alle Tupel deren eintrittsdatum zwischen 01.01.1994 und 02.03.1997 liegt. 

SELECT * 
FROM angestellte 
WHERE eintrittsdatum 
BETWEEN TO_DATE('01.01.1994', 'DD.MM.YYYY') AND TO_DATE('02.03.1997','DD.MM.YYYY'); 

Wieviele angestelle arbeiten in der Abteilung 2? 
Tabelle: angestellte 
Spalte mit Abteilungsnummern : Abt_Nr

SELECT COUNT(*) 
FROM angestellte 
WHERE Abt_nr = 2; 

Was passiert wenn eine Gruppenfunktion wie COUNT , AVG und SUM auf einen NULL-Wert treffen? 

Er wird schlicht ignoriert. 

Warum können Gruppenfunktionen nicht in der WHERE - Klausel auftreten ? 
Wo darf man Sie benutzen? 

Weil Sie sich auf eine Spalte beziehen , während die WHERE Klausel sich immer nur auf einen Wert einer Spalte bezieht. 

Gruppenfunktionen verwendet man in der SELECT oder HAVING Klausel 

Was tut : 

SELECT SUM( DISTINCT Gehalt) FROM Angestellte;

Zeig die Summe aller Gehälter , wobei Gehälter die doppelt vorkommen ignoriert werden. 

Berechnen Sie die Summe über alle Gehälter der Angestellten der gleichen Abteilung!

SELECT Abt_Nr, SUM(Gehalt) FROM Angestellte GROUP BY Abt_Nr; 

GROUP BY - Fasst alle werte mit der gleichen Abt_NR zusammen , 
SUM - Wertet für diese Gruppen die Summe der Gehälter aus 

Berechnen Sie die Summe über alle Gehälter derjenigen Abteilungen, die mindestens sechs Angestellte haben!

SELECT Abt_Nr, SUM(Gehalt ) AS SUMME FROM Angestellte GROUP BY Abt_Nr HAVING COUNT(*) > 5;

Welche Abteilungen haben mehr als 4 angestellte? 
Tabelle : angestellte 
Spalten : abt_nr , ang_nr 

SELECT abt_nr , COUNT(ang_nr)
FROM angestellte 
GROUP BY abt_nr
HAVING COUNT (ang_nr)  > 4 ;  

Erläuterung :

select wählt abteilungen und zählt angestellte 
Group by fasst Gruppen mit gleicher Abteilungsnr zusammen 
having schränkt die Ausgabe nochmal auf eine Suchbedingung ein 

Finde den Fehler : 

SELECT Abt_Nr, Nachname, AVG(Gehalt )
FROM angestellte
GROUP BY Abt_Nr;

Anmerkung : keine groß.kleinschreibung beachten . 

Fehler : die Spalte "Nachname" ist weder mit einer Gruppenfunktion versehen (z.B AVG ) , noch ist sie Teil der "GROUP BY" ===> Nicht erlaubt, Syntaxfehler 

Welche Klauseln kennt SELECT ? 
In welcher Reihenfolge werden sie abgearbeitet? 

SELECT - Projektion der Spalten (6)
FROM - Auswahl der Tabelle , kart. Produkt (1)
WHERE - Selektionsbedingung für Spaltenwerte (2)
GROUP BY - Gruppierung (3)
HAVING - Bedingung für Gruppen (4)
ORDER BY - Sortierung (aufsteigend , absteigend) (5)
 

In welchen Klauseln sind sog. Unterabfragen (weitere SELECTS) erlaubt? 

Wozu dienen die Keywords ANY und ALL in SQL? 

Man kann damit Bedingungen für Unterabfragen formulieren . 

Beispiel : 
Welcher Angestelle aus Abteilung 3 verdient mehr als alle aus Abteilung 2? 

SELECT * 
FROM angestellte 
WHERE abt_nr= 3 AND  gehalt > ALL (
       SELECT gehalt 
       FROM angestellte 
       WHERE abt_nr=2
)

Erläuterung : ALL : Bedingung für ALLE Datensätze der Unterabfrage 
                        ANY : Beidngung für mind. 1 Datensatz der Unterabfrage 

Gebe alle "Lieferanten" (Tabellenname) mit ihren Telefonnummern aus.  Wenn eine Telefonnummer vorhanden ist soll "'ohne nummer" angezeigt werden.

SELECT name , NVL(telefonnummer, "ohne nummer")
FROM lieferanten ;

Erkläre folgenden Ausdruck :
SELECT DISTINCT COUNT(gehalt)
FROM angestellte;

Count zählt die Einträge in der Spalte gehalt.
Distinct bezieht nur unterschiedliche Werte in die Berechnung ein .
=> Anzahl an unterschiedlichen Gehältern in der angestellten Tabelle.

Ermittle das durschschnittliche, maximale und minimale sowie die Summe aller Gehälter der angestellten Tabelle.

SELECT AVG(gehalt) , MIN(gehalt), MAX(gehalt) , SUM(gehalt)
FROM angestellte;

Was ist die Semantik der GROUP-BY Klausel ?
Nenne ein Beispiel um die Syntax zu verdeutlichen.

Mit der GROUP-BY Klausel werden Tupel nach der Auswertung der WHERE Klausel in Gruppen zusammengefasst, die in einer Spalte die gleichen Werte haben .

Beispiel :
Zeige das durchschnittliche Gehalt der Angestellten gruppiert nach Abteilung .

SELECT abteilung ,AVG(gehalt)
FROM angestellte
GROUP BY abteilung ;

Wähle alle Kunden aus der Kunden Tabelle die nicht in der Tabelle Angestellte vorkommen.

SELECT *
FROM kunden
WHERE kunden_nr NOT IN (
     SELECT kunden_nr
     FROM angestellte
);

Worin liegt der Unterschied zwischen IN und EXISTS ?

IN vergleicht einen Wert mit einer Liste von Werten .
z.B

SELECT produkt_NR
FROM produkt
WHERE produkt_NR IN (
   3,4,5,6
);

IN kann auch mit einer Unterabfrage genutzt werden :
SELECT produkt_NR
FROM produkt
WHERE produkt_NR IN (
      SELECT produkt_NR
      FROM auftraege ;
);
=> Zeige alle Produkte, die auch in der aufträge Tabelle stehen.

EXISTS liefert einen boolean , sagt also nur aus OB es ein matching gibt .

SELECT produkt_NR
FROM produkt
WHERE produkt_NR EXISTS (
      SELECT produkt_NR
      FROM auftraege ;
);

 

Der EXISTS- Operator implementiert den "gibt es ein" oder "existiert" Quantor in SQL .
Wie ist im Gegensatz dazu der "ALLE" QUantor in SQL umgesetzt?

Beispiel : Welche Lieferanten können alle Materialen liefern?

Der "für alle" QUantor ist nicht direkt imeplementiert. Er muss über ein doppeltes NOT EXISTS simuliert werden und beantwortet quasi die doppelte Verneinung : Welche Lieferanten können KEIN material NICHT liefern ?

 

Wie kann man die Frage "Welcher Lieferant liefert alle Materialien" ohne die umständliche Doppelte NOT EXISTS variante lösen ?

Mittels COUNT .
Zähle Anzahl unterschiedlicher Materialien ,
Zähle wieviele Materialien ein Lieferant liefert ,
Wenn diese Anzahl gleich ist kann man logisch schließen , dass dieser Lieferant alle Materialien liefert.

Für welche Artikel liegt mindestens ein Auftrag vor?

Lösung mittels EXISTS  ,
andere mögliche Lösung mittels Unterabfrage in der FROM Klausel.

SELECT *
FROM artikel a
WHERE EXISTS (
    SELECT *
    FROM auftraege p 
    WHERE p.artikelNR=a.artikelNR;
)

SELECT a.name , a.artikel_NR
FROM artikel a , (SELECT * FROM auftrage ) p
WHERE a.artikel_NR = p.artikel_NR ;

Zeige alle nachnamen von angestellten  , die auch Kunden sind!

SELECT nachname FROM angestellte
INTERSECT
SELECT nachname FROM kunden ;

Zeige alle nachnamen von Kunden , die keine angestellten sind!

SELECT nachname FROM kunden
MINUS
SELECT nachname FROM angestellte ;
 

zeige alle nachnamen von kunden und angestellten .

SELECT nachname FROM kunden
UNION
SELECT nachname FROM angestellte ;

Welche der folgenden Maßnahmen gehören zum SQL Tuning?

Welche Anfrage ist schneller ?

SELECT *
FROM angestellte a
WHERE EXISTS (
     SELECT kunden_id
     FROM kunden k
     WHERE k.kunden_id = a.angestellte.id
);

oder 

SELECT *
FROM angestelle a , kunden k
WHERE a.id = k.id ;

Die zweite Anfrage ist schneller, da Tabellen Joins sehr schnell sind . Unterabfragen und Tabellenverknüpfungen sind dagegen eher langsam.

Was ist der sog. Query Optimizer und was tut er? 

Was Query Optimizer ist Teil von Datenbanksystemen . 
Da SQL nur deklarativ ist (also beschreibt WAS passieren soll) kann der Query Optimizer eine Anfrage bezüglich ihrer Auführung optmieren (das WIE ) . 

Welche der folgenden Vorgehensweisen helfen beim Performance Tuning ? 

Welche der folgenden Maßnahmen helfen dem Performance Tuning ? 

Warum sollte man bei Wiederholung einer SELECT Anfrage darauf achten ,dass die Anfrage zu 100% (groß ;- Kleinschreibung , Leerzeichen Setzung usw.. ) gleich geschrieben ist ? 

Weil SELECT-Anfragen und ihre Ergebnisse ggf. im Hauptspeicher zwischengespeichert sind! 
Wenn man jedoch z.B ein Leerzeichen anders setzt, so wird die Anfrage erneut ausgeführt. 

Welche der folgenden Zugriffsmethoden kennt Oracle ? 

Étudier