Kurs
İster sevin ister sevmeyin, LIKE operatörü SQL’de vazgeçilmezdir. Veri bilimcilerine ve veri mühendislerine belirli dize eşleşmeleri üzerinde verileri filtreleme gücü verir. Bu eğitimde, desen eşleştirme için LIKE kullanımını temelden ileri tekniklere kadar adım adım göstereceğim.
Özet
- SQL
LIKEoperatörü desen eşleştirme için iki wildcard kullanır:%(herhangi bir sayıda karakter) ve_(tam olarak bir karakter) - Esnek filtreleme için
LIKE'ıNOT,LOWER()/UPPER(),OR/ANDveCASE WHENile birleştirin - Büyük/küçük harf duyarsız eşleştirme için
ILIKE(PostgreSQL/Redshift) kullanın veya sütunlarıLOWER()ile sarın - Baştaki
%wildcard’ları (örn.,%pattern) indeks kullanımını devre dışı bırakır—büyük veri kümeleri için tam metin aramayı düşünün - SQL Server, karakter aralıkları için
[]ve[^]destekler; MySQL, regex tabanlı eşleştirme içinRLIKEdestekler
Desen Eşleştirme için SQL LIKE Operatörü
Not: Bu eğitimdeki tüm örnek kodları kendiniz çalıştırmak için, SQL kurulu ve örnek veritabanları bulunan ücretsiz bir DataLab çalışma kitabı oluşturabilirsiniz.
Bir employees tablonuz olduğunu ve ‘A’ ile başlayan tüm isimleri bulmak istediğinizi varsayalım:
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 |
Tabloyu elle taramak için vakit harcayabilirsiniz. Ama elinizde LIKE operatörü varken neden bunu yapasınız?
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'A%'Buradaki sihir, “`WHERE first_name LIKE ‘A%’`” ifadesindedir; bu, “first_name değeri "A" ile başlayan ve ardından herhangi bir sayıda karakter gelen tüm kayıtları bul” anlamına gelir. Buradaki A% desen olarak bilinir.
%, LIKE operatörüyle birlikte kullanabileceğiniz tek wildcard değildir. Alt çizgi _ işaretini de kullanabilirsiniz:
`%`herhangi bir sayıda karakterle eşleşir._tam olarak bir karakterle eşleşir.
Sözdizimi akılda kalıcıdır. Basitçe şöyledir:
column_name LIKE patternLIKE ile çeşitli desen eşleştirmeleri yapabilirsiniz. İşte nasıl:
Başlangıç Düzeyi SQL LIKE Örnekleri
Aşağıda, LIKE ifadesini nasıl kullanabileceğinize dair bazı pratik örnekler ve örnek veri setimizden alınan sonuçlar yer alıyor.
1. Tam dize eşleşmesi için LIKE kullanın
Tam bir dize eşleşmesi yapmak istiyorsanız, ‘%’ veya ‘_’ olmadan LIKE kullanın
SELECT
first_name, last_name
FROM employees
WHERE first_name LIKE 'Barry' -- the same as WHERE first_name = ‘Barry’2. Herhangi bir sayıda karakteri eşleştirmek için ‘%’ kullanın
‘%’, herhangi bir (sıfır dahil) sayıda karakteri eşleştirmek için kullanılabilir – bir rakam, bir harf ya da bir sembol.
Diyelim ki adı ‘Adam’ ile başlayan tüm çalışanları bulmak istiyorsunuz; ‘Adam%’ desenini kullanabilirsiniz
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'Adam%'"z" ile biten isimleri bulmak için ‘%z’ desenini deneyin. Tek bir desende birden fazla ‘%’ da kullanabilirsiniz. Örneğin, içinde "z" geçen isimleri bulmak için ‘%z%’ kullanın.
3. Tek (ve yalnızca bir) karakteri eşleştirmek için ‘_’ kullanın
Adam asmaca oyunundaki gibi, alt çizgi _ yalnızca bir karakteri karşılar.
Le_n kaç farklı şekilde yazılabilir? Bu desen "Lexn", "LeAn", "Le3n" veya "Le-n" gibi her şeyi eşleştirir.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'Le_n'Yalnızca üç karakterden oluşan farklı isimler neler? Desen olarak üç ardışık alt çizgi ___ kullanarak bulabiliriz.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE '___'4. Herhangi bir deseni eşleştirmek için hem ‘%’ hem ‘_’ kullanın
Elbette, ilginç desenler oluşturmak için hem ‘%’ hem de ‘_’ kullanabilirsiniz.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE '%ann_'‘%ann’ deseni, herhangi bir sayıda karakterle başlayıp "ann" ve bir başka karakter ile biten bir dizeyle eşleşir.
5. Bir desenle eşleşmeyen dizeleri bulmak için NOT kullanın
Belirli bir kritere uymayan tüm satırları bulmak isterseniz ne olur? NOT LIKE operatörünü kullanabilirsiniz. Örneğin, "Staff" haricindeki tüm unvanları bulmak için şu sözdizimini kullanabiliriz
`WHERE title NOT LIKE ‘Staff’`Bu, aşağıdaki sözdizimiyle tamamen eşdeğerdir
WHERE title != 'Staff'SELECT DISTINCT
title
FROM titles
WHERE title NOT LIKE 'Staff'Elbette, NOT LIKE'ı anlattığımız desenlerin herhangi biriyle kullanabilirsiniz.
SELECT DISTINCT
title
FROM titles
WHERE title NOT LIKE '%engineer'6. Büyük/küçük harf duyarsız desen eşleştirme için LOWER (veya UPPER) ile LIKE kullanın
Desen eşleştirme yapmanız gerekiyor ama dizenin küçük, büyük ya da karma harflerle depolanıp depolanmadığından emin değilseniz aşağıdaki sözdizimini kullanabilirsiniz.
LOWER(column_name) LIKE patternLOWER() fonksiyonu, büyük, küçük ya da karma harflerle depolanmış olsalar da tüm dizeleri küçük harfe çevirir.
Bu sözdizimini kullanırken deseni tamamen küçük harfle yazdığınızdan emin olun! Aksi halde eşleşme alamayabilirsiniz.
Yukarıdaki sözdiziminde LOWER yerine UPPER da kullanabilirsiniz. Deseni büyük harflerle yazdığınızdan emin olun.
`UPPER(column_name) LIKE PATTERN`Örneğin, bir çalışanın adının "Joanne", "JoAnne", "Joanna" veya "JoAnna" olup olmadığını bulmak için aşağıdakilerden birini deneyin:
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. OR/AND kullanarak birden çok değerle SQL LIKE
LIKE sözdizimini kullanarak birden çok koşulu da birleştirebilirsiniz.
Örneğin, birden çok LIKE deseninden en az birini sağlayan sonuçları bulmak için OR koşulunu kullanın.
SELECT DISTINCT
first_name
FROM employees
WHERE
first_name LIKE 'Ad_l' OR
first_name LIKE 'Ad_m'Öte yandan, birden çok LIKE koşuluyla eşleşen bir dize bulmak için AND anahtar sözcüğünü kullanın.
SELECT DISTINCT
first_name
FROM employees
WHERE
first_name LIKE '%am%' AND
first_name LIKE '%me%'LIKE sözdizimi, değişken uzunluklu karakter (varchar) türünde oldukları sürece birden fazla sütuna uygulanabilir. Bunu bilerek baş harfleri "Z. Z." olan çalışanların isimlerini bulabiliriz
SELECT DISTINCT
first_name, last_name
FROM employees
WHERE
first_name LIKE 'Z%' AND
last_name LIKE 'Z%'8. SELECT CASE WHEN içinde LIKE kullanın
Şu ana kadar LIKE'ı WHERE koşulu içinde kayıt seçmek için bir koşul olarak kullanmaya odaklandık. LIKE'ı SELECT ifadesinde de kullanıyoruz. Örneğin, veritabanımızda adı "Adam" olan kaç çalışan olduğunu bulabilir miyiz?
SELECT
COUNT(CASE WHEN first_name LIKE 'Adam' THEN 1 END) num_employees_adam
FROM employeesÖte yandan, baş harfleri "A.Z." olan kaç çalışan var?
SELECT
COUNT(CASE WHEN first_name LIKE 'A%' AND last_name LIKE 'Z%' THEN 1 END) num_employees
FROM employeesSQL LIKE’ta yaygın kullanılan desenler
Hızlı başvuru için konuştuğumuz desenlerin özeti burada:
| Desen | Açıklama | Örnek kullanım durumu |
|---|---|---|
| A% | "A" ile başlayan dizelerle eşleşir | "A" ile başlayan isimleri bulma |
| %z% | İçinde "z" geçen dizelerle eşleşir | İçinde "z" geçen isimleri bulma |
| Le_n | "Len", "Leon" vb. gibi dizelerle eşleşir | Tek karakter varyasyonu olan isimleri bulma |
| %ann_ | "ann" ile bitip ardından bir karakter gelen dizelerle eşleşir | "Joann", "Joanna" gibi isimleri bulma |
Orta Düzey SQL LIKE Örnekleri
LIKE işlevi, farklı SQL türlerinde (örn. PostgreSQL, MySQL, Redshift, vb.) büyük ölçüde benzerdir. Ancak bazıları, bahsetmeye değer ek LIKE varyasyonlarına sahiptir.
1. ILIKE operatörü
Redshift ve PostgreSQL’de mevcut olan ILIKE, LIKE'ın büyük/küçük harf duyarsız sürümüdür. Bu nedenle aşağıdakilerin tümü eşdeğerdir.
SELECT
datacamp ILIKE ‘datacamp’, -- returns TRUE
DATACAMP ILIKE ‘datacamp’, -- returns TRUE
Datacamp ILIKE ‘datacamp’, -- returns TRUE
datacamp ILIKE ‘DataCamp’, -- returns TRUE2. Wildcard olarak köşeli parantez [] ve [^] kullanımı
T-SQL veya SQL Server kullanıcıları, daha karmaşık desen eşleştirme için ek wildcard karakterlerine sahiptir.
Köşeli parantez sözdizimi [], aralık veya küme içindeki belirli herhangi bir karakterle eşleşir. Örneğin, aşağıdakilerin tümü TRUE döndürür.
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 rangeKöşeli parantez içindeki şapka [^] wildcard’ı, belirtilen aralık veya küme içinde olmayan herhangi bir tek karakterle eşleşir. Aşağıdaki sonuçların neden böyle olduğuna bakabilir misiniz?
SELECT
‘Carson’ LIKE ‘[^C-K]arson’ -- returns FALSE
‘Parson’ LIKE ‘[^C-K]arson’ -- returns TRUEBurada, "C" [C-K] aralığında olduğundan, ‘C’ deseni [^C-K] ile eşleşmeyecektir. Bu nedenle "Carson" [^C-K]arson ile eşleşmezken, "Parson" eşleşir.
3. RLIKE operatörü
MySQL’de mevcut olan RLIKE operatörü, desende düzenli ifadeleri (RegEx) tanır. RegEx, ileri düzey desen eşleştirme için güçlü ve esnek bir araçtır.
Özellikle SQL türünüz RLIKE destekliyorsa RegEx’i temel düzeyde bilmek faydalıdır. RegEx hakkında daha fazla bilgiyi Python’da Düzenli İfadeler kursumuzda edinebilirsiniz.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name RLIKE 'Susann[a-e]'4. ‘~~’ operatörü
PostgreSQL’de ‘~~’, LIKE ile tamamen eşanlamlıdır. ILIKE, NOT LIKE ve NOT ILIKE için de karşılıkları vardır.
Operatör | Eşdeğeri |
|
|
|
|
|
|
|
|
Hata Ayıklama: LIKE ile Sık Yapılan Hatalar
LIKE kullanırken karşılaşabileceğiniz bazı yaygın hatalar ve bunları düzeltme yolları şunlardır:
- Sonuç dönmemesi: Büyük/küçük harf duyarlılığını kontrol edin. Bazı SQL lehçelerinde
LIKEvarsayılan olarak büyük/küçük harf duyarlıdır. Büyük/küçük harf duyarsız eşleşme içinLOWER()veya (destekleniyorsa)ILIKEkullanın. - Wildcard’larla beklenmeyen sonuçlar:
%ve_doğru kullanıldığından emin olun.%herhangi bir sayıda karakterle,_ise tam olarak bir karakterle eşleşir. Bunların yanlış konumlandırılması beklenmedik eşleşmelere yol açabilir. - Performans sorunları: Sorgunuz yavaşsa, desenlerdeki baştaki
%kullanımına bakın (örn.,%pattern); bu, indeks kullanımını devre dışı bırakır. Mümkünse desenleri belirli bir dizeyle başlayacak şekilde yeniden yazın. Performansla ilgili daha fazlası için aşağıdaki bölüme bakın. - SQL enjeksiyonu hataları: Sorgunuzda kullanıcı girdisi kullanıyorsanız, SQL enjeksiyonu açıklarını önlemek için girdilerin doğru şekilde parametreleştirildiğinden emin olun.
- Desenlerde özel karakterler: Arama dizgesindeki
%ve_gibi wildcard sembolleri, gerçek karakter olarak kastediliyorsa kaçış karakteriyle kaçırılmalıdır. Sorgunuzda bir kaçış karakteri tanımlamak içinESCAPEkullanın.
WHERE column_name LIKE '50\% OFF' ESCAPE '\'LIKE Operatörünü Kullanırken Performans Hususları
LIKE operatörü harikadır, ancak özellikle büyük veri kümelerinde sorgu performansını etkileyebilir. Kullanımı optimize etmek için bazı hususlar:
- İndeksler: Desen
Adam%gibi sabit bir dizeyle başlıyorsa veritabanı indeksleri kullanabildiği içinLIKEen iyi performansı verir. Ancak%Adamveya%Adam%gibi desenler, büyük tablolar için yavaş olabilen tam tablo taraması gerektirir. - Baştaki wildcard’lardan kaçının:
%patterngibi%ile başlayan desenler indeks kullanımını devre dışı bırakır; veritabanı her kaydı incelemek zorunda kalır. - Sıralama (collation) ve büyük/küçük harf duyarsız eşleşme: Büyük/küçük harf duyarsız aramalar için sütunlarda
LOWER()veyaUPPER()gibi işlevlerin kullanılması, indekslerin kullanılmasını da engelleyebilir. Bunun yerine, veritabanı sıralamasının büyük/küçük harf duyarsız karşılaştırmalar için uygun şekilde ayarlandığından emin olun. - Alternatif yaklaşımlar: Büyük veri kümeleri için, karmaşık veya sık dize eşleştirmelerinde PostgreSQL’de
GINindeksleri veya MySQL’deFULLTEXTindeksleri gibi tam metin arama ya da veritabanına özgü arama özelliklerini düşünün. - Seçici sorgular: LIKE operatörünün işlediği veriyi azaltmak için tarih aralıkları veya sayısal sütunlar gibi ek filtrelerle sorgularınızın kapsamını sınırlayın.
LIKE ve Tam Metin Arama
Tam metin arama, MySQL, PostgreSQL ve SQL Server gibi veritabanlarında mevcuttur. LIKE basit desen eşleştirmede iyi çalışırken, tam metin arama daha gelişmiş metin sorguları için tasarlanmıştır. İki yaklaşım şöyle karşılaştırılır:
| Özellik | LIKE | Tam Metin Arama |
|---|---|---|
| Sözdizimi | WHERE col LIKE '%term%' | MATCH(col) AGAINST('term') |
| Wildcard’lar | %, _ | Boole operatörleri, doğal dil |
| İndeks desteği | Yalnızca önek desenleri (örn., term%) | Adanmış tam metin indeksleri (GIN, FULLTEXT) |
| Büyük tablolarda performans | Baştaki % ile yavaş | Büyük metin sütunları için optimize |
| Alaka sıralaması | Yok | Var |
| Dilsel özellikler | Yok | Kök bulma, durak sözcükler, eşanlamlılar |
| En uygun olduğu durum | Kesin desenler, küçük ve orta ölçekli veri kümeleri | Anahtar sözcük araması, büyük metin sütunları |
Desen eşleştirmenin ötesindeki daha gelişmiş dize işlemleri için SQL CONTAINS eğitimine bakın.
SQL LIKE’ı Güvenle Kullanın
SQL işlevlerinde ustalaşmak, veri biliminde başarı için kritik önemdedir ve SQL’in LIKE komutu da bunun istisnası değildir. SQL’e iyi hakim olmak analiz çalışmalarınızı hızlandıracaktır; bu nedenle onu sağlam şekilde öğrenmeye özen gösterin!
SQL ile ilgili daha fazla kaynak için aşağıdakilere göz atın:
SSS
LIKE operatörü sayısal veri tipleriyle kullanılabilir mi?
Hayır, LIKE operatörü, özellikle CHAR, VARCHAR ve TEXT gibi dize veri tipleriyle desen eşleştirme amacıyla kullanılır. Sayısal veri tipleri için =, <, > vb. karşılaştırma operatörleri kullanılır.
LIKE’ın performansı diğer SQL operatörleriyle karşılaştırıldığında nasıldır?
Özellikle % ile başlayan desenlerde tüm tablo taraması gerektirdiğinden, LIKE operatörü diğer SQL operatörlerine kıyasla daha az verimli olabilir. Bu durumlarda indeksleme etkili şekilde kullanılamaz ve bu da büyük veri kümelerinde sorguları yavaşlatabilir.
SQL’de LIKE kullanırken güvenlikle ilgili endişeler var mı?
LIKE tek başına doğası gereği güvensiz değildir; ancak kullanıcı girdilerini doğrudan SQL sorgularında kullanmak SQL enjeksiyonu saldırılarına yol açabilir. Girdileri her zaman temizleyin ve bu riski azaltmak için parametreli sorgular kullanmayı değerlendirin.
ILIKE’ı desteklemeyen bir SQL türünde büyük/küçük harf duyarsız aramalar nasıl yapılır?
ILIKE desteklenmeyen SQL türlerinde, büyük/küçük harf duyarsız aramalar yapmak için LOWER(column_name) LIKE LOWER(pattern) veya UPPER(column_name) LIKE UPPER(pattern) kullanabilirsiniz.
LIKE, ASCII dışı karakterlerle kullanılabilir mi?
Evet, LIKE, veritabanı kodlaması bu karakterleri desteklediği sürece ASCII dışı karakterlerle kullanılabilir. Buna yaygın olarak geniş karakter kümesini destekleyen UTF-8 de dahildir.
Gerçek bir wildcard karakterini (ör. % veya _) aramak için LIKE sorgusunu nasıl değiştirirsiniz?
Gerçek bir % veya _ aramak için bir kaçış karakteri kullanmanız gerekir. Örneğin, SQL Server’da, gerçek bir % içeren dizeleri aramak için LIKE 'A[%]%' ESCAPE '%' kullanabilirsiniz.
LIKE’ı arama yeteneklerini artırmak için diğer SQL işlevleriyle birleştirebilir misiniz?
Evet, LIKE’ı CONCAT veya SUBSTRING gibi işlevlerle birleştirmek arama desenlerini iyileştirmeye yardımcı olabilir. Örneğin, CONCAT kullanmak, diğer sütun değerlerine dayalı desenleri dinamik olarak oluşturabilir.
LIKE, JOIN işlemleriyle birlikte nasıl kullanılabilir?
LIKE, farklı tabloların sütunları arasında desenleri eşleştirmek için JOIN koşullarında uygulanabilir. Örneğin, ON table1.col1 LIKE table2.col2 || '%', table1.col1’in table2.col2 ile başladığı durumlarda tabloları birleştirmek için kullanılabilir.
Karmaşık desen eşleştirme için LIKE’a alternatifler nelerdir?
Daha karmaşık desenler için, MySQL’in RLIKE’ı veya PostgreSQL’in SIMILAR TO gibi düzenli ifadeleri destekleyen SQL türleri kullanılabilir. Bunlar gelişmiş desen eşleştirme için daha zengin bir sözdizimi sunar.
LIKE, sütunlardaki null değerleri nasıl ele alır?
Bir sütun null değerler içerdiğinde, LIKE bu kayıtlarla eşleşmez; çünkü null, herhangi bir dizeye veya desene eşit kabul edilmez. Null değerleri dahil etmek için OR column IS NULL gibi bir koşul kullanın.