BETWEEN, IN och inkluderande gränser
Lär dig hantera gränsfall och hur BETWEEN behandlar ändpunkter
BETWEEN, IN och inkluderande gränser är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Varför gränsvärden kostar poäng i intervjun
Intervall- och mängdefilter ser triviala ut, så intervjuare använder kantfallen som fällor. BETWEEN inkluderar båda ändpunkterna, IN döljer en subtil NULL-fälla och datumintervall är där off-by-one-fel i tysthet förvränger rapporter.
Den här lektionen går igenom exakt hur BETWEEN behandlar sina ändpunkter, när IN är tydligare än kedjade OR-villkor och det halvöppna intervallmönster som yrkesverksamma använder för datum.
BETWEEN inkluderar båda ändpunkterna
col BETWEEN a AND b är en kortform för col >= a AND col <= b. Båda ändpunkterna ingår.
price BETWEEN 10 AND 20 returnerar alltså rader där priset är exakt 10 eller exakt 20, liksom alla värden däremellan. Det vanligaste felaktiga svaret i intervjuer är att hävda att den övre gränsen inte ingår.
SELECT *
FROM products
WHERE price BETWEEN 10 AND 20;
-- equivalent to: price >= 10 AND price <= 20Argumentens ordning spelar roll
BETWEEN kräver det lägre värdet först. col BETWEEN 20 AND 10 expanderas till col >= 20 AND col <= 10, vilket aldrig kan vara sant. Därför returneras noll rader i stället för ett fel.
Det här är en vanlig fälla: frågan körs utan problem, returnerar ingenting och kandidaten antar att datan är tom. Placera alltid den mindre gränsen först.
SELECT *
FROM products
WHERE price BETWEEN 20 AND 10;
-- returns NOTHING, not an errorDatumintervallets off-by-one-fel
Om man ber om hela januari skriver många kandidater order_date BETWEEN '2024-01-01' AND '2024-01-31'. Om order_date är en tidsstämpel försvinner allt efter midnatt den 31:a, eftersom 2024-01-31 betyder 2024-01-31 00:00:00.
En order klockan 14 den 31 januari utesluts. Med rena DATE-kolumner fungerar det, men du kan inte förutsätta datatypen.
SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
-- silently excludes Jan 31 afternoon if order_date is a timestampLösningen med halvöppet intervall
Det professionella mönstret för datum är ett halvöppet intervall: större än eller lika med startvärdet och strikt mindre än nästa period. Det är korrekt för både DATE och TIMESTAMP och kräver ingen kunskap om kolumnens tidsupplösning.
Observera att den övre gränsen är den första dagen i februari, inte den sista dagen i januari. På så sätt fångas varje tidpunkt i januari.
SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
AND order_date < '2024-02-01';NOT BETWEEN
col NOT BETWEEN a AND b expanderas till col < a OR col > b. Det utesluter båda ändpunkterna och allt däremellan.
Var uppmärksam på att NOT BETWEEN utvärderas till UNKNOWN om col är NULL, så NULL-rader utesluts precis som med vanligt BETWEEN. NULL-värden uppfyller aldrig ett intervalltest åt något håll.
SELECT *
FROM products
WHERE price NOT BETWEEN 10 AND 20;
-- price < 10 OR price > 20IN för mängdmedlemskap
col IN (a, b, c) är en kortform för col = a OR col = b OR col = c. Det är det tydliga sättet att testa om ett värde tillhör en liten, fast mängd.
Det är mer lättläst än en kedja av OR-villkor och eliminerar helt problemet med parenteser kring operatorprioriteten, eftersom hela mängdtestet är ett enda predikat.
SELECT *
FROM orders
WHERE status IN ('pending', 'shipped', 'delivered');Fällan med NOT IN och NULL
Det här är den mest fruktade IN-frågan. Om listan eller underfrågan bakom NOT IN innehåller ett enda NULL-värde kan hela predikatet utvärderas till UNKNOWN och returnera noll rader.
Orsaken är att x NOT IN (1, NULL) blir x <> 1 AND x <> NULL, och x <> NULL är aldrig sant utan blir UNKNOWN. Hela AND-villkoret kan därför aldrig vara sant.
SELECT *
FROM employees
WHERE manager_id NOT IN (SELECT id FROM managers);
-- returns NOTHING if any managers.id is NULLSå åtgärdar du NOT IN
Två robusta lösningar på NOT IN-fällan med NULL:
- Filtrera bort NULL-värden från underfrågan med
WHERE id IS NOT NULL - Ännu bättre: skriv om den som
NOT EXISTS, som hanterar NULL korrekt genom sin konstruktion
Intervjuare betraktar NOT EXISTS som svaret på seniornivå, eftersom det kringgår fällan helt och ofta ger en bättre exekveringsplan.
SELECT e.*
FROM employees e
WHERE NOT EXISTS (
SELECT 1 FROM managers m WHERE m.id = e.manager_id
);IN med en underfråga
IN accepterar en underfråga som returnerar en kolumn. WHERE customer_id IN (SELECT customer_id FROM vip) behåller rader där kunden ingår i VIP-mängden.
Vanligt IN, till skillnad från NOT IN, är säkert när underfrågan innehåller NULL: ett NULL-värde i listan matchar helt enkelt aldrig, men påverkar inte de rader som faktiskt matchar. Fällan gäller specifikt NOT IN.
SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM vip_customers);IN på flera kolumner med radkonstruktorer
En vanlig följdfråga är: hur matchar ni på fler än en kolumn samtidigt? Skicka en tupel till IN med hjälp av en radkonstruktor — den jämför kolumnerna positionsvis och är mycket renare än att kedja ihop OR (a = .. AND b = ..).
- Det blir lättläst och fungerar bra även med långa listor över tillåtna värden.
- Varje tupel måste ange kolumnerna i samma ordning.
SELECT *
FROM orders
WHERE (customer_id, status) IN ((101, 'paid'), (102, 'shipped'));Snabbkontroll
Kom ihåg hur BETWEEN behandlar sina ändpunkter.
Sammanfattning
Viktiga slutsatser:
BETWEEN a AND binkluderar båda ändpunkterna; den nedre gränsen måste komma först, annars får du noll rader- Använd ett halvöppet intervall för tidsstämpelintervall:
>= start AND < next_period INger tydligt mängdmedlemskap och är säkert med NULL-värdenNOT INmed ett endaNULLi listan returnerar ingenting; skriv om det somNOT EXISTS
Det återkommande temat är att ett filter kan köras utan problem och ändå i tysthet returnera fel rader.
Lär dig SQL med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”BETWEEN, IN och inkluderande gränser” gratis?
Ja – hela texten till ”BETWEEN, IN och inkluderande gränser” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Vad lär jag mig i ”BETWEEN, IN och inkluderande gränser”?
Lär dig hantera gränsfall och hur BETWEEN behandlar ändpunkter Ni övar på Förberedelser inför SQL-intervjun med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelser inför SQL-intervjun?
Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”BETWEEN, IN och inkluderande gränser”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelser inför SQL-intervjun-lektionen?
Ja. Varje Förberedelser inför SQL-intervjun-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- AND/OR-prioritet och parenteser
- BETWEEN, IN och inkluderande gränser
- LIKE, jokertecken och escape
- Filtrera på beräknade värden