Sammenligning af rækker i samme tabel
Find par og relationer.
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.
eogm), så databasen behandler dem som separate kilder. - Brug
INNER JOIN, når du kun har brug for rækker, der har et match, ogLEFT JOIN, når du også vil have rækker uden match med. - Brug
a.id < b.idfor 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.
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
- Hvad er et self join
- Medarbejdere og ledere
- Sammenligning af rækker i samme tabel
- Begrænsninger ved self joins