PostgreSQL EKSISTERER med SELECT Operator (Eksempel)

โšก Smart opsummering

PostgreSQL EXISTS er en boolsk operator, der tester, om en korreleret underforespรธrgsel returnerer en rรฆkke, hvilket gรธr det muligt for SELECT-, INSERT-, UPDATE- og DELETE-sรฆtninger effektivt at filtrere data efter tilstedevรฆrelsen eller fravรฆret af matchende poster.

  • ???? Syntaks: WHERE EXISTS (underforespรธrgsel) returnerer sand, nรฅr underforespรธrgslen giver mindst รฉn rรฆkke.
  • ๐Ÿ”— Korreleret underforespรธrgsel: EXISTS forbinder interne og eksterne forespรธrgsler og matcher rรฆkker pรฅ en delt nรธgle.
  • โšก Kortslutning: EXISTS stopper ved den fรธrste matchende rรฆkke, sรฅ den skalerer godt pรฅ store tabeller.
  • ๐Ÿ” Fire udsagn: Operatoren fungerer i SELECT-, INSERT-, UPDATE- og DELETE-forespรธrgsler.
  • ๐Ÿ›ก๏ธ EKSISTERER IKKE: Udelukker rรฆkker sikkert og undgรฅr NULL-fรฆlden, der bryder NOT IN.
  • ๐Ÿค– AI-forespรธrgsler: Assistenter genererer EXISTS-klausuler og markerer ydeevnerisici forbundet med korrelerede underforespรธrgsler.

PostgreSQL EKSISTERER med Select OperaTor

Hvad EKSISTERER i PostgreSQL?

PostgreSQL EXISTS Operatoren tester, om en rรฆkke(r) findes i en underforespรธrgsel. Det betyder, at operatoren bruges sammen med en underforespรธrgsel. EXISTS-operatoren siges at vรฆre opfyldt, nรฅr mindst รฉn rรฆkke findes i underforespรธrgslen. Du kan bruge denne operation sammen med SELECT-, UPDATE-, INSERT- og DELETE-sรฆtninger.

PostgreSQL EXISTS-forespรธrgselssyntaks

Her er syntaksen for PostgreSQL EKSISTERER erklรฆring:

WHERE EXISTS (subquery);

Ovenstรฅende syntaks viser, at EXISTS-operatoren tager et argument ind, som er en underforespรธrgsel. Underforespรธrgslen er blot en SELECT erklรฆring der skal begynde med en SELECT * i stedet for en liste med kolonnenavne eller udtryk.

PostgreSQL EXISTS med SELECT-sรฆtning

Lad os se, hvordan man bruger en SELECT-sรฆtning med EXISTS-operatoren. Vi har fรธlgende tabeller:

Bestil:

PostgreSQL EXISTS med SELECT-sรฆtning

Pris:

PostgreSQL EXISTS med SELECT-sรฆtning

Kรธr fรธlgende sรฆtning:

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

Dette returnerer fรธlgende:

PostgreSQL EXISTS med SELECT-sรฆtningsresultat

Ovenstรฅende kommando skal returnere alle poster i bogtabellen, hvis id matcher id'et for alle poster ved underforespรธrgslen. Kun รฉt id blev matchet. Derfor blev der kun returneret รฉn rekord.

PostgreSQL EXISTS med INSERT-sรฆtning

Vi kan bruge operatoren EXISTS i en INSERT erklรฆring. Vi har fรธlgende 3 tabeller:

Bestil:

PostgreSQL EXISTS med INSERT-sรฆtning

Pris:

PostgreSQL EXISTS med INSERT-sรฆtning

Pris 2:

PostgreSQL EXISTS med INSERT-sรฆtning

Vi kan derefter kรธre fรธlgende sรฆtning:

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

Pristabellen er nu som fรธlger:

PostgreSQL EXISTS med INSERT-sรฆtningsresultat

Rรฆkken med et id pรฅ 5 i tabellen med navnet Price2 blev matchet. Denne post blev derefter indsat i pristabellen.

PostgreSQL EXISTS med UPDATE-sรฆtning

Vi kan bruge EXISTS-operatoren i en UPDATE-sรฆtning.

Kรธr fรธlgende forespรธrgsel:

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

PostgreSQL EXISTS med UPDATE-sรฆtning

Vi opdaterer priskolonnen i pristabellen. Vores mรฅl er at fรฅ priserne pรฅ varer, der deler et id, at vรฆre de samme. Kun รฉn rรฆkke blev matchet, det vil sige 5.

Men da priserne er ens, det vil sige 205, blev der ikke foretaget nogen opdatering. Hvis der var en forskel, ville der vรฆre foretaget en opdatering.

PostgreSQL EXISTS med DELETE-sรฆtning

A PostgreSQL DELETE-sรฆtningen kan bruge EXISTS-operatoren. Her er et eksempel:

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

Pristabellen er nu som fรธlger:

PostgreSQL EXISTS med DELETE-sรฆtning

Rรฆkken med et id pรฅ 5 er blevet slettet.

PostgreSQL EXISTS-sรฆtning ved hjรฆlp af pgAdmin

Ud over SQL-shellen kan de samme EXISTS-forespรธrgsler udfรธres visuelt via pgAdmin-grรฆnsefladen. Lad os nu se, hvordan disse handlinger kan udfรธres ved hjรฆlp af pgAdmin:

Med SELECT-sรฆtning

Nedenfor er trinnene til at bruge en EXISTS-forespรธrgsel i PostgreSQL med en SELECT-sรฆtning ved hjรฆlp af pgAdmin:

Trin 1) Log ind pรฅ din pgAdmin-konto. ร…bn pgAdmin, og log ind pรฅ din konto med dine loginoplysninger.

Trin 2) Opret en demodatabase.

  1. Klik pรฅ Databaser i navigationslinjen til venstre.
  2. Klik pรฅ Demo.

PostgreSQL EXISTS-sรฆtning ved hjรฆlp af pgAdmin

Trin 3) Indtast nedenstรฅende forespรธrgsel i forespรธrgselseditoren:

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

Trin 4) Klik pรฅ knappen Udfรธr.

PostgreSQL EXISTS-sรฆtning ved hjรฆlp af pgAdmin

Det skal returnere fรธlgende:

PostgreSQL EXISTS-sรฆtning ved hjรฆlp af pgAdmin

Med INSERT Statement

For at opnรฅ det samme gennem pgAdmin, gรธr dette:

Trin 1) Log ind pรฅ din pgAdmin-konto.

Trin 2)

  1. Klik pรฅ Databaser i navigationslinjen til venstre.
  2. Klik pรฅ Demo.

EXISTS-erklรฆring i PostgreSQL ved hjรฆlp af pgAdmin

Trin 3) Indtast forespรธrgslen i forespรธrgselseditoren:

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

Trin 4) Klik pรฅ knappen Udfรธr.

EXISTS-erklรฆring i PostgreSQL ved hjรฆlp af pgAdmin

Pristabellen skulle nu vรฆre som fรธlger:

EXISTS-erklรฆring i PostgreSQL ved hjรฆlp af pgAdmin

Med UPDATE-erklรฆring

For at opnรฅ det samme gennem pgAdmin, gรธr dette:

Trin 1) Log ind pรฅ din pgAdmin-konto.

Trin 2)

  1. Klik pรฅ Databaser i navigationslinjen til venstre.
  2. Klik pรฅ Demo.

EXISTS-erklรฆring i PostgreSQL ved hjรฆlp af pgAdmin

Trin 3) Indtast forespรธrgslen i forespรธrgselseditoren:

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

Trin 4) Klik pรฅ knappen Udfรธr.

PostgreSQL EXISTS-sรฆtning ved hjรฆlp af pgAdmin

Pristabellen skulle nu vรฆre som fรธlger:

PostgreSQL EXISTS-sรฆtning ved hjรฆlp af pgAdmin

Med SLET-erklรฆring

For at opnรฅ det samme gennem pgAdmin, gรธr dette:

Trin 1) Log ind pรฅ din pgAdmin-konto.

Trin 2)

  1. Klik pรฅ Databaser i navigationslinjen til venstre.
  2. Klik pรฅ Demo.

PostgreSQL EXISTS-sรฆtning ved hjรฆlp af pgAdmin

Trin 3) Indtast forespรธrgslen i forespรธrgselseditoren:

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

Trin 4) Klik pรฅ knappen Udfรธr.

PostgreSQL EXISTS-sรฆtning ved hjรฆlp af pgAdmin

Pristabellen skulle nu vรฆre som fรธlger:

PostgreSQL EXISTS-sรฆtning ved hjรฆlp af pgAdmin

Download databasen brugt i denne vejledning

Ofte Stillede Spรธrgsmรฅl

EXISTS tester, om en korreleret underforespรธrgsel returnerer en rรฆkke og stopper ved det fรธrste match, sรฅ den passer til store underforespรธrgsler. IN sammenligner en vรฆrdi med en liste og tilpasser smรฅ, konstante sรฆt.

NOT IN kan returnere nul rรฆkker, nรฅr underforespรธrgslen indeholder en NULL, fordi sammenligningen bliver ukendt. NOT EXISTS ignorerer NULL'er og evaluerer hver rรฆkke korrekt, hvilket gรธr den til det pรฅlidelige valg til anti-joins.

En korreleret underforespรธrgsel refererer til en kolonne fra den ydre forespรธrgsel, f.eks. WHERE Book.id = Price.id. EXISTS kontrollerer den igen for hver ydre rรฆkke og returnerer sand, nรฅr der findes et match.

Ja. EXISTS returnerer sand, sรฅ snart underforespรธrgslen producerer รฉn rรฆkke, sรฅ den scanner ikke resten. Denne kortslutningsadfรฆrd gรธr den effektiv pรฅ store korrelerede underforespรธrgsler.

Nej. EXISTS kontrollerer kun, om underforespรธrgslen returnerer en rรฆkke, sรฅ SELECT *, SELECT 1 eller SELECT id opfรธrer sig ens. Kolonnelisten i underforespรธrgslen pรฅvirker ikke resultatet.

Indeksรฉr de kolonner, der er forbundet i underforespรธrgslen, behold korrelationsbetingelsen Sargable, og kรธr EXPLAIN ANALYZE. PostgreSQL omskriver ofte EXISTS som en effektiv semi-join, nรฅr indekser understรธtter det.

AI-assistenter omdanner almindelige engelske regler til EXISTS-klausuler, bygger den korrelerede underforespรธrgsel og advarer om NOT IN NULL-fรฆlder. De foreslรฅr ogsรฅ indekser og EXPLAIN-tips til finjustering.

Ja. En AI Copilot registrerer underforespรธrgselsmรธnstre og omskriver IN som EXISTS eller NOT IN som NOT EXISTS, hvilket forbedrer NULL-sikkerhed og ydeevne pรฅ store tabeller.

Opsummer dette indlรฆg med: