Einführung
Um mit Daten in einer Datenbank arbeiten zu können, müssen Sie in der Lage sein, bestimmte Datensätze effektiv abzurufen und zu zielen. Durch die Verwendung von Filterklauseln in Ihren Abfragen können Sie bestimmte Kriterien hinzufügen, um nur die relevantesten Datensätze zurückzugeben.
In diesem Leitfaden werfen wir einen Blick auf einige der gängigsten Filteroperationen, die in PostgreSQL verfügbar sind, und zeigen, wie Sie sie verwenden können, um den Fokus Ihrer Anweisungen einzugrenzen. Wir zeigen, wie man mit WHERE
auf Merkmale innerhalb einzelner Datensätze testet Klauseln, wie Datensätze gruppiert werden, um Informationen mit GROUP BY
zusammenzufassen , wie man Gruppen von Datensätzen mit dem HAVING
filtert Unterklausel und wie man die maximale Anzahl der zurückgegebenen Zeilen mit LIMIT
festlegt Klausel.
Using the WHERE
-Klausel zum Definieren von Übereinstimmungskriterien
Eine der gebräuchlichsten und allgemein nützlichsten Möglichkeiten, Ihre Abfrageanforderungen anzugeben, ist WHERE
Klausel. Das WHERE
Mit der Klausel können Sie tatsächliche Suchkriterien für Abfrageanweisungen definieren, indem Sie Bedingungen angeben, die für alle übereinstimmenden Datensätze wahr sein müssen.
WHERE
Klauseln funktionieren, indem sie boolesche Ausdrücke definieren, die mit jeder in Frage kommenden Datenzeile geprüft werden. Wenn das Ergebnis des Ausdrucks falsch ist, wird die Zeile aus den Ergebnissen entfernt und nicht zurückgegeben oder mit der nächsten Verarbeitungsstufe fortgesetzt. Wenn das Ergebnis des Ausdrucks wahr ist, erfüllt er die Kriterien der Suche und wird für jede weitere Verarbeitung als Kandidatenzeile fortgesetzt.
Die grundlegende Syntax von WHERE
Klausel sieht so aus:
SELECT * FROM my_table WHERE <condition>;
Der <condition>
kann alles sein, was zu einem booleschen Wert führt. In PostgreSQL ist ein boolescher Wert TRUE
, FALSE
, oder NULL
.
Bedingungen werden oft mit einem oder mehreren der folgenden Operatoren gebildet:
=
:gleich>
:größer als<
:kleiner als>=
:größer oder gleich<=
:kleiner oder gleich<>
oder!=
:nicht gleichAND
:Der logische „und“-Operator – verbindet zwei Bedingungen und gibtTRUE
zurück wenn beide BedingungenTRUE
sindOR
:logischer „oder“-Operator – verbindet zwei Bedingungen und gibtTRUE
zurück wenn mindestens eine der BedingungenTRUE
istIN
:Wert ist in der folgenden Liste, Reihe oder Bereich enthaltenBETWEEN
:Der Wert ist im Bereich der folgenden Mindest- und Höchstwerte enthalten, einschließlichIS NULL
:passt, wenn der WertNULL
istNOT
:negiert den folgenden booleschen WertEXISTS
:Die folgende Abfrage enthält ErgebnisseLIKE
:Gleicht mit einem Muster ab (unter Verwendung der Platzhalter%
um 0 oder mehr Zeichen zu finden und_
um ein einzelnes Zeichen zu finden)ILIKE
:Gleicht mit einem Muster ab (unter Verwendung der Platzhalter%
um 0 oder mehr Zeichen zu finden und_
um ein einzelnes Zeichen abzugleichen), Groß-/Kleinschreibung wird nicht beachtetSIMILAR TO
:Gleicht mit einem Muster ab, das den regulären Ausdrucksdialekt von SQL verwendet~
:Übereinstimmung mit einem Muster unter Verwendung regulärer POSIX-Ausdrücke, Groß-/Kleinschreibung beachten~*
:Übereinstimmung mit einem Muster unter Verwendung regulärer POSIX-Ausdrücke, Groß-/Kleinschreibung nicht beachten!~
:stimmt nicht mit einem Muster überein, das reguläre POSIX-Ausdrücke verwendet, Groß- und Kleinschreibung beachten!~*
:stimmt nicht mit einem Muster überein, das reguläre POSIX-Ausdrücke verwendet, Groß-/Kleinschreibung wird nicht beachtet
Während die obige Liste einige der gebräuchlichsten Testkonstrukte darstellt, gibt es viele andere Operatoren, die boolesche Ergebnisse liefern, die in Verbindung mit einem WHERE
verwendet werden können Klausel.
Beispiele mit WHERE
Eine der gebräuchlichsten und einfachsten Prüfungen ist die Gleichheit mit =
Operator. Hier prüfen wir, ob jede Zeile im customer
Tabelle hat einen last_name
Wert gleich Smith
:
SELECT * FROM customer WHERE last_name = 'Smith';
Wir können zusätzliche Bedingungen hinzufügen, um zusammengesetzte Ausdrücke mit logischen Operatoren zu erstellen. Dieses Beispiel verwendet das AND
-Klausel, um einen zusätzlichen Test für first_name
hinzuzufügen Säule. Gültige Zeilen müssen beide gegebenen Bedingungen erfüllen:
SELECT * FROM customer WHERE first_name = 'John' AND last_name = 'Smith';
Ebenso können wir prüfen, ob eine Reihe von Bedingungen erfüllt sind. Hier überprüfen wir Zeilen von address
Tabelle, um zu sehen, ob die zip_code
Wert ist gleich 60626 oder neighborhood
Spalte ist gleich der Zeichenfolge "Roger's Park". Wir verwenden zwei einfache Anführungszeichen, um anzuzeigen, dass nach einem wörtlichen einfachen Anführungszeichen gesucht werden soll:
SELECT * FROM address WHERE zip_code = '60626' OR neighborhood = 'Roger''s Park';
Der IN
Der Operator kann wie ein Vergleich zwischen einer Reihe von Werten funktionieren, die in Klammern eingeschlossen sind. Wenn es eine Übereinstimmung mit einem der angegebenen Werte gibt, ist der Ausdruck TRUE
:
SELECT * FROM customer WHERE last_name IN ('Smith', 'Johnson', 'Fredrich');
Hier prüfen wir mit LIKE
gegen ein Zeichenfolgenmuster . Der %
funktioniert als Platzhalter, der mit null oder mehr Zeichen übereinstimmt, also würden "Pete", "Peter" und jede andere Zeichenfolge, die mit "Pete" beginnt, passen:
SELECT * FROM customer WHERE last_name LIKE 'Pete%';
Wir könnten eine ähnliche Suche mit ~*
durchführen -Operator, um mit regulären POSIX-Ausdrücken ohne Rücksicht auf Groß- und Kleinschreibung nach Übereinstimmungen zu suchen. In diesem Fall prüfen wir, ob der Wert von last_name
beginnt mit einem „d“ und enthält den Teilstring „on“, der Namen wie „Dickson“, „Donald“ und „Devon“ entsprechen würde:
SELECT * FROM customer WHERE last_name ~* '^D.*on.*';
Mit dem BETWEEN
können wir prüfen, ob eine Hausnummer innerhalb des 4000er Adressblocks liegt und AND
Operatoren zum Definieren eines inklusiven Bereichs:
SELECT * FROM address WHERE street_number BETWEEN 4000 AND 4999;
Hier können wir beliebige customer
anzeigen Einträge mit Sozialversicherungsnummern, die nicht 9-stellig sind. Wir verwenden die LENGTH()
-Operator, um die Anzahl der Ziffern im Feld und den <>
zu erhalten um auf Ungleichheit zu prüfen:
SELECT * FROM customer WHERE LENGTH(SSN) <> 9;
Verwendung von GROUP BY
-Klausel, um mehrere Datensätze zusammenzufassen
Die GROUP BY
-Klausel ist eine weitere sehr gebräuchliche Methode zum Filtern von Ergebnissen, indem mehrere Ergebnisse in einer einzigen Zeile dargestellt werden. Die grundlegende Syntax von GROUP BY
Klausel sieht so aus:
SELECT <columns> FROM some_table GROUP BY <columns_to_group>
Wenn ein GROUP BY
-Klausel zu einer Anweisung hinzugefügt wird, weist sie PostgreSQL an, eine einzelne Zeile für jeden eindeutigen Wert für die angegebene Spalte oder Spalten anzuzeigen. Dies hat einige wichtige Auswirkungen.
Da die GROUP BY
-Klausel eine Möglichkeit ist, mehrere Zeilen als eine einzelne Zeile darzustellen, kann PostgreSQL die Abfrage nur ausführen, wenn es einen Wert für jede der anzuzeigenden Spalten berechnen kann. Das bedeutet, dass jede Spalte durch den SELECT
identifiziert wird Teil der Anweisung muss entweder sein:
- im
GROUP BY
enthalten -Klausel, um sicherzustellen, dass jede Zeile einen eindeutigen Wert hat - abstrahiert, um alle Zeilen innerhalb jeder Gruppe zusammenzufassen
Praktisch bedeutet dies, dass beliebige Spalten in der SELECT
Liste nicht in GROUP BY
enthalten -Klausel muss eine Aggregatfunktion verwenden, um ein einzelnes Ergebnis für die Spalte für jede Gruppe zu erzeugen.
Beispiele mit GROUP BY
Nehmen wir für die Beispiele in diesem Abschnitt an, dass wir eine Tabelle namens pet
haben die wir wie folgt definiert und ausgefüllt haben:
CREATE TABLE pet ( id SERIAL PRIMARY KEY, type TEXT, name TEXT, color TEXT, age INT);INSERT INTO pet (type, name, color, age) VALUES('dog', 'Spot', 'brown', 3),('dog', 'Rover', 'black', 7),('dog', 'Sally', 'brown', 1),('cat', 'Sabrina', 'black', 8),('cat', 'Felix', 'white', 4),('cat', 'Simon', 'orange', 8),('rabbit', 'Buttons', 'grey', 4),('rabbit', 'Bunny', 'brown', 8),('rabbit', 'Briony', 'brown', 6);
Die einfachste Verwendung von GROUP BY
soll den Bereich der eindeutigen Werte für eine einzelne Spalte anzeigen. Verwenden Sie dazu dieselbe Spalte in SELECT
und GROUP BY
. Hier sehen wir alle in der Tabelle verwendeten Farben:
SELECT color FROM pet GROUP BY color;
color-------- black grey brown white orange(5 rows)
Wenn Sie in SELECT
über eine einzelne Spalte hinausgehen Spaltenliste, müssen Sie die Spalten entweder zur GROUP BY
hinzufügen -Klausel oder verwenden Sie eine Aggregatfunktion, um einen einzelnen Wert für die dargestellte Gruppe von Zeilen zu erzeugen.
Hier fügen wir type
hinzu zu GROUP BY
-Klausel, was bedeutet, dass jede Zeile eine eindeutige Kombination von type
darstellt und color
Werte. Wir fügen auch das age
hinzu Spalte, zusammengefasst durch avg()
Funktion, um das Durchschnittsalter jeder der Gruppen zu ermitteln:
SELECT type, color, avg(age) AS average_age FROM pet GROUP BY type, color;
type | color | average_age--------+--------+-------------------- rabbit | brown | 7.0000000000000000 cat | black | 8.0000000000000000 rabbit | grey | 4.0000000000000000 dog | black | 7.0000000000000000 dog | brown | 2.0000000000000000 cat | orange | 8.0000000000000000 cat | white | 4.0000000000000000(7 rows)
Aggregatfunktionen funktionieren genauso gut mit einer einzelnen Spalte in GROUP BY
Klausel. Hier finden wir das Durchschnittsalter jeder Tierart:
SELECT type, avg(age) AS average_age FROM PET GROUP BY type;
type | average_age--------+-------------------- rabbit | 6.0000000000000000 dog | 3.6666666666666667 cat | 6.6666666666666667(3 rows)
Wenn wir das älteste jeder Tierart anzeigen möchten, könnten wir stattdessen max()
verwenden Funktion auf dem age
Säule. Die GROUP BY
-Klausel reduziert die Ergebnisse in denselben Zeilen wie zuvor, aber die neue Funktion ändert das Ergebnis in der anderen Spalte:
SELECT type, max(age) AS oldest FROM pet GROUP BY type;
type | oldest--------+------- rabbit | 8 dog | 7 cat | 8(3 rows)
Using the HAVING
-Klausel zum Filtern von Datensatzgruppen
Die GROUP BY
-Klausel ist eine Möglichkeit, Daten zusammenzufassen, indem mehrere Datensätze in einer einzigen repräsentativen Zeile zusammengefasst werden. Was aber, wenn Sie diese Gruppen basierend auf zusätzlichen Faktoren eingrenzen möchten?
Das HAVING
-Klausel ist ein Modifikator für GROUP BY
-Klausel, mit der Sie Bedingungen angeben können, die jede Gruppe erfüllen muss, um in die Ergebnisse aufgenommen zu werden.
Die allgemeine Syntax sieht folgendermaßen aus:
SELECT <columns> FROM some_table GROUP BY <columns_to_group> HAVING <condition>
Die Operation ist der WHERE
sehr ähnlich -Klausel, mit dem Unterschied, dass WHERE
filtert einzelne Datensätze und HAVING
Filtert Gruppen von Datensätzen.
Beispiele mit HAVING
Unter Verwendung derselben Tabelle, die wir im letzten Abschnitt eingeführt haben, können wir demonstrieren, wie das HAVING
Klausel funktioniert.
Hier gruppieren wir die Zeilen des pet
Tabelle nach eindeutigen Werten im type
Spalte, um den Mindestwert von age
zu finden auch. Das HAVING
-Klausel filtert dann die Ergebnisse, um alle Gruppen zu entfernen, deren Alter nicht größer als 1 ist:
SELECT type, min(age) AS youngest FROM pet GROUP BY type HAVING min(age) > 1;
type | youngest--------+---------- rabbit | 4 cat | 4(2 rows)
In diesem Beispiel gruppieren wir die Zeilen in pet
durch ihre Farbe. Wir filtern dann die Gruppen, die nur eine einzelne Zeile darstellen. Das Ergebnis zeigt uns jede Farbe, die mehr als einmal vorkommt:
SELECT color FROM pet GROUP BY color HAVING count(color) > 1;
color------- black brown(2 rows)
Wir können eine ähnliche Abfrage durchführen, um die Kombinationen von type
zu erhalten und color
die nur ein einzelnes Tier hat:
SELECT type, color FROM pet GROUP BY type, color HAVING count(color) = 1;
type | color--------+-------- cat | black rabbit | grey dog | black cat | orange cat | white(5 rows)
Verwendung von LIMIT
-Klausel, um die maximale Anzahl von Datensätzen festzulegen
Das LIMIT
-Klausel bietet einen anderen Ansatz zum Reduzieren der Datensätze, die Ihre Abfrage zurückgibt. Anstatt Datenzeilen basierend auf Kriterien innerhalb der Zeile selbst zu eliminieren, wird das LIMIT
-Klausel legt die maximale Anzahl von Datensätzen fest, die von einer Abfrage zurückgegeben werden.
Die grundlegende Syntax von LIMIT
sieht so aus:
SELECT * FROM my_table LIMIT <num_rows> [OFFSET <num_rows_to_skip>];
Hier der <num_rows>
gibt die maximale Anzahl der anzuzeigenden Zeilen aus der ausgeführten Abfrage an. Dies wird oft in Verbindung mit ORDER BY
verwendet -Klauseln, um die Zeilen mit den extremsten Werten in einer bestimmten Spalte zu erhalten. Um beispielsweise die fünf besten Ergebnisse bei einer Prüfung zu erhalten, könnte ein Benutzer ORDER BY
verwenden eine score
Spalte und dann LIMIT
die Ergebnisse bis 5.
Während LIMIT
zählt standardmäßig von oben in den Ergebnissen, der optionale OFFSET
Schlüsselwort kann verwendet werden, um die verwendete Startposition zu versetzen. Dadurch können Sie durch die Ergebnisse paginieren, indem Sie die durch LIMIT
definierte Anzahl von Ergebnissen anzeigen und dann LIMIT
hinzufügen Nummer zum OFFSET
um die folgende Seite abzurufen.
Beispiele mit LIMIT
Wir werden das pet
verwenden Tabelle von früher für die Beispiele in diesem Abschnitt.
Wie oben erwähnt, LIMIT
wird oft mit einem ORDER BY
kombiniert -Klausel, um die Reihenfolge der Zeilen explizit zu definieren, bevor die entsprechende Zahl geschnitten wird. Hier sortieren wir das pet
Einträge nach ihrem age
, vom Ältesten zum Jüngsten. Wir verwenden dann LIMIT
um die 5 ältesten Tiere anzuzeigen:
SELECT * FROM pet ORDER BY age DESC LIMIT 5;
type | name | color | age | id--------+---------+--------+-----+---- cat | Simon | orange | 8 | 6 cat | Sabrina | black | 8 | 4 rabbit | Bunny | brown | 8 | 8 dog | Rover | black | 7 | 2 rabbit | Briany | brown | 6 | 9(5 rows)
Ohne ORDER BY
Klausel, LIMIT
wird eine Auswahl auf völlig vorhersehbare Weise treffen. Die zurückgegebenen Ergebnisse können durch die Reihenfolge der Einträge innerhalb der Tabelle oder durch Indizes bewirkt werden. Das ist nicht immer schlecht.
Wenn wir einen Datensatz für einen einzelnen dog
benötigen Innerhalb der Tabelle könnten wir eine Abfrage wie diese konstruieren. Beachten Sie, dass das Ergebnis zwar schwer vorherzusagen ist, dies jedoch keine zufällige Auswahl ist und nicht als solche verwendet werden sollte:
SELECT * FROM pet WHERE type = 'dog' LIMIT 1;
type | name | color | age | id------+------+-------+-----+---- dog | Spot | brown | 3 | 1(1 row)
Wir können den OFFSET
verwenden -Klausel, um durch die Ergebnisse zu paginieren. Wir fügen einen ORDER BY
hinzu -Klausel, um eine bestimmte Reihenfolge für die Ergebnisse zu definieren.
Bei der ersten Abfrage schränken wir die Ergebnisse ein, ohne einen OFFSET
anzugeben um die ersten 3 jüngsten Einträge zu erhalten:
SELECT * FROM pet ORDER BY age LIMIT 3;
type | name | color | age | id------+-------+-------+-----+---- dog | Sally | brown | 1 | 3 dog | Spot | brown | 3 | 1 cat | Felix | white | 4 | 5(3 rows)
Um die nächsten 3 Jüngsten zu erhalten, können wir die in LIMIT
definierte Zahl hinzufügen zum OFFSET
um die bereits abgerufenen Ergebnisse zu überspringen:
SELECT * FROM pet ORDER BY age LIMIT 3 OFFSET 3;
type | name | color | age | id --------+---------+-------+-----+---- rabbit | Buttons | grey | 4 | 7 rabbit | Briany | brown | 6 | 9 dog | Rover | black | 7 | 2(3 rows)
Wenn wir das LIMIT
hinzufügen zum OFFSET
wieder erhalten wir die nächsten 3 Ergebnisse:
SELECT * FROM pet ORDER BY age LIMIT 3 OFFSET 6;
type | name | color | age | id--------+---------+--------+-----+---- cat | Simon | orange | 8 | 6 rabbit | Bunny | brown | 8 | 8 cat | Sabrina | black | 8 | 4(3 rows)
Dadurch können wir Datenzeilen aus einer Abfrage in überschaubaren Blöcken abrufen.
Fazit
Es gibt viele Möglichkeiten, die Ergebnisse, die Sie aus Abfragen erhalten, zu filtern und anderweitig einzuschränken. Klauseln wie WHERE
und HAVING
Bewerten Sie potenzielle Zeilen oder Gruppen von Zeilen, um festzustellen, ob sie bestimmte Kriterien erfüllen. Die GROUP BY
-Klausel hilft Ihnen, Daten zusammenzufassen, indem Datensätze gruppiert werden, die einen oder mehrere gemeinsame Spaltenwerte haben. Das LIMIT
-Klausel bietet Benutzern die Möglichkeit, ein festes Maximum für die Anzahl der abzurufenden Datensätze festzulegen.
Wenn Sie lernen, wie diese Klauseln einzeln oder in Kombination angewendet werden können, können Sie spezifische Daten aus großen Datensätzen extrahieren. Abfragemodifikatoren und -filter sind unerlässlich, um die in PostgreSQL enthaltenen Daten in nützliche Antworten umzuwandeln.