DB
Datenbanken
Datenbanken
-
- 1 / 152
-
Lernkarten
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 ?