DevGym_02_Database_Next_Level Flashcards
Was ist Null?
Null ist weder gleich noch ungleich einer Sache. Es ist unbekannt.
Wie kann ich die NULL Zeilen herausfinden?
Mit is null
select * from toys where Bla is null;
Wie muss ich diese Abfrage anpassen, damit auch die NULL Zeilen gefunden werden?
select * from toys where volume_of_wood < 15;
select *
from toys
where volume_of_wood < 15 or volume_of_wood is null;
Mit welchen Funktionen kann ORACLE bei der Behandlung von Nulls helfen?
-
NVL
- Diese Funktion benötigt zwei Argumente. Wenn das erste null ist, wird das zweite zurückgegeben:
-
COALESCE
- This is like NVL. But it can take any number of arguments. It returns the first non-null value it finds.
- SELECT COALESCE(NULL,’A’,’B’) result FROM dual;
- Result: A
Was sind “magic values”?
Null verkompliziert Ihre Where-Klausel. Daher sind manche Leute geneigt, “ magic values” anstelle von null für fehlende oder nicht zutreffende Informationen zu verwenden.
Herr Pinguin ist zum Beispiel aus Plüsch gemacht, nicht aus Holz! Um also zu zeigen, dass volume_of_wood nicht zutrifft, könnten Sie diesen Wert auf den “unmöglichen” Wert von minus eins setzen.
update toys set volume_of_wood = -1wherevolume_of_woodisnull;
Auf den ersten Blick scheint dies Ihren Code zu vereinfachen. Aber es bringt Komplikationen an anderer Stelle. Denn dadurch funktioniert z.B. die Summenbildung nicht mehr korrekt, da die NULL-Werte mit den Minuswerten das Ergebnis verzerren.
Welche der folgenden Gründe sprechen für die Verwendung von “magischen Werten” (wie -1) anstelle von Null für fehlende oder nicht zutreffende Informationen?
Sie ermöglichen Ihnen die Verwendung von standardmäßiger Zwei-Werte-Logik in Ihrer Where-Klausel
Ja.
Wenn eine Spalte Nullwerte enthalten kann, müssen Sie “ is null”-Bedingungen einfügen oder Funktionen wie NVL oder coalesce verwenden, um korrekte Ergebnisse zu gewährleisten. Wenn Sie magische Werte verwenden, können Sie Standard-Vergleichsbedingungen (=, , between, etc.) benutzen, um die korrekte Antwort zu erhalten.
Korreliert vs. Unkorreliert
Wie verhält sich das bei IN und EXISTS?
Eine Unterabfrage ist korreliert, wenn sie mit einer Tabelle der übergeordneten Abfrage verknüpft ist. Ist dies nicht der Fall, ist sie unkorreliert.
Dies führt zu einem Unterschied zwischen IN und EXISTS. EXISTS gibt Zeilen aus der übergeordneten Abfrage zurück, sofern die Unterabfrage mindestens eine Zeile findet. Das folgende unkorrelierte EXISTS gibt also alle Zeilen in colours zurück:
- select * from colours*
- where exists (*
- select null from bricks);*
Hinweis: Bei der Verwendung von EXISTS spielt es keine Rolle, was Sie in der Unterabfrage auswählen, da nur geprüft wird, ob eine Zeile vorhanden ist, die mit der Where-Klausel übereinstimmt (falls es eine gibt). Sie können “select null” oder “select 1” oder eine aktuelle Spalte auswählen.
Dies liegt daran, dass die Abfrage bedeutet: Gib alle Farben zurück, wenn es mindestens eine Zeile in Bricks gibt.
Um alle Farbzeilen zu finden, die mindestens eine Zeile in Bricks der gleichen Farbe haben, müssen Sie in der Subquery verknüpfen. Normalerweise müssen Sie EXISTS-Unterabfragen mit einer Tabelle in der übergeordneten Tabelle korrelieren.
Was ist die EXISTS-Klausel?
- Die SQL EXISTS-Klausel wird in Kombination mit einer Unterabfrage verwendet und gilt als erfüllt, wenn die Unterabfrage mindestens eine Zeile zurückgibt.
- Eine EXISTS-Bedingung testet auf das Vorhandensein von Zeilen in einer Unterabfrage.
- Sie kann in einer SELECT-, INSERT-, UPDATE- oder DELETE-Anweisung verwendet werden.
- WHERE EXISTS ( subquery );
Worauf muss ich bei NOT IN achten?
Sie können die Umkehrung von IN & EXISTS durchführen, indem Sie ihnen NOT voranstellen. Dadurch erhalten Sie alle Zeilen aus der übergeordneten Abfrage, die keine Übereinstimmung in der Unterabfrage haben.
Damit die NOT IN-Bedingung wahr ist, muss der Vergleich aller Elemente mit der übergeordneten Tabelle false ergeben.
Aber denken Sie daran, dass ein Vergleich mit NULL ein unbekanntes Ergebnis liefert! Der gesamte Ausdruck ist also unbekannt und Sie erhalten keine Daten.
Um dieses Problem zu lösen, verwenden Sie entweder NOT EXISTS oder fügen Sie eine Where-Klausel hinzu, damit die Unterabfrage keine Nullwerte zurückgibt:
select * from farben c
where c.colour_name not in (
select b.color from ziegelsteine b
where b.Farbe is not null
);
Was sind CTE?
Mit Common Table Expressions (CTEs) können Sie Unterabfragen mit einem Namen versehen. Auf diese können Sie dann wie auf normale Tabellen an anderer Stelle in Ihrer Abfrage verweisen. Dadurch wird Ihre SQL-Abfrage später einfacher zu schreiben und zu verstehen.
CTEs stehen in der with-Klausel über der select-Anweisung. Im Folgenden wird eine CTE definiert, die zählt, wie viele Zeilen jeder Farbe sich in der Bricks-Tabelle befinden:
with brick_colour_counts as
( select colour, count(*) from bricks group by colour )
select *
from brick_colour_counts ;
Oracle Database unterstützt viele verschiedene Arten von Subqueries. Dazu gehören:
- Inline views
- Nested views
- Subquery factoring aka common table expressions or the with clause.
- Scalar subqueries
Was ist eine Inline-View?
Eine Inline-View wird in die from-Klausel Ihrer Anweisung eingefügt. Sie ersetzt eine reguläre Datenbanktabelle. Der fettgedruckte Abschnitt unten ist zum Beispiel eine Inline-View:
select * from (
select * from subquery
) inline_view
Nested Queries (verschachtelte Unterabfrage)
Eine verschachtelte Unterabfrage wird in die Where-Klausel einer Anweisung eingefügt. Damit können Sie Zeilen auf der Grundlage der Ausgabe einer anderen Abfrage filtern.
Sie können dies entweder mit IN oder EXISTS tun. Bei beiden kann die verschachtelte Unterabfrage korreliert oder unkorreliert sein.
IN
Diese vergleicht eine Spalte in der übergeordneten Tabelle mit einem Wert aus der Unterabfrage. Zum Beispiel:
select * from parent_tab pt where pt.col in ( select ins.col from in_subquery ins )
Exists
Dies ist der Fall, wenn die Unterabfrage mindestens eine Zeile zurückgibt. Sie hat die Form:
select * from parent_tab pt where exists ( select null from exists_subquery us )
Uncorrelated Subquery
Eine unkorrelierte Unterabfrage hat keine Verknüpfung mit der übergeordneten Tabelle:
select * from parent_tab pt where pt.col in ( select us.col from uncorrelated_subquery us )
Correlated Subquery
Eine korrelierte Unterabfrage führt eine Verknüpfung mit der übergeordneten Tabelle durch.
select * from parent_tab pt where pt.col in ( select cs.col from correlated_subquery cs where cs.col2 = pt.col2 )
IN und EXISTS, kurze Zusammenfassung, darauf muss ich achten.
Sie können verschachtelte Unterabfragen mit IN oder EXISTS schreiben.
IN vergleicht Werte aus der übergeordneten Abfrage mit denen, die von der Unterabfrage zurückgegeben werden. EXISTS ist wahr, wenn die Unterabfrage mindestens eine Zeile zurückgibt.
Sie können diese mit NOT negieren. Sie müssen jedoch aufpassen, wenn Sie NOT IN verwenden, weil die Unterabfrage Nullwerte zurückgeben kann. Wenn dies der Fall ist, ist der gesamte Ausdruck unbekannt. Die Abfrage schließt also die passenden übergeordneten Zeilen aus.
Wie ich kann mit order by eine bestimmte Reihenfolge gewährleisten?
Es gibt zwei Spielzeuge zum Preis von 9,99 (Miss Snuggles & Blauer Dinosaurier) und zwei zu 29,99 (Känguru & Lila Ninja). Wenn Sie nur nach dem Preis sortieren, kann die Datenbank jedes dieser Produkte in beliebiger Reihenfolge zurückgeben.
Um dies zu vermeiden und eine bestimmte Reihenfolge zu gewährleisten, fügen Sie weitere Spalten zu Ihrer Sortierung nach hinzu. Tun Sie dies, bis jeder Satz von Werten in nur einer Zeile erscheint.
Sie können dies hier tun, indem Sie toy_name hinzufügen:
select toy_name, price from toys order by price, toy_name;