Wie man Verschachtelte SQL-Abfragen verwenden, die einen einzelnen Wert zurückgeben

Die Einführung einer Unterabfrage mit einem der sechs Vergleichsoperatoren (=, lt;>, lt;,le;, >, > =) Ist oft nützlich. In einem solchen Fall wertet auf einen einzigen Wert der SQL-Ausdruck vor dem Operator, und die Unterabfrage die Betreiber nach muss auch auf einen einzelnen Wert zu bewerten. Eine Ausnahme ist der Fall der quantifizierte Vergleichsoperator, das ist ein Vergleichsoperator durch einen Quantor gefolgt (IRGENDEIN, ETWAS, oder ALLE).

Um einen Fall dar, in der eine Unterabfrage einen einzelnen Wert zurückgibt, Blick auf ein anderes Stück von Zetec Corporation Datenbank. Es enthält eine CUSTOMER-Tabelle, die Informationen über die Unternehmen hält, die Zetec Produkte kaufen.

SpalteArtEinschränkungen
CustIDGANZE ZAHLPRIMÄRSCHLÜSSEL
UnternehmenCHAR (40)EINZIGARTIG
CustAddress CHAR (30)
CustCityCHAR (20)
CustStateCHAR (2)
CustZipCHAR (10)
CustPhoneCHAR (12)
ModLevelGANZE ZAHL

Die CONTACT Tabelle enthält persönliche Daten über Personen an jedem Zetec Kundenorganisationen.

SpalteArtEinschränkungen
CustIDGANZE ZAHLPRIMÄRSCHLÜSSEL
ContFNameCHAR (10)
ContLNameCHAR (16)
ContPhoneCHAR (12)
ContInfoCHAR (50)

Sagen Sie, dass Sie bei den Kontaktinformationen für Olympic Verkäufe aussehen wollen, aber man kann mich nicht erinnern, dass Unternehmen CustID. Verwenden Sie eine verschachtelte Abfrage wie diese Informationen, die Sie wiederherstellen möchten:

SELECT * FROM KONTAKTWo CustID = (SELECT CustIDFROM CUSTOMERWHERE Unternehmen = 'Olympic Sales') -

Das Ergebnis sieht wie folgt aus:

CustID ContFName ContLName ContPhone ContInfo ------ --------- --------- --------- -------- 118 Jerry Attwater 505 -876-3456 Wird Rolle inadditivemanufacturing playmajor.

Sie können nun Jerry bei Olympischen anrufen und ihm sagen, über diese besondere Verkaufs Monat auf 3D-Druckern.

Wenn Sie eine Unterabfrage in ein # 147-=# 148- Vergleich, die Unterabfrage des WÄHLEN Liste muss eine einzelne Spalte angeben (CustID in dem Beispiel). Wenn die Unterabfrage ausgeführt wird, muss es eine einzelne Zeile zurück, um einen einzelnen Wert für den Vergleich zu haben.

In diesem Beispiel wird angenommen, dass der CUSTOMER-Tabelle mit einem nur eine Zeile hat Unternehmen Wert von 'Olympic Sales'. Das CREATE TABLE Erklärung für Kunde gibt eine EINZIGARTIG Einschränkung für Unternehmen, und diese Aussage wird sichergestellt, dass die Unterabfrage im vorangegangenen Beispiel einen einzelnen Wert zurückgibt (oder kein Wert).

Unterabfragen, wie die in diesem Beispiel werden jedoch häufig auf Säulen verwendet, die nicht angegeben sind, sind EINZIGARTIG. In solchen Fällen müssen Sie auf vorherige Kenntnis der Datenbankinhalte verlassen zu der Annahme besteht, dass die Spalte keine Duplikate hat.

Wenn mehr als ein Kunde hat einen Wert von 'Olympic Sales' in dem Unternehmen Spalte (vielleicht in verschiedenen Bundesstaaten), wirft die Unterabfrage einen Fehler.

Wenn kein Kunde mit einer solchen Firmennamen vorhanden ist, wird die Unterabfrage behandelt, als ob es null war, und der Vergleich wird unbekannt. In diesem Fall ist die WOHER Klausel gibt keine Zeile (weil es nur die Zeilen mit der Bedingung True zurück und filtert Zeilen mit der Bedingung falsch oder unbekannt). Dies würde wahrscheinlich passieren, zum Beispiel, wenn jemand falsch geschrieben das Unternehmenwie 'Olumpic Sales'.

Obwohl der gleich Operator (=) Ist die häufigste, Sie eines der anderen fünf Vergleichsoperatoren in einer ähnlichen Struktur verwenden können. Für jede Zeile in der Tabelle in der umschließenden Anweisung des angegebenen VON Klausel, die einzelnen Wert von der Unterabfrage zurückgegeben wird mit dem Ausdruck in der einschließenden Erklärung des im Vergleich WOHER Klausel. Wenn der Vergleich einen Wert True gibt, wird eine Zeile in die Ergebnistabelle hinzugefügt.

Sie können garantieren, dass eine Unterabfrage einen einzelnen Wert zurück, wenn Sie eine Aggregatfunktion darin enthalten. Aggregatfunktionen immer geben einen Wert. Natürlich, auf diese Weise einen einzigen Wert der Rücksendung hilfreich ist nur, wenn Sie das Ergebnis einer Aggregatfunktion soll.

Angenommen, Sie sind ein Zetec Verkäufer und Sie brauchen eine große Provision Scheck zu verdienen für einige unerwartete Rechnungen zu bezahlen. Sie entscheiden über den Verkauf Zetec teuerste Produkt zu konzentrieren. Sie können herausfinden, was das Produkt mit einer verschachtelten Abfrage ist:

SELECT Modell, ProdName, ListPriceFROM PRODUCTWHERE Listprice = (SELECT MAX (Listprice) FROM PRODUCT) -

In der vorhergehenden verschachtelte Abfrage, die beide die Unterabfrage und das einschließende Anweisung arbeiten auf der gleichen Tabelle. Die Unterabfrage gibt einen einzelnen Wert: die maximale Listenpreis in der Produkttabelle. Die äußere Abfrage ruft alle Zeilen aus der Tabelle PRODUCT, die diese Listenpreis haben.

Das nächste Beispiel zeigt einen Vergleich Unterabfrage, die einen Vergleichsoperator andere als verwendet =:

SELECT Modell, ProdName, ListPriceFROM PRODUCTWHERE Listprice lt; (SELECT AVG (Listprice) FROM PRODUCT) -

Die Unterabfrage gibt einen einzelnen Wert: die durchschnittliche Listenpreis in der Produkttabelle. Die äußere Abfrage ruft alle Zeilen aus der Tabelle PRODUCT, die einen niedrigeren Listenpreis als der durchschnittliche Listenpreis haben.

In der ursprünglichen SQL-Standard könnte ein Vergleich haben nur eine Unterabfrage, und es hatte sich auf der rechten Seite des Vergleichs zu sein. SQL: 1999 erlaubt eine oder beide Operanden des Vergleichsunterabfragen zu sein, und späteren Versionen von SQL behalten, dass die Erweiterung der Fähigkeit.

Menü