Hoe selecteert u verschillende waarden uit queryresultaten in PostgreSQL
SUMMARY: Dit artikel beschrijft methoden voor het selecteren van verschillende waarden uit queryresultaten in PostgreSQL. De besproken trefwoorden en clausules met voorbeelden zijn:
1. DISTINCT
2. DISTINCT ON
3. GROUP BY
4. HAVING
5. Enkele voorbehouden
In dit bericht gaan we bekijken hoe u verschillende waarden uit SQL query’s/statements kunt selecteren. Een van de eenvoudigste manieren om verschillende waarden te selecteren is met behulp van het trefwoord DISTINCT. Laten we dit sleutelwoord eerst verkennen.
DISTINCT
DISTINCT wordt gebruikt om dubbele rijen uit de SELECT query te verwijderen en slechts één unieke rij uit de resultatenset weer te geven.
Voorbeelden
Laten we een nieuwe tabel in PostgreSQL opzetten en deze gebruiken om te kijken naar een paar nuttige manieren waarop DISTINCT duplicaten kan verwijderen en nuttige informatie uit de gegevens kan onthullen.
Eerst, maak verbinding met psql terminal:
/usr/pgsql-11/bin/psql -U postgres postgres
Maak een tabel aan, “test”:
create table test(col1 int, col2 varchar,col3 date);
–Voeg een paar records in tabel “test” in:
insert into test values (1,'abc','2015-09-10');insert into test values (1,'abc','2015-09-11');insert into test values (2,'xyz','2015-09-12');insert into test values (2,'xyz','2015-09-13');insert into test values (3,'tcs','2015-01-15');insert into test values (3,'tcs','2015-01-18');
Gebruik de SELECT query om de rijen van tabel “test” te zien:
postgres=# select * from test; col1 | col2 | col3 ------+------+------------ 1 | abc | 2015-09-10 1 | abc | 2015-09-11 2 | xyz | 2015-09-12 2 | xyz | 2015-09-13 3 | tcs | 2015-01-15 3 | tcs | 2015-01-18(6 rows)
Nu de tabel is opgezet, laten we eens kijken naar een paar manieren waarop DISTINCT door de gegevens kan sorteren:
1. U kunt SELECT met DISTINCT gebruiken om alleen de niet-duplicate waarden uit kolom “col1” te vinden:
postgres=# select distinct(col1) from test order by col1; col1 ------ 1 2 3(3 rows)
2. SELECT met DISTINCT kan ook worden gebruikt in een SQL inline query:
postgres=# select col1 from (select distinct(col1) from test order by col1) as foo; col1 ------ 1 2 3(3 rows)
3. DISTINCT kan ook worden gebruikt met COUNT en andere aggregaten:
postgres=# select col1,count(distinct(col1)) from test group by col1; col1 | count ------+------- 1 | 1 2 | 1 3 | 1(3 rows)
4. U kunt SELECT met DISTINCT gebruiken op twee kolommen van de tabel:
postgres=# select distinct col1,col2 from test order by 1; col1 | col2 ------+------ 1 | abc 2 | xyz 3 | tcs(3 rows)
5. U kunt ook SELECT met DISTINCT op alle kolommen van de tabel gebruiken:
postgres=# select distinct col1,col2,col3 from test order by 1; col1 | col2 | col3 ------+------+------------ 1 | abc | 2015-09-11 1 | abc | 2015-09-10 2 | xyz | 2015-09-13 2 | xyz | 2015-09-12 3 | tcs | 2015-01-15 3 | tcs | 2015-01-18(6 rows)
Merk hier op dat alle rijen zijn weergegeven, inclusief duplicaten, want er zijn geen afzonderlijke rijen in de kolom “col3”.
Een variant van DISTINCT is DISTINCT ON. laten we dit nu eens onderzoeken.
DISTINCT ON
Als distinct geen unieke rij kan teruggeven als de combinatie van alle kolommen niet uniek is, kunnen we de distinct on-clausule gebruiken die de eerste rij van die set dubbele rijen geeft.De kolom die we specificeren in DISTINCT ON <col_name> moet ook aanwezig zijn in de ORDER BY clausule; anders krijg je een foutmelding.
Exemplaar
U kunt DISTINCT ON gebruiken om de eerste van elke waarde in “col1” weer te geven:
postgres=# select distinct on (col1) col1,col2,col3 from test order by col1; col1 | col2 | col3 ------+------+------------ 1 | abc | 2015-09-10 2 | xyz | 2015-09-13 3 | tcs | 2015-01-15(3 rows)
Reserveringen
Er zijn een paar scenario’s waarin het distinct keyword niet kan worden gebruikt.
1. DISTINCT is een gereserveerd sleutelwoord in PostgreSQL, dus we kunnen het niet specificeren als een objectnaam.
postgres=# create table distinct(n int);ERROR: syntax error at or near "distinct"
2. In een SELECT query kunnen we niet meer dan één DISTINCT trefwoord hebben:
postgres=# select distinct 1, distinct 2;ERROR: syntax error at or near "distinct"
3. We kunnen het ook niet gebruiken in WHERE en GROUP BY condities:
postgres=# select * from test where distinct(col1)=1;ERROR: syntax error at or near "distinct"
of
postgres=# select distinct(col1) from test group by distinct(col1);ERROR: syntax error at or near "distinct"
4. FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE en FOR KEY SHARE kunnen niet worden opgegeven met DISTINCT:
postgres=# select distinct(col1),col2,col3 from test order by 1 for update;ERROR: FOR UPDATE is not allowed with DISTINCT clause
Een andere populaire manier om niet-dubbele waarden te selecteren is door gebruik te maken van de GROUP BY met HAVING-clausule.
GROUP BY en HAVING
Met GROUP BY en HAVING kunt u verschillende waarden selecteren op basis van een groep kolommen. Waarbij ook dubbele waarden kunnen worden gevonden.
Functioneel gezien werken group by en distinct op vergelijkbare wijze, maar group by biedt ook de flexibiliteit om aggregatiefuncties te gebruiken en unieke gegevens te verkrijgen. Ook qua prestaties is group by beter dan distinct.
Voorbeelden
postgres=# select col1, col2 from test group by col1,col2 order by 1; col1 | col2 ------+------ 1 | abc 2 | xyz 3 | tcs(3 rows) postgres=# select col1, col2,count(*) from test group by col1,col2 order by 1; col1 | col2 | count ------+------+------- 1 | abc | 2 2 | xyz | 2 3 | tcs | 2(3 rows)postgres=# select col1 from test group by col1 having count(col1) > 1 order by 1; col1 ------ 1 2 3(3 rows)