Cursus
Of je het nu leuk vindt of niet, de operator LIKE is essentieel in SQL. Het geeft data scientists en data engineers de mogelijkheid om data te filteren op specifieke tekenreeks-overeenkomsten. In deze tutorial laat ik je zien hoe je LIKE gebruikt voor patroonherkenning, van de basis tot meer geavanceerde technieken.
TL;DR
- De SQL-operator
LIKEgebruikt twee wildcards voor patroonherkenning:%(elk aantal tekens) en_(exact één teken) - Combineer
LIKEmetNOT,LOWER()/UPPER(),OR/ANDenCASE WHENvoor flexibel filteren - Gebruik
ILIKE(PostgreSQL/Redshift) voor case-insensitieve matching, of wikkel kolommen inLOWER() - Voorloop-
%-wildcards (bijv.%pattern) schakelen indexgebruik uit—overweeg full-text search voor grote datasets - SQL Server ondersteunt
[]en[^]voor tekenbereiken; MySQL ondersteuntRLIKEvoor regex-gebaseerde matching
De SQL LIKE-operator voor patroonherkenning
Let op: Wil je alle voorbeeldcode in deze tutorial zelf draaien? Dan kun je een gratis DataLab-werkboek aanmaken met SQL geïnstalleerd en databases met voorbeelddata.
Stel, je hebt een tabel employees en je wilt alle namen vinden die beginnen met ‘A’:
employees | |||||
emp_no | birth_date | first_name | last_name | gender | hire_date |
10001 | 1953-09-02T00:00:00.000Z | Georgi | Facello | M | 1986-06-26T00:00:00.000Z |
10002 | 1964-06-02T00:00:00.000Z | Bezalel | Simmel | F | 1985-11-21T00:00:00.000Z |
10003 | 1959-12-03T00:00:00.000Z | Parto | Bamford | M | 1986-08-28T00:00:00.000Z |
Je zou door de tabel kunnen bladeren. Maar waarom zou je, als je de operator LIKE hebt?
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'A%'De magie zit hier in de clausule `WHERE first_name LIKE ‘A%’`, wat betekent: “vind alle first_name die beginnen met "A" en eindigen met een willekeurig aantal tekens.” De A% hier is een zogeheten patroon voor matching.
De % is niet de enige wildcard die je in combinatie met de operator LIKE kunt gebruiken. Je kunt ook het underscoreteken _ gebruiken:
`%`komt overeen met elk aantal tekens._komt overeen met precies één teken.
De syntaxis is makkelijk te onthouden. Het is simpelweg:
column_name LIKE patternJe kunt LIKE gebruiken om allerlei vormen van patroonherkenning te bereiken. Zo doe je dat:
Beginner SQL LIKE-voorbeelden
Hieronder hebben we wat praktische voorbeelden uiteengezet van hoe je de LIKE-instructie kunt gebruiken en de resultaten uit onze voorbeelddataset.
1. Gebruik LIKE voor een exacte tekenreeks-match
Wil je een exacte tekenreeks-match uitvoeren, gebruik dan LIKE zonder ‘%’ of ‘_’
SELECT
first_name, last_name
FROM employees
WHERE first_name LIKE 'Barry' -- the same as WHERE first_name = ‘Barry’2. Gebruik ‘%’ om elk aantal tekens te matchen
‘%’ kan gebruikt worden om elk (zelfs nul) aantal tekens te matchen – een cijfer, een letter of een symbool.
Stel dat je alle medewerkers wilt vinden van wie de naam begint met ‘Adam’; dan kun je het patroon ‘Adam%’ gebruiken
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'Adam%'Om namen te vinden die eindigen op "z" probeer je het patroon ‘%z’. Je kunt ook meerdere ‘%’ in één patroon gebruiken. Wil je bijvoorbeeld namen vinden die "z" bevatten, gebruik dan ‘%z%’.
3. Gebruik ‘_’ om één (en slechts één) teken te matchen
Net als bij het spel Galgje kan het underscoreteken _ slechts één teken vertegenwoordigen.
Op hoeveel manieren kun je Le_n spellen? Het patroon matcht alles van "Lexn", "LeAn", "Le3n" tot "Le-n".
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'Le_n'Wat zijn de verschillende namen met slechts drie tekens? Dat kunnen we achterhalen met drie opeenvolgende underscores ___ als patroon.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE '___'4. Gebruik zowel ‘%’ als ‘_’ om elk patroon te matchen
Natuurlijk kun je zowel ‘%’ als ‘_’ gebruiken om interessante patronen te maken.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE '%ann_'Het patroon ‘%ann_’ matcht een tekenreeks die begint met een willekeurig aantal tekens en eindigt op "ann" en nog één ander teken.
5. Gebruik NOT om tekenreeksen te vinden die niet aan een patroon voldoen
Wat als je alle rijen wilt vinden die niet aan een specifiek criterium voldoen? Dan kun je de operator NOT LIKE gebruiken. Om bijvoorbeeld alle titels te vinden behalve "Staff", kunnen we de syntaxis gebruiken
`WHERE title NOT LIKE ‘Staff’`Dit is exact gelijk aan de syntaxis
WHERE title != 'Staff'SELECT DISTINCT
title
FROM titles
WHERE title NOT LIKE 'Staff'Natuurlijk kun je NOT LIKE gebruiken met elk van de patronen die we beschreven.
SELECT DISTINCT
title
FROM titles
WHERE title NOT LIKE '%engineer'6. Gebruik LOWER (of UPPER) met LIKE voor case-insensitieve patroonherkenning
Je kunt de volgende syntaxis gebruiken als je patroonherkenning wilt uitvoeren, maar niet zeker weet of de tekenreeks in kleine letters, hoofdletters of gemengd is opgeslagen.
LOWER(column_name) LIKE patternDe functie LOWER() zet alle tekenreeksen om naar kleine letters, ongeacht of ze als hoofd-, kleine of gemengde letters zijn opgeslagen.
Let er bij het gebruik van de syntaxis op dat je het patroon volledig in kleine letters schrijft! Anders krijg je mogelijk geen matches.
Je kunt LOWER in de bovenstaande syntaxis ook vervangen door UPPER. Schrijf het patroon dan in hoofdletters.
`UPPER(column_name) LIKE PATTERN`Wil je bijvoorbeeld weten of de naam van een medewerker "Joanne", "JoAnne", "Joanna" of "JoAnna" is, probeer dan een van de volgende:
SELECT DISTINCT
first_name
FROM employees
WHERE LOWER(first_name) LIKE 'joann_'SELECT DISTINCT
first_name
FROM employees
WHERE UPPER(first_name) LIKE 'JOANN_'7. SQL LIKE met meerdere waarden met OR/AND
Je kunt ook meerdere voorwaarden combineren met de LIKE-syntaxis.
Gebruik bijvoorbeeld de voorwaarde OR om resultaten te vinden die aan minstens één van meerdere LIKE-patronen voldoen.
SELECT DISTINCT
first_name
FROM employees
WHERE
first_name LIKE 'Ad_l' OR
first_name LIKE 'Ad_m'Wil je daarentegen een tekenreeks vinden die aan meerdere LIKE-voorwaarden voldoet, gebruik dan het sleutelwoord AND.
SELECT DISTINCT
first_name
FROM employees
WHERE
first_name LIKE '%am%' AND
first_name LIKE '%me%'De LIKE-syntaxis kan op meerdere kolommen worden toegepast zolang hun variabeletype een tekenreeks met variabele lengte is (varchar). Met die kennis kunnen we de namen vinden van medewerkers met de initialen "Z. Z."
SELECT DISTINCT
first_name, last_name
FROM employees
WHERE
first_name LIKE 'Z%' AND
last_name LIKE 'Z%'8. Gebruik LIKE in de SELECT CASE WHEN-clausule
Tot nu toe hebben we ons gericht op het gebruik van LIKE als voorwaarde om records te selecteren in de WHERE-clausule. We gebruiken LIKE ook in de SELECT-clausule. Kunnen we bijvoorbeeld achterhalen hoeveel medewerkers met de naam "Adam" in onze database staan?
SELECT
COUNT(CASE WHEN first_name LIKE 'Adam' THEN 1 END) num_employees_adam
FROM employeesEn hoeveel medewerkers hebben de initialen "A.Z."?
SELECT
COUNT(CASE WHEN first_name LIKE 'A%' AND last_name LIKE 'Z%' THEN 1 END) num_employees
FROM employeesVeelgebruikte patronen in SQL LIKE
Hier is een samenvatting van de patronen die we hebben besproken als snelle referentie:
| Patroon | Beschrijving | Voorbeeldgebruik |
|---|---|---|
| A% | Matcht tekenreeksen die beginnen met "A" | Namen vinden die beginnen met "A" |
| %z% | Matcht tekenreeksen die "z" bevatten | Namen vinden die "z" bevatten |
| Le_n | Matcht tekenreeksen zoals "Len", "Leon", enz. | Namen vinden met één teken variatie |
| %ann_ | Matcht tekenreeksen die eindigen op "ann" en nog één extra teken | Namen vinden zoals "Joann", "Joanna" |
Gevorderde voorbeelden van SQL LIKE
De functie LIKE is grotendeels vergelijkbaar in verschillende SQL-smaken (bijv. PostgreSQL, MySQL, Redshift, enz.). Sommige hebben echter extra varianten van de LIKE-functie die het vermelden waard zijn.
1. De ILIKE-operator
Beschikbaar in Redshift en PostgreSQL, ILIKE is de case-insensitieve variant van LIKE. Daardoor zijn de volgende allemaal equivalent.
SELECT
datacamp ILIKE ‘datacamp’, -- returns TRUE
DATACAMP ILIKE ‘datacamp’, -- returns TRUE
Datacamp ILIKE ‘datacamp’, -- returns TRUE
datacamp ILIKE ‘DataCamp’, -- returns TRUE2. Vierkante haken [] en [^] gebruiken als wildcard-tekens
Gebruikers van T-SQL of SQL Server hebben extra wildcard-tekens voor complexere patroonherkenning.
De syntaxis met vierkante haken [] matcht elk specifiek teken binnen het bereik of de set. De volgende voorbeelden geven bijvoorbeeld allemaal TRUE terug.
SELECT
‘Carson’ LIKE ‘[C-K]arson’, -- returns TRUE because C is in the range C-K
‘Karson’ LIKE ‘[C-K]arson’, -- returns TRUE because K is in range
‘Larson’ LIKE ‘[CKL]arson’, -- returns TRUE because L is in the set [CKL]
‘Parson’ LIKE ‘[C-K]arson’ -- returns FALSE because P is out of rangeDe dakje-in-vierkante-haak [^] wildcard matcht elk enkel teken dat niet binnen het opgegeven bereik of de set valt. Zie je waarom de volgende resultaten zo zijn?
SELECT
‘Carson’ LIKE ‘[^C-K]arson’ -- returns FALSE
‘Parson’ LIKE ‘[^C-K]arson’ -- returns TRUEHier, omdat "C" binnen het bereik van [C-K] valt, zal het patroon ‘C’ niet overeenkomen met [^C-K]. Dus "Carson" komt niet overeen met [^C-K]arson, maar "Parson" wel.
3. De RLIKE-operator
Beschikbaar in MySQL, de operator RLIKE herkent reguliere expressies (RegEx) in het patroon. RegEx is een krachtig en veelzijdig hulpmiddel voor geavanceerde patroonherkenning.
Het kan geen kwaad om een basisbegrip van RegEx te hebben, vooral als jouw SQL-smaak RLIKE ondersteunt. Je kunt meer leren over RegEx met onze cursus Regular Expressions in Python.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name RLIKE 'Susann[a-e]'4. De ‘~~’-operator
In PostgreSQL is ‘~~’ volledig synoniem aan LIKE. Er zijn ook equivalenten van ILIKE, NOT LIKE en NOT ILIKE.
Operator | Equivalent |
|
|
|
|
|
|
|
|
Probleemoplossing: veelvoorkomende fouten en misstappen met LIKE
Hier zijn wat veelvoorkomende fouten waar je tegenaan kunt lopen bij het gebruik van LIKE, en hoe je ze corrigeert:
- Geen resultaten: Controleer op hoofdlettergevoeligheid. In sommige SQL-dialecten is
LIKEstandaard hoofdlettergevoelig. GebruikLOWER()ofILIKE(indien ondersteund) voor case-insensitieve matching. - Onverwachte resultaten met wildcards: Zorg dat
%en_correct worden gebruikt.%matcht elk aantal tekens, terwijl_exact één teken matcht. Verkeerd plaatsen kan tot onverwachte matches leiden. - Prestatieproblemen: Als je query traag is, let op voorloop-
%in patronen (bijv.%pattern), wat indexgebruik uitschakelt. Herschrijf patronen om waar mogelijk met een specifieke string te beginnen. Zie de sectie hieronder voor meer over performance. - SQL-injectiefouten: Als je gebruikersinvoer in je query gebruikt, zorg dan dat die juist geparametriseerd is om SQL-injectie-kwetsbaarheden te voorkomen.
- Speciale tekens in patronen: Wildcards zoals
%en_in de zoekstring moeten ge-escaped worden als je ze letterlijk bedoelt. GebruikESCAPEin je query om een escape-teken te definiëren.
WHERE column_name LIKE '50\% OFF' ESCAPE '\'Prestatie-overwegingen bij gebruik van de LIKE-operator
De operator LIKE is geweldig, maar kan de query-prestaties beïnvloeden, zeker bij gebruik op grote datasets. Hier zijn enkele aandachtspunten om het gebruik te optimaliseren:
- Indexen: De operator
LIKEpresteert het best als het patroon begint met een constante string, zoalsAdam%, omdat de database indexen kan gebruiken. Patronen als%Adamof%Adam%vereisen echter een volledige tabelscan, wat traag kan zijn voor grote tabellen. - Vermijd voorloop-wildcards: Een patroon starten met
%, zoals%pattern, schakelt indexgebruik uit, omdat de database elk record moet bekijken. - Collation en case-insensitieve matching: Functies zoals
LOWER()ofUPPER()op kolommen gebruiken voor case-insensitieve zoekacties kan ook voorkomen dat indexen worden gebruikt. Stel in plaats daarvan de database-collation passend in voor case-insensitieve vergelijkingen. - Alternatieve benaderingen: Overweeg voor grote datasets full-text search of databasespecifieke zoekfeatures, zoals
GIN-indexen in PostgreSQL ofFULLTEXT-indexen in MySQL, bij complexe of frequente tekenreeks-matching. - Selectieve queries: Beperk de scope van je queries met extra filters, zoals datumbereiken of numerieke kolommen, om de data te verkleinen die door de operator
LIKEwordt verwerkt.
LIKE versus full-text search
Full-text search is beschikbaar in databases zoals MySQL, PostgreSQL en SQL Server. Hoewel LIKE goed werkt voor eenvoudige patroonherkenning, is full-text search gebouwd voor geavanceerdere tekstqueries. Zo verhouden de twee benaderingen zich:
| Functie | LIKE | Full-text search |
|---|---|---|
| Syntaxis | WHERE col LIKE '%term%' | MATCH(col) AGAINST('term') |
| Wildcards | %, _ | Booleaanse operatoren, natuurlijke taal |
| Indexondersteuning | Alleen prefixpatronen (bijv. term%) | Specifieke full-text indexen (GIN, FULLTEXT) |
| Performance op grote tabellen | Traag met voorloop-% | Geoptimaliseerd voor grote tekstkolommen |
| Relevantie-ranking | Nee | Ja |
| Linguïstische features | Nee | Stemming, stopwoorden, synoniemen |
| Het best voor | Exacte patronen, kleine tot middelgrote datasets | Zoeken op trefwoorden, grote tekstkolommen |
Voor meer geavanceerde tekenreeksbewerkingen buiten patroonherkenning, zie de tutorial SQL CONTAINS.
Gebruik SQL LIKE met vertrouwen
SQL-functies beheersen is cruciaal om te slagen in data science, en SQL’s LIKE-commando is daarop geen uitzondering. Een goede beheersing van SQL versnelt je analytische vooruitgang, dus zorg dat je het goed leert!
Voor meer bronnen over SQL, bekijk ook:
FAQs
Kan de operator LIKE worden gebruikt met numerieke datatypen?
Nee, de LIKE-operator wordt specifiek gebruikt voor patroonherkenning met string-datatypen zoals CHAR, VARCHAR en TEXT. Voor numerieke datatypen worden andere vergelijkingsoperatoren gebruikt, zoals =, <, >, enz.
Hoe verhouden de prestaties van LIKE zich tot andere SQL-operatoren?
De LIKE-operator kan minder efficiënt zijn, vooral bij patronen die beginnen met %, omdat dit een volledige tabelscan vereist. Indexering kan in deze gevallen niet effectief worden gebruikt, wat queries op grote datasets kan vertragen.
Zijn er veiligheidsrisico’s bij het gebruik van LIKE in SQL?
Hoewel LIKE op zichzelf niet inherent onveilig is, kan het direct gebruiken van gebruikersinvoer in SQL-queries leiden tot SQL-injectieaanvallen. Saniteer invoer altijd en overweeg geparametriseerde queries om dit risico te beperken.
Hoe ga je om met hoofdlettergevoelige zoekopdrachten in een SQL-smaak die ILIKE niet ondersteunt?
In SQL-smaken zonder ILIKE kun je LOWER(column_name) LIKE LOWER(pattern) of UPPER(column_name) LIKE UPPER(pattern) gebruiken om case-insensitieve zoekopdrachten uit te voeren.
Kan LIKE worden gebruikt met niet-ASCII-tekens?
Ja, LIKE kan worden gebruikt met niet-ASCII-tekens zolang de database-encodering die tekens ondersteunt. Dit omvat UTF-8, dat veel wordt gebruikt om een breed scala aan tekens te ondersteunen.
Hoe zou je een LIKE-query aanpassen om te zoeken naar een letterlijk wildcard-teken (bijv. % of _)?
Om te zoeken naar een letterlijk % of _, moet je een escape-teken gebruiken. In SQL Server kun je bijvoorbeeld LIKE 'A[%]%' ESCAPE '%' gebruiken om te zoeken naar strings die een letterlijk % bevatten.
Kun je LIKE combineren met andere SQL-functies om zoekmogelijkheden te verbeteren?
Ja, het combineren van LIKE met functies zoals CONCAT of SUBSTRING kan helpen om zoekpatronen te verfijnen. Met CONCAT kun je bijvoorbeeld dynamisch patronen opbouwen op basis van andere kolomwaarden.
Hoe kan LIKE worden gebruikt in combinatie met JOIN-operaties?
LIKE kan worden toegepast in JOIN-voorwaarden om patronen te matchen tussen kolommen van verschillende tabellen. Bijvoorbeeld: ON table1.col1 LIKE table2.col2 || '%' kan worden gebruikt om tabellen te joinen waar table1.col1 begint met table2.col2.
Wat zijn alternatieven voor LIKE voor complexe patroonherkenning?
Voor complexere patronen kun je SQL-smaken gebruiken die reguliere expressies ondersteunen, zoals MySQL’s RLIKE of PostgreSQL’s SIMILAR TO. Deze bieden een rijkere syntaxis voor geavanceerde patroonherkenning.
Hoe gaat LIKE om met null-waarden in kolommen?
Wanneer een kolom null-waarden bevat, zal LIKE deze records niet matchen, omdat nulls niet als gelijk aan een string of patroon worden beschouwd. Om nulls op te nemen, gebruik je een voorwaarde zoals OR column IS NULL.
