SQL Academy · Lektion

Sammenligning af rækker i samme tabel

Find par og relationer.

Lektion 3 af 413 trin

Sammenligning af rækker i samme tabel er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad er et selvjoin?

Et selvjoin opstår, når du forbinder en tabel med sig selv. Det lyder måske usædvanligt i starten, men det er en effektiv teknik til at sammenligne rækker i den samme tabel.

Forestil dig en employees-tabel, hvor hver medarbejder har et manager_id, der peger på en anden række i den samme tabel. Med et selvjoin kan du matche hver medarbejder med dennes leder i en enkelt forespørgsel.

Opsætning af eksempeltabellen

Lad os oprette en enkel employees-tabel, som vi bruger gennem hele lektionen. Hver række har et id, et name, en salary og et manager_id, der refererer til en anden medarbejder i den samme tabel.

CREATE TABLE employees (
  id         INT PRIMARY KEY,
  name       VARCHAR(50),
  salary     INT,
  manager_id INT
);

INSERT INTO employees VALUES
  (1, 'Alice',   90000, NULL),
  (2, 'Bob',     70000, 1),
  (3, 'Carol',   65000, 1),
  (4, 'Dave',    55000, 2),
  (5, 'Eve',     60000, 2),
  (6, 'Frank',   48000, 3);

Grundlæggende syntaks for selvjoins

Hvis du vil udføre et selvjoin, refererer du til den samme tabel to gange ved hjælp af to forskellige aliaser. Aliaserne fungerer, som om du havde to separate kopier af tabellen. Derefter angiver du joinbetingelsen, der forbinder de to kopier.

Her giver vi employees aliaset e (medarbejderen) og m (lederen) og matcher derefter på e.manager_id = m.id.

SELECT
  e.name   AS employee,
  m.name   AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Inkludering af rækker på øverste niveau med LEFT JOIN

Et almindeligt INNER JOIN fjerner rækker, hvor manager_id er NULL, hvilket betyder, at medarbejderen på øverste niveau (Alice, den administrerende direktør) ikke kommer med i resultaterne.

Brug et LEFT JOIN, så alle medarbejdere vises, også dem uden leder. Lederkolonnen vil ganske enkelt være NULL for dem.

SELECT
  e.name          AS employee,
  m.name          AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY m.name NULLS LAST, e.name;

Find par, der deler en egenskab

Selvjoins er også nyttige til at finde par af rækker, der deler en værdi. Du kan for eksempel finde alle par af medarbejdere, der refererer til den samme leder.

Betingelsen a.id < b.id forhindrer, at duplikatpar som (Bob, Carol) og (Carol, Bob) begge vises i resultaterne.

SELECT
  a.name       AS employee_1,
  b.name       AS employee_2,
  a.manager_id AS shared_manager
FROM employees a
JOIN employees b
  ON a.manager_id = b.manager_id
 AND a.id < b.id;

Sammenligning af lønninger mellem rækker

Du kan bruge et selvjoin til at sammenligne numeriske værdier på tværs af rækker. Forespørgslen nedenfor finder alle medarbejdere, hvis løn er højere end deres egen leders løn — en klassisk analytisk kontrol.

SELECT
  e.name       AS employee,
  e.salary     AS emp_salary,
  m.name       AS manager,
  m.salary     AS mgr_salary
FROM employees e
JOIN employees m ON e.manager_id = m.id
WHERE e.salary > m.salary;

Find rækker uden match

Et selvjoin med et LEFT JOIN og en WHERE ... IS NULL-kontrol gør det muligt at finde rækker, der ikke har en matchende modpart. Her finder vi medarbejdere, som ikke har nogen, der refererer til dem — bladknuder i hierarkiet.

SELECT e.name AS employee
FROM employees e
LEFT JOIN employees sub ON sub.manager_id = e.id
WHERE sub.id IS NULL
ORDER BY e.name;

Optælling af direkte medarbejdere

Ved at forbinde tabellen med sig selv og gruppere efter ledersiden kan du tælle, hvor mange direkte medarbejdere hver leder har. Medarbejdere uden medarbejdere under sig inkluderes via LEFT JOIN.

SELECT
  m.name           AS manager,
  COUNT(e.id)      AS direct_reports
FROM employees m
LEFT JOIN employees e ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;

Brug af CTE'er til at tydeliggøre selvjoins

Når en selvjoin-forespørgsel bliver kompleks, gør det logikken lettere at læse at omslutte den i et fælles tabeludtryk (CTE). Definer ét CTE for hierarkiet, og forespørg derefter tydeligt på det.

WITH hierarchy AS (
  SELECT
    e.id         AS emp_id,
    e.name       AS employee,
    e.salary     AS emp_salary,
    m.name       AS manager,
    m.salary     AS mgr_salary
  FROM employees e
  LEFT JOIN employees m ON e.manager_id = m.id
)
SELECT *
FROM hierarchy
WHERE mgr_salary IS NOT NULL
  AND emp_salary > mgr_salary;

Selvjoin på en ikke-hierarkisk tabel

Selvjoins er ikke begrænset til hierarkier mellem ledere og medarbejdere. Eksemplet nedenfor bruger en products-tabel til at finde alle par af produkter, der tilhører den samme kategori, hvilket er nyttigt til anbefalingsmotorer eller lighedskontroller.

CREATE TABLE products (
  id       INT PRIMARY KEY,
  name     VARCHAR(50),
  category VARCHAR(30)
);

INSERT INTO products VALUES
  (1, 'Laptop',  'Electronics'),
  (2, 'Phone',   'Electronics'),
  (3, 'Tablet',  'Electronics'),
  (4, 'Shirt',   'Clothing'),
  (5, 'Jeans',   'Clothing');

SELECT
  a.name AS product_1,
  b.name AS product_2,
  a.category
FROM products a
JOIN products b
  ON a.category = b.category
 AND a.id < b.id;

Faldgruber: kartesiske produkter og duplikater

To almindelige fejl ved selvjoins er kartesiske produkter (at glemme joinbetingelsen helt) og duplikatpar (at bruge a.id <> b.id i stedet for a.id < b.id).

Kontrollér altid, at din joinbetingelse er korrekt, og brug < i stedet for <>, når du kun har brug for uordnede par og ikke ordnede par.

-- Wrong: returns every ordered pair (A,B) AND (B,A)
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.manager_id
                AND a.id <> b.id;

-- Correct: returns each unordered pair once
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.manager_id
                AND a.id < b.id;

Hurtigt tjek

Test din forståelse af selvjoins og sammenligning af rækker i den samme tabel.

Opsummering af lektionen

I denne lektion lærte du at bruge selvjoins til at sammenligne rækker i den samme tabel.

Vigtigste pointer:

  • Opret alias for tabellen to gange (f.eks. e og m), så databasen behandler dem som separate kilder.
  • Brug INNER JOIN, når du kun har brug for rækker, der har et match, og LEFT JOIN, når du også vil have rækker uden match med.
  • Brug a.id < b.id for at undgå duplikerede par uden fast rækkefølge.
  • Selvjoins fungerer til hierarkier (leder/medarbejder), lighedssøgninger (samme kategori) og alle sammenligninger, hvor to rækker i den samme tabel skal relateres til hinanden.
  • CTE'er kan gøre komplekse forespørgsler med selvjoins meget nemmere at læse og vedligeholde.
Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “Sammenligning af rækker i samme tabel” gratis?

Ja — hele teksten til “Sammenligning af rækker i samme tabel” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Sammenligning af rækker i samme tabel”?

Find par og relationer. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Sammenligning af rækker i samme tabel”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne SQL Academy-lektion?

Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvad er et self join
  2. Medarbejdere og ledere
  3. Sammenligning af rækker i samme tabel
  4. Begrænsninger ved self joins
← Tilbage til SQL Academy