Freigeben über


SELECT (SQL-Befehl)

Ruft Daten aus einer oder mehreren Tabellen ab.

Der Visual FoxPro ODBC-Treiber unterstützt die native Visual FoxPro-Sprachsyntax für diesen Befehl. Treiberspezifische Informationen finden Sie in den Treiberhinweisen.

Syntax

  
SELECT [ALL | DISTINCT]  
   [Alias.] Select_Item [AS Column_Name]  
   [, [Alias.] Select_Item [AS Column_Name] ...]   
FROM [DatabaseName!]Table [Local_Alias]  
   [, [DatabaseName!]Table [Local_Alias] ...]   
[WHERE JoinCondition [AND JoinCondition  
...]  
   [AND | OR FilterCondition [AND | OR FilterCondition ...]]]  
[GROUP BY GroupColumn [, GroupColumn ...]]  
[HAVING FilterCondition]  
[UNION [ALL] SELECTCommand]  
[ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]  

Argumente

Hinweis

Eine Unterabfrage, auf die in den folgenden Argumenten verwiesen wird, ist eine SELECT innerhalb einer SELECT und muss in Klammern eingeschlossen werden. Sie können bis zu zwei Unterabfragen auf derselben Ebene (nicht geschachtelt) in der WHERE-Klausel haben. (Siehe diesen Abschnitt der Argumente.) Unterabfragen können mehrere Verknüpfungsbedingungen enthalten.

[ALLE | DISTINCT] [Alias.] Select_Item [AS Column_Name] [; [Alias.] Select_Item [AS Column_Name] ...]
Die SELECT-Klausel gibt die Felder, Konstanten und Ausdrücke an, die in den Abfrageergebnissen angezeigt werden.

Standardmäßig werden alle Zeilen in den Abfrageergebnissen angezeigt.

DISTINCT schließt Duplikate aller Zeilen aus den Abfrageergebnissen aus.

Hinweis

Sie können DISTINCT nur einmal pro SELECT-Klausel verwenden.

Alias: qualifiziert übereinstimmende Elementnamen. Jedes Element, das Sie mit Select_Item angeben, generiert eine Spalte der Abfrageergebnisse. Wenn zwei oder mehr Elemente denselben Namen haben, schließen Sie den Tabellenalias und einen Punkt vor dem Elementnamen ein, um zu verhindern, dass Spalten dupliziert werden.

Select_Item gibt ein Element an, das in die Abfrageergebnisse einbezogen werden soll. Ein Element kann eine der folgenden Sein:

  • Der Name eines Felds aus einer Tabelle in der FROM-Klausel.

  • Eine Konstante, die angibt, dass derselbe Konstantenwert in jeder Zeile der Abfrageergebnisse angezeigt werden soll.

  • Ein Ausdruck, der der Name einer benutzerdefinierten Funktion sein kann.

Benutzerdefinierte Funktionen mit SELECT

Obwohl die Verwendung benutzerdefinierter Funktionen in der SELECT-Klausel offensichtliche Vorteile hat, sollten Sie auch die folgenden Einschränkungen berücksichtigen:

  • Die Geschwindigkeit der mit SELECT ausgeführten Vorgänge kann durch die Geschwindigkeit begrenzt werden, mit der solche benutzerdefinierten Funktionen ausgeführt werden. Manipulationen mit hohem Volumen, die benutzerdefinierte Funktionen umfassen, können durch die Verwendung von API und benutzerdefinierten Funktionen, die in C oder Assemblysprache geschrieben wurden, besser erreicht werden.

  • Die einzige zuverlässige Möglichkeit, Werte an benutzerdefinierte Funktionen zu übergeben, die von SELECT aufgerufen werden, ist die Argumentliste, die an die Funktion übergeben wird, wenn sie aufgerufen wird.

  • Selbst wenn Sie experimentieren und eine angeblich verbotene Manipulation entdecken, die in einer bestimmten Version von FoxPro ordnungsgemäß funktioniert, gibt es keine Garantie, dass sie in späteren Versionen weiterhin funktioniert.

Abgesehen von diesen Einschränkungen sind benutzerdefinierte Funktionen in der SELECT-Klausel akzeptabel. Denken Sie jedoch daran, dass die Verwendung von SELECT die Leistung möglicherweise verlangsamt.

Die folgenden Feldfunktionen stehen für die Verwendung mit einem Auswahlelement zur Verfügung, bei dem es sich um ein Feld oder einen Ausdruck mit einem Feld handelt:

  • AVG(Select_Item)-Durchschnittliche Spalte numerischer Daten.

  • COUNT(Select_Item)-Zählt die Anzahl der ausgewählten Elemente in einer Spalte. ANZAHL(*) zählt die Anzahl der Zeilen in der Abfrageausgabe.

  • MIN(Select_Item)-Bestimmt den kleinsten Wert von Select_Item in einer Spalte.

  • MAX(Select_Item)-Bestimmt den größten Wert von Select_Item in einer Spalte.

  • SUMME(Select_Item)-Summen eine Spalte numerischer Daten.

Feldfunktionen können nicht geschachtelt werden.

AS Column_Name
Gibt die Überschrift für eine Spalte in der Abfrageausgabe an. Dies ist nützlich, wenn Select_Item ein Ausdruck ist oder eine Feldfunktion enthält und Sie der Spalte einen aussagekräftigen Namen geben möchten. Column_Name kann ein Ausdruck sein, darf jedoch keine Zeichen (z. B. Leerzeichen) enthalten, die in Tabellenfeldnamen nicht zulässig sind.

FROM [DatabaseName!]Tabelle [Local_Alias] [; [Datenbankname!]Tabelle [Local_Alias] ...]
Listet die Tabellen auf, die die Von der Abfrage abgerufenen Daten enthalten. Wenn keine Tabelle geöffnet ist, zeigt Visual FoxPro das Dialogfeld "Öffnen " an, sodass Sie den Dateispeicherort angeben können. Nachdem sie geöffnet wurde, bleibt die Tabelle geöffnet, nachdem die Abfrage abgeschlossen ist.

DatabaseName! Gibt den Namen einer anderen Datenbank als der mit der Datenquelle angegebenen an. Sie müssen den Namen der Datenbank angeben, die die Tabelle enthält, wenn die Datenbank nicht mit der Datenquelle angegeben ist. Schließen Sie das Ausrufezeichen (!) nach dem Datenbanknamen und vor dem Tabellennamen ein.

Local_Alias gibt einen temporären Namen für die In Tabelle benannte Tabelle an. Wenn Sie einen lokalen Alias angeben, müssen Sie den lokalen Alias anstelle des Tabellennamens in der gesamten SELECT-Anweisung verwenden. Der lokale Alias wirkt sich nicht auf die Visual FoxPro-Umgebung aus.

WHERE JoinCondition [AND JoinCondition ...] [AND | OR FilterCondition [AND | OR FilterCondition ...]]
Weist Visual FoxPro an, nur bestimmte Datensätze in die Abfrageergebnisse einzuschließen. WHERE ist erforderlich, um Daten aus mehreren Tabellen abzurufen.

JoinCondition gibt Felder an, die die Tabellen in der FROM-Klausel verknüpfen. Wenn Sie mehr als eine Tabelle in eine Abfrage einschließen, sollten Sie eine Verknüpfungsbedingung für jede Tabelle nach dem ersten angeben.

Wichtig

Berücksichtigen Sie beim Erstellen von Verknüpfungsbedingungen die folgenden Informationen:

  • Wenn Sie zwei Tabellen in eine Abfrage einschließen und keine Verknüpfungsbedingung angeben, wird jeder Datensatz in der ersten Tabelle mit jedem Datensatz in der zweiten Tabelle verknüpft, solange die Filterbedingungen erfüllt sind. Eine solche Abfrage kann langwierige Ergebnisse erzeugen.

  • Gehen Sie beim Verknüpfen von Tabellen mit leeren Feldern vorsichtig vor, da Visual FoxPro mit leeren Feldern übereinstimmt. Wenn Sie beispielsweise an CUSTOMER.ZIP und INVOICE.ZIP teilnehmen und KUNDEN 100 leere Postleitzahlen und INVOICE 400 leere Postleitzahlen enthält, enthält die Abfrageausgabe 40.000 zusätzliche Datensätze, die aus den leeren Feldern resultieren. Verwenden Sie die FUNKTION EMPTY( ), um leere Datensätze aus der Abfrageausgabe zu entfernen.

  • Sie müssen den AND-Operator verwenden, um mehrere Verknüpfungsbedingungen zu verbinden. Jede Verknüpfungsbedingung weist das folgende Formular auf:

    FieldName1 Comparison FieldName2

    "FieldName1 " ist der Name eines Felds aus einer Tabelle, "FieldName2 " ist der Name eines Felds aus einer anderen Tabelle, und "Comparison " ist einer der operatoren, die in der folgenden Tabelle beschrieben sind.

Bediener Vergleich
= Gleich
== Genau gleich
Gefällt mir SQL LIKE
<>, !=, # Ungleich
> Mehr als
>= Mehr als oder gleich
< Kleiner als
<= Kleiner als oder gleich

Wenn Sie den Operator = mit Zeichenfolgen verwenden, verhält es sich je nach Einstellung von SET ANSI anders. Wenn SET ANSI auf OFF festgelegt ist, behandelt Visual FoxPro Zeichenfolgenvergleiche auf eine Weise, die Xbase-Benutzern vertraut ist. Wenn SET ANSI auf ON festgelegt ist, folgt Visual FoxPro ANSI-Standards für Zeichenfolgenvergleiche. Weitere Informationen dazu, wie Visual FoxPro Zeichenfolgenvergleiche durchführt, finden Sie unter SET ANSI und SET EXACT .

FilterCondition gibt die Kriterien an, die Datensätze erfüllen müssen, um in die Abfrageergebnisse aufgenommen zu werden. Sie können beliebig viele Filterbedingungen in eine Abfrage einschließen und diese mit dem AND- oder OR-Operator verbinden. Sie können auch den Operator NOT verwenden, um den Wert eines logischen Ausdrucks umzukehren, oder Sie können EMPTY( ) verwenden, um nach einem leeren Feld zu suchen. FilterCondition kann alle Formulare in den folgenden Beispielen annehmen:

Beispiel 1FieldName1 Comparison FieldName2

customer.cust_id = orders.cust_id

Beispiel 2Feldname-Vergleichsausdruck

payments.amount >= 1000

Beispiel 3FieldName Comparison ALL (Subquery)

company < ALL ;

(SELECT company FROM customer WHERE country = "USA")

Wenn die Filterbedingung ALLE enthält, muss das Feld die Vergleichsbedingung für alle Werte erfüllen, die von der Unterabfrage generiert werden, bevor der Datensatz in die Abfrageergebnisse einbezogen wird.

Beispiel 4FieldName Comparison ANY | SOME (Unterabfrage)

company < ANY ;

(SELECT company FROM customer WHERE country = "USA")

Wenn die Filterbedingung ANY oder SOME enthält, muss das Feld die Vergleichsbedingung für mindestens einen der von der Unterabfrage generierten Werte erfüllen.

Im folgenden Beispiel wird überprüft, ob sich die Werte im Feld innerhalb eines angegebenen Wertebereichs befinden:

Beispiel 5FieldName [NOT] BETWEEN Start_Range AND End_Range

customer.postalcode BETWEEN 90000 AND 99999

Im folgenden Beispiel wird überprüft, ob mindestens eine Zeile die Kriterien in der Unterabfrage erfüllt. Wenn die Filterbedingung EXISTS enthält, wird die Filterbedingung auf True (.T.) ausgewertet, es sei denn, die Unterabfrage wird für den leeren Satz ausgewertet.

Beispiel 6 [NOT] EXISTS (Unterabfrage)

EXISTS ;

(SELECT * FROM orders WHERE customer.postalcode =

orders.postalcode)

Beispiel 7FieldName [NOT] IN Value_Set

customer.postalcode NOT IN ("98052","98072","98034")

Wenn die Filterbedingung IN enthält, muss das Feld einen der Werte enthalten, bevor der Datensatz in die Abfrageergebnisse einbezogen wird.

Beispiel 8FieldName [NOT] IN (Unterabfrage)

customer.cust_id IN ;

(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")

Hier muss das Feld einen der Werte enthalten, die von der Unterabfrage zurückgegeben werden, bevor der Datensatz in die Abfrageergebnisse einbezogen wird.

Beispiel 9FieldName [NOT] LIKE cExpression

customer.country NOT LIKE "USA"

Diese Filterbedingung sucht nach jedem Feld, das cExpression entspricht. Sie können das Prozentzeichen (%) und unterstriche ( _ ) Wildcardzeichen als Teil von cExpression verwenden. Der Unterstrich stellt ein einzelnes unbekanntes Zeichen in der Zeichenfolge dar.

GROUP BY GroupColumn [, GroupColumn ...]
Gruppiert Zeilen in der Abfrage basierend auf Werten in einer oder mehreren Spalten. GroupColumn kann eine der folgenden Sein:

  • Der Name eines regulären Tabellenfelds.

  • Ein Feld, das eine SQL-Feldfunktion enthält.

  • Ein numerischer Ausdruck, der die Position der Spalte in der Ergebnistabelle angibt. (Die ganz links stehende Spaltennummer ist 1.)

HAVING FilterCondition
Gibt eine Filterbedingung an, die Gruppen erfüllen müssen, damit sie in die Abfrageergebnisse einbezogen werden. HAVING sollte mit GROUP BY verwendet werden und kann beliebig viele Filterbedingungen enthalten, verbunden vom AND- oder OR-Operator. Sie können auch NOT verwenden, um den Wert eines logischen Ausdrucks umzukehren.

FilterCondition kann keine Unterabfrage enthalten.

Eine HAVING-Klausel ohne GROUP BY-Klausel verhält sich wie eine WHERE-Klausel. Sie können lokale Aliase und Feldfunktionen in der HAVING-Klausel verwenden. Verwenden Sie eine WHERE-Klausel für eine schnellere Leistung, wenn Ihre HAVING-Klausel keine Feldfunktionen enthält.

[UNION [ALLE] SELECTCommand]
Kombiniert die endgültigen Ergebnisse einer SELECT mit den Endergebnissen einer anderen SELECT. Standardmäßig überprüft UNION die kombinierten Ergebnisse und beseitigt doppelte Zeilen. Verwenden Sie Klammern, um mehrere UNION-Klauseln zu kombinieren.

ALL verhindert, dass UNION doppelte Zeilen aus den kombinierten Ergebnissen entfernt.

UNION-Klauseln folgen den folgenden Regeln:

  • Sie können UNION nicht verwenden, um Unterabfragen zu kombinieren.

  • Beide SELECT-Befehle müssen dieselbe Anzahl von Spalten in der Abfrageausgabe haben.

  • Jede Spalte in den Abfrageergebnissen einer SELECT muss denselben Datentyp und dieselbe Breite aufweisen wie die entsprechende Spalte in der anderen SELECT.

  • Nur die endgültige SELECT kann über eine ORDER BY-Klausel verfügen, die auf Ausgabespalten nach Zahl verweisen muss. Wenn eine ORDER BY-Klausel enthalten ist, wirkt sie sich auf das vollständige Ergebnis aus.

Sie können auch die UNION-Klausel verwenden, um eine äußere Verknüpfung zu simulieren.

Wenn Sie zwei Tabellen in einer Abfrage verknüpfen, werden nur Datensätze mit übereinstimmenden Werten in den Verknüpften Feldern in die Ausgabe einbezogen. Wenn ein Datensatz in der übergeordneten Tabelle keinen entsprechenden Datensatz in der untergeordneten Tabelle enthält, ist der Datensatz in der übergeordneten Tabelle nicht in der Ausgabe enthalten. Mit einer äußeren Verknüpfung können Sie alle Datensätze in der übergeordneten Tabelle in die Ausgabe aufnehmen, zusammen mit den übereinstimmenden Datensätzen in der untergeordneten Tabelle. Zum Erstellen einer äußeren Verknüpfung in Visual FoxPro müssen Sie wie im folgenden Beispiel einen geschachtelten SELECT-Befehl verwenden:

SELECT customer.company, orders.order_id, orders.emp_id ;  
FROM customer, orders ;  
WHERE customer.cust_id = orders.cust_id ;  
UNION ;  
SELECT customer.company, 0, 0 ;  
FROM customer ;  
WHERE customer.cust_id NOT IN ;  
(SELECT orders.cust_id FROM orders)  

Hinweis

Stellen Sie sicher, dass Sie das Leerzeichen einschließen, das unmittelbar vor jedem Semikolon steht. Andernfalls erhalten Sie einen Fehler.

Der Abschnitt des Befehls vor der UNION-Klausel wählt Datensätze aus beiden Tabellen mit übereinstimmenden Werten aus. Die Kundenunternehmen, die keine zugehörigen Rechnungen haben, sind nicht enthalten. Der Abschnitt des Befehls, nachdem die UNION-Klausel Datensätze in der Kundentabelle auswählt, die keine übereinstimmenden Datensätze in der Auftragstabelle enthalten.

Beachten Sie in Bezug auf den zweiten Abschnitt des Befehls Folgendes:

  • Die SELECT-Anweisung innerhalb der Klammern wird zuerst verarbeitet. Diese Anweisung erstellt eine Auswahl aller Kundennummern in der Tabelle "Bestellungen".

  • Die WHERE-Klausel findet alle Kundennummern in der Kundentabelle, die sich nicht in der Tabelle "Bestellungen" befinden. Da der erste Abschnitt des Befehls alle Unternehmen bereitgestellt hat, die eine Kundennummer in der Auftragstabelle hatten, werden alle Unternehmen in der Kundentabelle jetzt in die Abfrageergebnisse einbezogen.

  • Da die In einer UNION enthaltenen Tabellenstrukturen identisch sein müssen, gibt es in der zweiten SELECT-Anweisung zwei Platzhalter, die orders.order_id und orders.emp_id aus der ersten SELECT-Anweisung darstellen.

    Hinweis

    Die Platzhalter müssen denselben Typ aufweisen wie die Felder, die sie darstellen. Wenn das Feld ein Datumstyp ist, sollte der Platzhalter { / / } sein. Wenn das Feld ein Zeichenfeld ist, sollte der Platzhalter die leere Zeichenfolge ("") sein.

ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...] ...]
Sortiert die Abfrageergebnisse basierend auf den Daten in einer oder mehreren Spalten. Jede Order_Item muss einer Spalte in den Abfrageergebnissen entsprechen und kann eine der folgenden Sein:

  • Ein Feld in einer FROM-Tabelle, das auch ein Auswahlelement in der SELECT-Hauptklausel ist (nicht in einer Unterabfrage).

  • Ein numerischer Ausdruck, der die Position der Spalte in der Ergebnistabelle angibt. (Die spalte ganz links ist Zahl 1.)

ASC gibt eine aufsteigende Reihenfolge für Abfrageergebnisse gemäß dem Bestellelement oder den Elementen an und ist die Standardeinstellung für ORDER BY.

DESC gibt eine absteigende Reihenfolge für Abfrageergebnisse an.

Abfrageergebnisse werden ungeordnet angezeigt, wenn Sie keine Bestellung mit ORDER BY angeben.

Hinweise

SELECT ist ein SQL-Befehl, der wie jeder andere Visual FoxPro-Befehl in Visual FoxPro integriert ist. Wenn Sie SELECT zum Darstellen einer Abfrage verwenden, interpretiert Visual FoxPro die Abfrage und ruft die angegebenen Daten aus den Tabellen ab. Sie können eine SELECT-Abfrage entweder im Eingabeaufforderungsfenster oder in einem Visual FoxPro-Programm (wie bei jedem anderen Visual FoxPro-Befehl) erstellen.

Hinweis

SELECT berücksichtigt nicht die aktuelle Filterbedingung, die mit SET FILTER angegeben ist.

Hinweise zu Treibern

Wenn Ihre Anwendung die ODBC SQL-Anweisung SELECT an die Datenquelle sendet, konvertiert der Visual FoxPro ODBC-Treiber den Befehl ohne Übersetzung in den Visual FoxPro SELECT-Befehl, es sei denn, der Befehl enthält eine ODBC-Escapesequenz. In eine ODBC-Escapesequenz eingeschlossene Elemente werden in die Visual FoxPro-Syntax konvertiert. Weitere Informationen zur Verwendung von ODBC-Escapesequenzen finden Sie unter "Zeit- und Datumsfunktionen " und in der Microsoft ODBC-Programmierreferenz unter Escapesequenzen in ODBC.

Weitere Informationen

CREATE TABLE - SQL
INSERT - SQL
SET ANSI
GENAU FESTLEGEN