SELECT - SQL-Befehl
Ruft Daten aus einer oder mehreren Tabellen ab.
SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]] [Alias.] Select_Item
[[AS] Column_Name] [, [Alias.] Select_Item [[AS] Column_Name] ...]
FROM [FORCE][DatabaseName!]Table [[AS] Local_Alias]
[[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN
DatabaseName!] Table [[AS] Local_Alias] [ON JoinCondition …]
[[INTO Destination] | [TO FILE FileName [ADDITIVE] | TO PRINTER
[PROMPT] | TO SCREEN]] [PREFERENCE PreferenceName]
[NOCONSOLE] [PLAIN] [NOWAIT]
[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] ...]]
Parameter
SELECT
Gibt die Felder, Konstanten und Ausdrücke an, die in den Abfrageergebnissen angezeigt werden sollen.ALL
Ist die Standardeinstellung und zeigt alle Zeilen des Abfrageergebnisses an.DISTINCT
Schließt alle Duplikatzeilen aus dem Abfrageergebnis aus.Anmerkung Pro SELECT-Klausel können Sie DISTINCT nur einmal verwenden.
TOP nExpr [PERCENT]
Gibt an, dass das Abfrageergebnis nur eine bestimmte Anzahl oder einen bestimmten Prozentsatz an Zeilen enthält. Sie müssen eine ORDER BY-Klausel angeben, wenn Sie die TOP-Klausel angeben. Die ORDER BY-Klausel gibt die Spalten an, für die die TOP-Klausel die Anzahl der Zeilen festlegt, die in das Abfrageergebnis übernommen werden.Sie können zwischen 1 und 32.767 Zeilen angeben. Zeilen, die in den Spalten, die in der ORDER BY-Klausel angegeben sind, identische Werte enthalten, werden in das Abfrageergebnis übernommen. Daher kann das Abfrageergebnis, wenn Sie nExpr z. B. auf 10 eingestellt haben, mehr als 10 Zeilen umfassen, wenn es mehr als 10 Zeilen gibt, die in den in der ORDER BY-Klausel angegebenen Spalten identische Werte enthalten.
Wird das PERCENT-Schlüsselwort mit aufgenommen, dann wird die zurückgegebene Anzahl Zeilen auf die nächsthöhere Ganzzahl aufgerundet. Ist das PERCENT-Schlüsselwort mit aufgenommen, dann sind die zulässigen Werte für nExpr gleich 0,01 bis 99,99.
Alias.
Kennzeichnet den entsprechenden Elementnamen. Für jedes in Select_Item angegebene Element wird eine Spalte des Abfrageergebnisses erstellt. Haben mehrere Elemente denselben Namen, müssen Sie den Alias der jeweiligen Tabelle sowie einen Punkt vor den Namen des Elements setzen, um zu verhindern, dass Spalten dupliziert werden.Select_Item gibt ein Element an, das im Abfrageergebnis enthalten sein soll. Ein Element kann Folgendes sein:
- Der Name eines Feldes einer Tabelle, die in der FROM-Klausel angegeben ist.
- Eine Konstante, die angibt, dass derselbe Konstantenwert in allen Zeilen des Abfrageergebnisses angezeigt werden soll.
- Ein Ausdruck, der der Name einer benutzerdefinierten Funktion sein kann.
AS Column_Name
Gibt die Überschrift an, die die jeweilige Spalte in der für die Abfrage erstellten Ausgabe haben soll. Diese Option bietet sich immer dann an, wenn Select_Item ein Ausdruck ist oder eine Feldfunktion enthält und Sie der Spalte einen aussagefähigen Namen geben möchten. Column_Name kann ein Ausdruck sein, darf aber keine Zeichen (z. B. Leerzeichen) enthalten, die in Tabellenfeldnamen nicht zulässig sind.FROM
Listet die Tabellen auf, die die von der Abfrage abzurufenden Daten enthalten. Ist keine Tabelle geöffnet, zeigt Visual FoxPro das Dialogfeld Öffnen an, so dass Sie angeben können, wo sich die Datei befindet. Sobald die Tabelle geöffnet ist, bleibt sie auch nach Beendigung der Abfrage geöffnet.FORCE legt fest, dass die Tabellen in der Reihenfolge verknüpft werden, in der sie in der FROM-Klausel angegeben sind. Wenn FORCE nicht angegeben ist, versucht Visual FoxPro, die Abfrage zu optimieren. Es kann jedoch sein, dass die Abfrage schneller ausgeführt wird, wenn die Visual FoxPro-Abfrageoptimierung durch Angabe des Schlüsselwortes FORCE deaktiviert wird.
DatabaseName!
Gibt den Namen einer nicht aktuellen Datenbank an, die die Tabelle enthält. Wenn die Datenbank, zu der die Tabelle gehört, nicht die aktuelle Datenbank ist, müssen Sie deren Namen angeben. Fügen Sie ein Ausrufezeichen (!) als Trennzeichen zwischen dem Datenbank- und dem Tabellennamen ein.[AS] Local_Alias
Legt einen temporären Namen für die Tabelle fest, die in Table angegeben ist. Wenn Sie einen lokalen Alias angeben, müssen Sie diesen in der gesamten SELECT-Anweisung anstelle des Tabellennamens verwenden.INNER JOIN gibt an, dass das Abfrageergebnis nur die Zeilen einer Tabelle enthält, die einer oder mehreren Zeilen einer anderen Tabelle entsprechen.
LEFT [OUTER] JOIN gibt an, dass das Abfrageergebnis alle Zeilen der Tabelle enthält, die links vom Schlüsselwort JOIN angegeben ist, und nur passende Zeilen der Tabelle, die rechts vom Schlüsselwort JOIN angegeben ist. Das Schlüsselwort OUTER ist optional; es kann angegeben werden, um zu verdeutlichen, dass eine äußere Verknüpfung erstellt wird.
RIGHT [OUTER] JOIN gibt an, dass das Abfrageergebnis alle Zeilen der Tabelle enthält, die rechts vom Schlüsselwort JOIN angegeben ist, und nur passende Zeilen der Tabelle, die links vom Schlüsselwort JOIN angegeben ist. Das Schlüsselwort OUTER ist optional; es kann angegeben werden, um zu verdeutlichen, dass eine äußere Verknüpfung erstellt wird.
FULL [OUTER] JOIN gibt an, dass das Abfrageergebnis alle passenden und nichtpassenden Zeilen beider Tabellen enthält. Das Schlüsselwort OUTER ist optional; es kann angegeben werden, um zu verdeutlichen, dass eine äußere Verknüpfung erstellt wird.
ON JoinCondition gibt die Bedingungen an, unter denen die Tabellen verknüpft werden.
INTO Destination
Gibt an, wo das Abfrageergebnis gespeichert werden soll. Wenn Sie die Klauseln INTO und TO in derselben Abfrage angeben, wird die TO-Klausel ignoriert. Wenn Sie die INTO-Klausel nicht angeben, wird das Abfrageergebnis in einem Datenblattfenster angezeigt. Mit TO können Sie das Abfrageergebnis auch zum Drucker oder in eine Datei leiten.Destination kann eine der folgenden Klauseln sein:
ARRAY ArrayName: speichert das Abfrageergebnis im Arbeitsspeicher in einem Variablenarray. Das Array wird nicht erstellt, wenn die Abfrage keine Datensätze abruft.
CURSOR CursorName [NOFILTER | READWRITE]: speichert das Abfrageergebnis in einem Cursor. Wenn Sie den Namen einer geöffneten Tabelle angeben, zeigt Visual FoxPro eine Fehlermeldung an. Nachdem SELECT ausgeführt wurde, bleibt der temporäre Cursor geöffnet und ist aktiv sowie schreibgeschützt, falls nicht die Option READWRITE angegeben wurde. Wenn Sie den temporären Cursor geschlossen haben, wird er gelöscht. Cursor können möglicherweise als temporäre Dateien auf dem von SORTWORK angegebenen Laufwerk oder Datenträger vorhanden sein.
Geben Sie NOFILTER an, um einen Cursor zu erstellen, der in späteren Abfragen verwendet werden kann. In früheren Versionen von Visual FoxPro ist es erforderlich, eine zusätzliche Konstante oder einen zusätzlichen Ausdruck als Filter anzugeben, um einen Cursor zu erstellen, der in späteren Abfragen verwendet werden kann. Zum Beispiel wird durch das Hinzufügen eines logischen Wahr eine Abfrage erstellt, die in späteren Abfragen verwendet werden kann:
SELECT *, .T. FROM customers INTO CURSOR myquery
Wenn Sie NOFILTER angeben, kann sich das Antwortverhalten der Abfrage verschlechtern, da eine temporäre Datei auf der Festplatte erstellt wird. Diese temporäre Datei wird von der Festplatte gelöscht, sobald der Cursor geschlossen wurde.
Über die READWRITE-Klausel wird festgelegt, dass der Cursor temporär ist und verändert werden kann.
DBF | TABLE TableName[DATABASE DatabaseName [NAME LongTableName]]: speichert das Abfrageergebnis in einer Tabelle. Wenn Sie eine Tabelle angeben, die bereits geöffnet ist, und wenn SET SAFETY auf OFF gesetzt ist, überschreibt Visual FoxPro die Tabelle, ohne vorher eine Warnmeldung anzuzeigen. Wenn Sie keine Dateinamenerweiterung angeben, gibt Visual FoxPro der Tabelle die Erweiterung DBF. Nach der Ausführung von SELECT bleibt die Tabelle geöffnet und aktiv.
Geben Sie DATABASE DatabaseName an, wenn Sie eine Datenbank angeben möchten, zu der die Tabelle hinzugefügt werden soll. Fügen Sie NAME LongTableName ein, um für die Tabelle einen langen Namen anzugeben. Lange Namen können aus bis zu 128 Zeichen bestehen und in Datenbanken anstelle der kurzen Dateinamen verwendet werden.
TO FILE FileName
Bei Angabe einer TO-Klausel ohne eine INTO-Klausel können Sie das Abfrageergebnis in eine ASCII-Textdatei namens FileName, an einen Drucker oder an das Visual FoxPro-Hauptfenster senden.ADDITIVE fügt die Ausgabe der Abfrage an den Inhalt der Textdatei an, die in TO FILE FileName angegeben ist.
TO PRINTER [PROMPT] leitet die Abfrageausgabe an einen Drucker. Mit der optionalen PROMPT-Klausel können Sie ein Dialogfeld anzeigen, bevor der Druckvorgang beginnt. In diesem Dialogfeld können Sie Druckereinstellungen anpassen. Welche Druckereinstellungen Sie ändern können, hängt vom installierten Druckertreiber ab. Fügen Sie PROMPT direkt hinter TO PRINTER ein.
TO SCREEN leitet die Abfrageausgabe an das Visual FoxPro-Hauptfenster oder an ein aktives benutzerdefiniertes Fenster.
PREFERENCE PreferenceName
Speichert die Attribute und Optionen des Datenblattfensters, damit diese später verwendet werden können für den Fall, dass das Abfrageergebnis an ein Datenblattfenster gesendet wird. PREFERENCE speichert die Attribute (oder Einstellungen) zeitlich unbegrenzt in der FOXUSER-Ressourcendatei. Einstellungen können jederzeit abgerufen werden.Beim ersten Eingeben von SELECT mit PREFERENCE PreferenceName werden die Einstellungen erstellt. Wenn Sie später den Befehl SELECT mit demselben Einstellungsnamen eingeben, wird das Datenblattfenster wieder mit diesen Einstellungen hergestellt. Wenn das Datenblattfenster geschlossen wird, werden die Einstellungen aktualisiert.
Wenn Sie ein Datenblattfenster mit der Tastenkombination STRG+Q oder STRG+W beenden, werden die Änderungen, die Sie am Datenblattfenster vorgenommen haben, nicht in der Ressourcendatei gespeichert.
NOCONSOLE
Verhindert die Anzeige eines Abfrageergebnisses, das in eine Datei, an einen Drucker oder an das Visual FoxPro-Hauptfenster gesendet wurde.PLAIN
Verhindert, dass Spaltenüberschriften in der Abfrageausgabe angezeigt werden. PLAIN kann mit oder ohne TO-Klausel verwendet werden. Wenn eine INTO-Klausel angegeben ist, wird PLAIN ignoriert.NOWAIT
Setzt die Programmausführung fort, nachdem das Datenblattfenster geöffnet und das Abfrageergebnis dorthin geleitet wurde. Das Programm wartet nicht darauf, dass das Datenblattfenster geschlossen wird, sondern setzt die Ausführung mit der Programmzeile fort, die unmittelbar auf die SELECT-Anweisung folgt.Ist TO SCREEN angegeben, um die Ausgabe an das Visual FoxPro-Hauptfenster oder an ein benutzerdefiniertes Fenster zu leiten, wird die Ausgabe unterbrochen, wenn das entsprechende Fenster mit Abfrageergebnissen vollgeschrieben ist. Drücken Sie dann eine Taste, um die nächste Gruppe von Abfrageergebnissen anzuzeigen. Bei Angabe von NOWAIT wird im Visual FoxPro-Hauptfenster oder im benutzerdefinierten Fenster ein Bildlauf durch die Abfrageergebnisse durchgeführt, ohne anzuhalten und dem Benutzer die Gelegenheit zum Drücken einer Taste zu geben. NOWAIT wird ignoriert, wenn es mit der INTO-Klausel angegeben wird.
WHERE
Gibt an, dass Visual FoxPro nur die Datensätze in die Abfrageergebnisse aufnimmt, die den angegebenen Kriterien entsprechen.JoinCondition
Gibt die Felder an, über die die Tabellen verknüpft werden, die in der FROM-Klausel angegeben sind. Wenn Sie in einer Abfrage mehrere Tabellen angeben, sollten Sie eine Verknüpfungsbedingung für jede Tabelle nach der ersten angeben.Mehrere Verknüpfungsbedingungen müssen mit dem AND-Operator verbunden werden. Jede Verknüpfungsbedingung ist wie folgt aufgebaut:
FieldName1ComparisonFieldName2
FieldName1 ist der Name eines Feldes einer Tabelle, FieldName2 ist der Name eines Feldes einer anderen Tabelle, und Comparison ist einer der folgenden Operatoren:
Operator Vergleich = Gleich == Genau gleich LIKE SQL LIKE <>, !=, # Ungleich > Größer als >= Größer als oder gleich < Kleiner als <= Kleiner als oder gleich Wenn Sie den =-Operator mit Zeichenfolgen verwenden, hängt seine Wirkungsweise von der SET ANSI-Einstellung ab. Ist SET ANSI auf OFF eingestellt, behandelt Visual FoxPro Zeichenfolgenvergleiche genau wie in Xbase. Ist SET ANSI auf ON eingestellt, werden Zeichenfolgenvergleiche entsprechend den ANSI-Regeln behandelt. Weitere Informationen, wie Visual FoxPro Zeichenfolgenvergleiche vornimmt, finden Sie unter SET ANSI und SET EXACT.
Die WHERE-Klausel unterstützt den ESCAPE-Operator für JoinCondition und ermöglicht so die Durchführung aussagefähiger Abfragen von Daten, die die SELECT – SQL-Platzhalterzeichen % und _ enthalten.
Mit Hilfe der ESCAPE-Klausel kann ein SELECT – SQL-Platzhalterzeichen als Literalzeichen behandelt werden. In der ESCAPE-Klausel geben Sie ein Zeichen an, das unmittelbar vor ein Platzhalterzeichen gesetzt wird und anzeigt, dass das Platzhalterzeichen als Literalzeichen behandelt werden soll.
FilterCondition
Gibt die Kriterien an, die Datensätze erfüllen müssen, um zum Abfrageergebnis hinzugefügt zu werden. Sie können in einer Abfrage beliebig viele Filterbedingungen angeben und diese mit dem AND- und OR-Operator verbinden. Sie können auch den NOT-Operator verwenden, um den Wert eines logischen Ausdrucks umzukehren, oder EMPTY( ), um auf ein leeres Feld zu überprüfen.
FilterCondition kann in jedem der Formate vorliegen, die in den folgenden Beispielen angegeben sind:
- Beispiel 1
Beispiel 1 zeigt FilterCondition im Format FieldName1ComparisonFieldName2 an.
customer.cust_id = orders.cust_id
- Beispiel 2
Beispiel 2 zeigt FilterCondition im Format FieldNameComparisonExpression an.
payments.amount >= 1000
- Beispiel 3
Beispiel 3 zeigt FilterCondition im Format FieldNameComparison ALL (Unterabfrage) an.
Bei Angabe von ALL in der Filterbedingung muss das Feld die Vergleichsbedingung für alle Werte erfüllen, die von der Unterabfrage erstellt werden, bevor sein Datensatz in das Abfrageergebnis übernommen wird.
company < ALL ;
(SELECT company FROM customer WHERE country = "UK")
- Beispiel 4
Beispiel 4 zeigt FilterCondition im Format FieldNameComparison ALL ANY | an. SOME (Unterabfrage).
Enthält die Filterbedingung ANY oder SOME, muss das Feld die Vergleichsbedingung für wenigstens einen der Werte erfüllen, die von der Unterabfrage erstellt werden.
company < ANY ;
(SELECT company FROM customer WHERE country = "UK")
- Beispiel 5
Beispiel 5 zeigt FilterCondition im Format FieldName [NOT] BETWEEN Start_Range AND End_Range an.
Das folgende Beispiel prüft, ob die Feldwerte innerhalb eines angegebenen Wertebereichs liegen.
customer.postalcode BETWEEN 90000 AND 99999
- Beispiel 6
Beispiel 6 zeigt FilterCondition im Format [NOT] EXISTS (Unterabfrage) an.
Das folgende Beispiel prüft, ob mindestens eine Zeile das Kriterium der Unterabfrage erfüllt. Wenn die Filterbedingung EXISTS enthält, wird sie als Wahr (.T.) ausgewertet, es sei denn, die Unterabfrage liefert eine leere Ergebnismenge.
EXISTS ;(SELECT * FROM orders WHERE customer.postalcode =orders.postalcode)
- Beispiel 7
Beispiel 7 zeigt FilterCondition im Format FieldName [NOT] IN Value_Set an.
Wenn die Filterbedingung die IN-Klausel enthält, muss das Feld einen der angegebenen Werte enthalten, bevor sein Datensatz zum Abfrageergebnis hinzugefügt wird.
customer.postalcode NOT IN ("98052","98072","98034")
- Beispiel 8
Beispiel 8 zeigt FilterCondition im Format FieldName [NOT] IN (Unterabfrage) an.
Bei diesem Format muss das Feld einen der Werte enthalten, die von der Unterabfrage zurückgegeben werden, bevor sein Datensatz zum Abfrageergebnis hinzugefügt wird.
customer.cust_id IN ;(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")
- Beispiel 9
Beispiel 9 zeigt FilterCondition im Format FieldName [NOT] LIKE cExpression an.
customer.country NOT LIKE "UK"
Diese Filterbedingung sucht nach jedem Feld, das mit cExpression übereinstimmt.
Sie können dabei die Platzhalter Prozentzeichen (%) und Unterstrich ( _ ) als Teil von cExpression angeben. Ein Prozentzeichen entspricht einer Folge unbekannter Zeichen der Zeichenfolge. Ein Unterstrich entspricht einem unbekannten Zeichen der Zeichenfolge.
GROUP BY GroupColumn [, GroupColumn ...]
Gruppiert die Zeilen des Abfrageergebnisses entsprechend den Werten einer oder mehrerer Spalten. GroupColumn kann Folgendes sein: der Name eines normalen Tabellenfeldes, ein Feld, das eine SQL-Feldfunktion enthält, oder ein numerischer Ausdruck, der die Position angibt, die die Spalte in der Ergebnistabelle einnimmt (die ganz linke Spalte hat die Nummer 1).HAVING FilterCondition
Gibt eine Filterbedingung an, der die Gruppen entsprechen müssen, um zum Abfrageergebnis hinzugefügt zu werden. HAVING sollte mit GROUP BY verwendet werden. Sie können beliebig viele Filterbedingungen angeben, die mit dem AND- und/oder OR-Operator verbunden sein müssen. Mit NOT können Sie den Wert eines logischen Ausdrucks umkehren.FilterCondition kann keine Unterabfrage enthalten.
HAVING ohne GROUP BY hat dieselbe Auswirkung wie eine WHERE-Klausel. Sie können lokale Alias und Feldfunktionen in der HAVING-Klausel verwenden. Wenn Ihre HAVING-Klausel keine Feldfunktionen enthält, sollten Sie wegen des besseren Leistungsverhaltens eine WHERE-Klausel verwenden. Die HAVING-Klausel muss vor einer INTO-Klausel stehen. Andernfalls tritt ein Syntaxfehler auf.
[UNION [ALL] SELECTCommand]
Kombiniert die Endergebnisse eines SELECT-Befehls mit den Endergebnissen eines anderen SELECT-Befehls. Standardmäßig überprüft UNION die kombinierten Ergebnisse und entfernt Duplikatzeilen. Verwenden Sie Klammern, um mehrere UNION-Klauseln zu kombinieren.ALL verhindert, dass UNION-Duplikatzeilen aus kombinierten Ergebnissen entfernt.
Folgende Regeln gelten für UNION-Klauseln:
- Sie können UNION nicht verwenden, um Unterabfragen zu kombinieren.
- Beide SELECT-Befehle müssen in ihrem jeweiligen Abfrageergebnis dieselbe Anzahl an Spalten haben.
- Jede Spalte des Abfrageergebnisses eines SELECT-Befehls muss denselben Datentyp und dieselbe Breite haben wie die entsprechende Spalte des anderen SELECT-Befehls.
- Nur der letzte SELECT-Befehl kann eine ORDER BY-Klausel enthalten, die sich über Nummern auf die Ausgabespalten beziehen muss. Eine ORDER BY-Klausel beeinflusst das gesamte Ergebnis.
Sie können zum Simulieren einer äußeren Verknüpfung auch die UNION-Klausel verwenden.
Wenn Sie zwei Tabellen in einer Abfrage verknüpfen, sind nur Datensätze mit übereinstimmenden Werten in den verknüpften Feldern Bestandteil der Ausgabe. Wenn für einen Datensatz in der übergeordneten Tabelle (Master-Tabelle) kein entsprechender Datensatz in der untergeordneten Tabelle (Detailtabelle) vorhanden ist, ist der Datensatz in der übergeordneten Tabelle nicht Bestandteil der Ausgabe. Mit Hilfe einer äußeren Verknüpfung können alle Datensätze in der übergeordneten Tabelle sowie die entsprechenden Datensätze in der untergeordneten Tabelle in die Ausgabe einbezogen werden Zum Erstellen einer äußeren Verknüpfung in Visual FoxPro muss ein geschachtelter SELECT-Befehl verwendet werden, wie im folgenden Beispiel dargestellt:
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)
**Anmerkung **Vergessen Sie nicht, das Leerzeichen unmittelbar vor jedem Semikolon einzufügen. Anderenfalls erhalten Sie eine Fehlermeldung.
Im Abschnitt des Befehls vor der UNION-Klausel werden Datensätze aus beiden Tabellen mit übereinstimmenden Werten ausgewählt. Die Firmenkunden ohne zugehörige Rechnungen werden nicht einbezogen. Im Abschnitt des Befehls nach der UNION-Klausel werden Datensätze aus der Tabelle
customer
ausgewählt, für die es keine entsprechenden Datensätze in der Tabelleorders
gibt.Beachten Sie hinsichtlich des zweiten Befehlsabschnitts Folgendes:
Die SELECT-Anweisung in Klammern wird zuerst verarbeitet. Diese Anweisung führt zur Auswahl aller Kundennummern in der Tabelle
orders
.Die WHERE-Klausel sucht alle Kundennummern in der Tabelle
customer
, die sich nicht in der Tabelleorders
befinden. Da der erste Abschnitt des Befehls alle Firmen mit einer Kundennummer in der Tabelleorders
enthielt, werden nun alle Firmen in der Tabellecustomer
in die Abfrageergebnisse einbezogen.Da die Strukturen von Tabellen in einer UNION-Klausel identisch sein müssen, enthält die zweite SELECT-Anweisung zwei Platzhalter, die den Platzhaltern orders.order_id bzw. orders.emp_id in der ersten SELECT-Anweisung entsprechen.
**Anmerkung **Die Platzhalter müssen denselben Typ haben wie die Felder, denen sie entsprechen. Wenn das Feld den Typ Datum hat, sollte der Platzhalter { / / } lauten. Handelt es sich bei dem Feld um ein Zeichenfeld, sollte der Platzhalter der leeren Zeichenfolge ("") entsprechen.
Unter bestimmten Umständen findet eine automatische Datentransformation statt, wie in den beiden folgenden Beispielen dargestellt:
CREATE CURSOR table1 (field1 c(1)) CREATE CURSOR table2 (field1 c(2)) SELECT field1 FROM table1 UNION SELECT NVL(field1,' ') FROM table2 CREATE CURSOR table1 (field1 n(20,5)) CREATE CURSOR table2 (field1 i) SELECT field1 FROM table1 UNION SELECT field1 FROM table2
ORDER BY Order_Item
Sortiert das Abfrageergebnis entsprechend den Daten, die sich in den angegebenen Spalten befinden. Jedes als Order_Item angegebene Element muss einer Spalte des Abfrageergebnisses entsprechen und kann Folgendes sein:- Ein Feld einer FROM-Tabelle, das in der Haupt-SELECT-Klausel (nicht in einer Unterabfrage) als Select_Item angegeben ist.
- Ein numerischer Ausdruck, der die Position angibt, die die Spalte in der Ergebnistabelle hat. (Die ganz linke Spalte hat die Nummer 1.)
ASC ist die Standardeinstellung für ORDER BY und gibt entsprechend den Sortierelementen eine aufsteigende Reihenfolge für das Abfrageergebnis an.
DESC gibt eine absteigende Reihenfolge für das Abfrageergebnis an.
Das Abfrageergebnis ist ungeordnet, solange Sie keine Reihenfolge mit ORDER BY festgelegt haben.
Hinweise
SELECT ist ein SQL-Befehl, der wie jeder andere Visual FoxPro-Befehl Bestandteil von Visual FoxPro ist. Wenn Sie mit SELECT eine Abfrage ausgeben, interpretiert Visual FoxPro diese Abfrage und ruft die entsprechenden Daten aus den Tabellen ab. Eine SELECT-Abfrage können Sie auf folgende Arten ausgeben:
- Über das Befehlsfenster
- Aus einem Visual FoxPro-Programm (wie mit jedem anderen Visual FoxPro-Befehl)
- Mit dem Abfrage-Designer
Wenn Sie SET TALK ON ausgeben und den Befehl SELECT ausführen, zeigt Visual FoxPro die Ausführungszeit der Abfrage und die Anzahl der Datensätze des Ergebnisses an. _TALLY enthält die Anzahl der Datensätze des Abfrageergebnisses.
SELECT berücksichtigt die aktuelle, mit SET FILTER angegebene Filterbedingung nicht.
Anmerkung Eine Unterabfrage, auf die in den folgenden Argumenten verwiesen wird, ist eine SELECT-Anweisung innerhalb einer SELECT-Anweisung und muss in Klammern stehen. Eine WHERE-Klausel kann bis zu zwei Unterabfragen enthalten, die nicht verschachtelt sein dürfen, sondern auf derselben Ebene sein müssen (siehe auch den WHERE-Abschnitt der Argumente). Eine Unterabfrage kann mehrere Verknüpfungsbedingungen enthalten.
Bei der Erstellung von Abfrageausgaben werden die Spalten nach folgenden Regeln benannt:
- Ist ein Auswahlelement (Select_Item) ein Feld mit einem eindeutigen Namen, ist der Name der Ausgabespalte gleich dem Namen des Feldes.
- Haben mehrere Auswahlelemente (Select_Item) denselben Namen, werden an jeden Spaltennamen ein Unterstrich und ein Buchstabe angefügt. Hat z. B. sowohl eine Tabelle namens "Kunden" als auch eine Tabelle namens "Personal" ein Feld Straße, erhalten die Ausgabespalten die Namen "Straße_a" und "Straße_b" (Select_Item_a und Select_Item_b). Bei einem Auswahlelement, dessen Name 10 Zeichen enthält, wird der Name gekürzt, so dass ein Unterstrich und ein Buchstabe angefügt werden können. So wird z. B. "Verbindung" in "Verbindu_a" umgewandelt.
- Für ein Auswahlelement (Select_Item), das ein Ausdruck ist, erhält die Ausgabespalte den Namen "Exp_1". Für weitere Ausdrücke werden die Namen "Exp_2", "Exp_3" usw. vergeben.
- Wenn ein Auswahlelement (Select_Item) eine Feldfunktion enthält, z. B. COUNT( ), erhält die Ausgabespalte den Namen "Cnt_a". Wenn ein anderes Auswahlelement SUM( ) enthält, erhält dessen Ausgabespalte den Namen "Sum_b".
Benutzerdefinierte Funktionen mit SELECT Obwohl es von Vorteil sein kann, benutzerdefinierte Funktionen in einer SELECT-Klausel zu verwenden, sollten Sie folgende Einschränkungen berücksichtigen:
- Die Geschwindigkeit von SELECT-Operationen kann durch die Geschwindigkeit begrenzt werden, mit der solche benutzerdefinierten Funktionen ausgeführt werden. Die Bearbeitung großer Datenmengen, in die benutzerdefinierte Funktionen einbezogen sind, kann unter Umständen besser durchgeführt werden, wenn Sie API-Funktionen und in C oder Assembler geschriebene benutzerdefinierte Funktionen verwenden.
- Sie können für benutzerdefinierte Funktionen, die über SELECT aufgerufen werden, nichts bezüglich der Visual FoxPro-Ein-/Ausgabe- oder -Tabellenumgebung voraussetzen. Im Allgemeinen wissen Sie weder, welcher Arbeitsbereich ausgewählt wird, noch kennen Sie den Namen der aktuellen Tabelle, und selbst die Namen der verarbeiteten Felder sind Ihnen unbekannt. Die Werte dieser Variablen hängen davon ob, an welcher Stelle im Optimierungsprozess die benutzerdefinierte Funktion aufgerufen wird.
- Es ist riskant, die Visual FoxPro-Ein-/Ausgabe- oder -Tabellenumgebung in benutzerdefinierten Funktionen, die von SELECT aufgerufen werden, zu ändern. Im Allgemeinen sind die Ergebnisse nicht voraussagbar.
- Der einzige zuverlässige Weg, Werte an benutzerdefinierte Funktionen, die über SELECT aufgerufen werden, zu übergeben, ist über die Argumentliste, die beim Aufruf der Funktion übergeben wird.
- Wenn Sie beim Testen eine vermutlich unzulässige Umgebungsänderung entdecken, die in einer bestimmten Version von FoxPro korrekt arbeitet, ist nicht sichergestellt, dass diese auch in späteren Versionen noch korrekt ausgeführt wird.
Abgesehen von diesen Einschränkungen sind benutzerdefinierte Funktionen in der SELECT-Klausel ohne weiteres zulässig. Vergessen Sie dabei jedoch nicht, dass die Verwendung von SELECT das Leistungsverhalten verschlechtern kann.
Die folgenden Feldfunktionen sind für ein Auswahlelement (Select_Item) verfügbar, wenn das Element ein Feld oder ein Ausdruck ist, der ein Feld betrifft:
- AVG(Select_Item): berechnet den Durchschnitt einer Spalte mit numerischen Daten.
- COUNT(Select_Item): zählt, wie viele Elemente einer Spalte ausgewählt sind. COUNT(*) zählt die Anzahl der Zeilen der Abfrageausgabe.
- MIN(Select_Item): ermittelt den kleinsten Wert von Select_Item in einer Spalte.
- MAX(Select_Item): ermittelt den größten Wert von Select_Item in einer Spalte.
- SUM(Select_Item): berechnet die Summe einer Spalte mit numerischen Daten.
Sie können Feldfunktionen nicht verschachteln.
Verknüpfungen Visual FoxPro unterstützt die ANSI SQL '92-Verknüpfungssyntax, mit deren Hilfe Abfragen erstellt werden können, die die Zeilen in zwei oder mehr Tabellen durch Vergleichen der Werte in angegebenen Feldern verknüpfen. Zum Beispiel werden bei einer inneren Verknüpfung nur die Zeilen zweier Tabellen ausgewählt, für die die Werte der verknüpften Felder gleich sind. Visual FoxPro unterstützt verschachtelte Verknüpfungen.
Da SQL auf einer mathematischen Mengentheorie basiert, kann jede Tabelle als Kreis dargestellt werden. Die ON-Klausel, die die Verknüpfungsbedingungen angibt, legt das Maß der Überlappung fest, die der Menge der entsprechenden Zeilen entspricht. Bei einer inneren Verknüpfung tritt die Überlappung im inneren Bereich der beiden Kreise auf. Bei einer äußeren Verknüpfung sind nicht nur die Zeilen enthalten, die sich im Durchschnitt der Kreise (Tabellen) befinden, sondern auch die Zeilen, die sich im äußeren Teil des linken oder rechten Kreises des Durchschnitts befinden.
Anmerkung Beachten Sie beim Erstellen von Verknüpfungsbedingungen folgende Punkte:
- Wenn Sie in einer Abfrage zwei Tabellen ohne Verknüpfungsbedingung angeben, wird jeder Datensatz der ersten Tabelle mit jedem Datensatz der zweiten Tabelle verknüpft, so lange die Filterbedingungen erfüllt sind. Hierdurch können sehr umfangreiche Ergebnisse entstehen.
- Vorsicht ist geboten, wenn Sie Funktionen wie DELETED( ), EOF( ), FOUND( ), RECCOUNT( ) oder RECNO( ), die einen optionalen Alias oder Arbeitsbereich unterstützen, in Verknüpfungsbedingungen verwenden. Die Angabe eines Aliass oder Arbeitsbereichs in diesen Funktionen kann zu unvorhergesehenen Ergebnissen führen. SELECT verwendet nicht Ihre Arbeitsbereiche, sondern führt ein entsprechendes USE ... AGAIN aus. Abfragen, die nur auf einer einzigen Tabelle basieren und diese Funktionen ohne optionalen Alias oder Arbeitsbereich verwenden, werden sinnvolle Ergebnisse zurückgeben. Abfragen jedoch, die auf mehreren Tabellen basieren und diese Funktionen (auch ohne optionalen Alias oder Arbeitsbereich) verwenden, können unter Umständen unerwartete Ergebnisse zurückgeben.
- Beim Verknüpfen von Tabellen, die leere Felder enthalten, ist Vorsicht geboten, da Visual FoxPro auch leere Felder vergleicht. Wenn Sie z. B. über KUNDEN.PLZ und RECHNUNG.PLZ verknüpfen und die Tabelle KUNDEN enthält 100 leere Postleitzahlen und die Tabelle RECHNUNG enthält 400 leere Postleitzahlen, enthält die Ausgabe der Abfrage 40.000 zusätzliche Datensätze, die sich aus den leeren Feldern ergeben. Verwenden Sie die EMPTY( )-Funktion, um leere Datensätze nicht in das Abfrageergebnis aufzunehmen.
- Es gibt Beschränkungen hinsichtlich der Anzahl von Verknüpfungen, die verwendet werden können. Pro SELECT-Anweisung können maximal neun Verknüpfungen verwendet werden.
Wird die EVALUATE( )-Funktion in die WHERE-Klausel einer SQL-Abfrage mit aufgenommen, kann dies zur Rückgabe falscher Daten führen.
Weitere Informationen über Verknüpfungen finden Sie unter Definieren von mehreren Verknüpfungsbedingungen unter Erstellen von Abfragen und Sichten (Ansichten).
Beispiele
In den folgenden Beispielen wird verdeutlicht, wie benutzerdefinierte Funktionen mit SELECT - SQL-Befehl verwendet werden können:
Beispiel 1
Beispiel 1 zeigt die Namen aller Firmen an, die in customer
gespeichert sind (ein Feld von einer Tabelle).
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT customer.company ;
FROM customer
Beispiel 2
Beispiel 2 zeigt die Inhalte dreier Felder von zwei Tabellen an und verknüpft die beiden Tabellen über das Feld cust_id
. Für beide Tabellen werden Aliasnamen verwendet.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT x.company, y.order_date, y.shipped_on ;
FROM customer x, orders y ;
WHERE x.cust_id = y.cust_id
Beispiel 3
Beispiel 3 zeigt nur Datensätze an, die in den angegebenen Feldern nur einmal vorkommende Daten enthalten.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT DISTINCT x.company, y.order_date, y.shipped_on ;
FROM customer x, orders y ;
WHERE x.cust_id = y.cust_id
Beispiel 4
Beispiel 4 zeigt die Inhalte der Felder country
, postalcode
und company
in aufsteigender Reihenfolge an.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT country, postalcode, company ;
FROM customer ;
ORDER BY country, postalcode, company
Beispiel 5
Beispiel 5 speichert Inhalte der Felder zweier Tabellen in einer dritten Tabelle.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT x.company, y.order_date, y.shipped_on ;
FROM customer x, orders y ;
WHERE x.cust_id = y.cust_id ;
INTO TABLE custship.dbf
BROWSE
Beispiel 6
Beispiel 6 zeigt nur Datensätze an, in denen ein Bestelldatum gespeichert ist, das vor dem 16.02.94 liegt.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT x.company, y.order_date, y.shipped_on ;
FROM customer x, orders y ;
WHERE x.cust_id = y.cust_id ;
AND y.order_date < {^1994-02-16}
Beispiel 7
Beispiel 7 zeigt die Namen aller in customer
gespeicherten Kunden an, deren Postleitzahl mit einer Postleitzahl in der Tabelle orders
übereinstimmt.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT company FROM customer x WHERE ;
EXISTS (SELECT * FROM orders y WHERE x.postalcode = y.postalcode)
Beispiel 8
Beispiel 8 zeigt alle Datensätze aus customer
an, in denen ein Firmenname gespeichert ist, der mit einem großen C beginnt und eine unbekannte Länge hat.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer x WHERE x.company LIKE "C%"
Beispiel 9
Beispiel 9 zeigt alle Datensätze aus customer
an, in denen ein Ländername gespeichert ist, der mit einem großen U beginnt, auf das ein unbekanntes Zeichen folgt.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer x WHERE x.country LIKE "U_"
Beispiel 10
Beispiel 10 zeigt alle in customer
gespeicherten Städtenamen in Großbuchstaben an und gibt der Ausgabespalte den Namen CityList
.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT UPPER(city) AS CityList FROM customer
Beispiel 11
Beispiel 11 zeigt, wie Sie eine Abfrage für Daten ausführen können, die Prozentzeichen (%) enthalten. Vor das Prozentzeichen wird ein umgekehrter Schrägstrich (\) platziert, um so anzuzeigen, dass das Prozentzeichen als Literalzeichen behandelt werden soll. Dazu wird der umgekehrte Schrägstrich in der ESCAPE-Klausel als Escapezeichen angegeben.
Da die zu Visual FoxPro gehörenden Beispieltabellen keine Prozentzeichen enthalten, gibt diese Abfrage keine Ergebnismenge zurück.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer;
WHERE company LIKE "%\%%" ESCAPE "\"
Beispiel 12
Beispiel 12 zeigt, wie Sie eine Abfrage für Daten ausführen können, die Unterstriche (_) enthalten. Vor den Unterstrich wird ein umgekehrter Schrägstrich (\) platziert, um so anzuzeigen, dass der Unterstrich als Literalzeichen behandelt werden soll. Dazu wird der umgekehrte Schrägstrich in der ESCAPE-Klausel als Escapezeichen angegeben.
Da die zu Visual FoxPro gehörenden Beispieltabellen keine Unterstriche enthalten, gibt diese Abfrage keine Ergebnismenge zurück.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer;
WHERE company LIKE "%\_%" ESCAPE "\"
Beispiel 13
In Beispiel 13 wird das Escapezeichen selbst als Literalzeichen verwendet. Der Strich ist sowohl das Escapezeichen als auch ein Literalzeichen. Diese Abfrage gibt alle Zeilen zurück, in denen der Firmenname ein Prozentzeichen, gefolgt von einem Strich, enthält.
Da die zu Visual FoxPro gehörenden Beispieltabellen keine Prozentzeichen enthalten, gibt diese Abfrage keine Ergebnismenge zurück.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer;
WHERE company LIKE "%-%--%" Escape "-"
Siehe auch
CREATE QUERY | CREATE TABLE - SQL | INSERT - SQL | MODIFY QUERY | SET ANSI | SET EXACT-Befehl | SET PATH | _TALLY | Definieren mehrerer Verknüpfungsbedingungen