اکثر اوقات در شرط های نوشته شده در درخواست (query) هایمان روی دیتابیس از شرط های برابری استفاده میکنیم، اما گاهی اوقات نیاز داریم تا به جای برابر بودن یک مقدار، بتوانیم یک الگوی خاص را مورد جستجو قرار دهیم. برای بررسی یک الگوی خاص در کوئری های SQL میتوان از عملگر LIKE استفاده کرد. در این مقاله قصد داریم به بررسی و آموزش این عملگر بپردازیم.
فهرست محتوای آموزش
عملگر LIKE در ساختار SQL
در ساختار کلی یک کوئری SQL بخش هایی داریم که میتوانیم شرط محدود کننده ای برای انتخاب هایمان بیاوریم. مثلاً
- نام مشتری دقیقا “امیرحسین” باشد.
- سفارش در تاریخ 1398-03-07 در سیستم ثبت شده باشد.
- ایمیل ثبت شده کاربر در سیستم name@gmail.com باشد.
- و نمونه های مشابه دیگری که در هنگام جستجو، فیلد مورد نظر را برای مساوی بودن با مقدار داده شده بررسی میکند.
معمولاً اینگونه شرط ها در جلوی عبارت WHERE
آورده میشود. (به جای هر condition
)
WHERE condition1 [[AND / OR] condition2 …];
حال فرض کنید بخواهیم به جای تطابق دقیق عبارت مورد نظر، فیلد مورد نظر را با الگوی خاصی مورد بررسی قرار داده و در صورت تطابق، آن رکورد را انتخاب کنیم.
برای درک مفهوم الگو، سه مثال گفته شده در بالا را به صورت الگو بیان میکنیم.
- نام مشتری با “امیر” شروع شود.
- سفارش در روز هفتم ماه ثبت شده باشد؛ یعنی تاریخ هایی به صورت *-*-07 را مورد بررسی قرار دهیم.
- سرویس دهنده ایمیل کاربر برایمان اهمیتی نداشته باشید و بخواهیم هرگونه ایمیلی مشابه name@* را بررسی کنیم.
الگوی کلی استفاده از LIKE
در پرس و جو های SQL چیزی مشابه زیر است. که این تکه عبارت میتواند به عنوان یک condition در جلوی WHERE
ظاهر شود.
column_name LIKE pattern
در مثال های گفته شده در این مقاله، با دستور SELECT
سر و کار خواهیم داشت. اما همانطور که گفته شد، عملگر LIKE در جلوی عبارت WHERE
آورده میشود و هر کجا بتوانیم WHERE را استفاده کنیم عملگر LIKE نیز قابل استفاده خواهد بود.
چگونگی ایجاد الگو برای عملگر LIKE
الگوی ورودی برای عملگر LIKE
به صورت یک رشته (درون کوتیشن '
) در جلوی آن قرار داده میشود. اما چطور یک رشته را به صورت الگو تعریف کنیم ؟
برای ایجاد رشته الگوی مدِ نظر از دو علامت کلیدی که اغلب با همین اپراتور در ارتباط هستند استفاده میشود.
- علامت
%
: علامت درصد معرف وجود صفر، یک یا تعداد بیشتر حرف به جای خودش است. - علامت
_
: علامت تاکید (یا همان underscore) معرف وجود دقیقاً یک حرف به جای خودش است.
اگر با عبارات منظم (Regular Expressions) آشنایی داشته باشید، علامت %
چیزی معادل *
در یک عبارت منظم و علامت _
معادل علامت ?
در اینگونه عبارات خواهد بود.
اکنون که با علامت های مورد استفاده در رشته الگوی LIKE آشنا شدیم، میتوانیم با ترکیب این علامت ها و حروف و کلمات مورد نظرمان، یک رشته به صورت الگو بسازیم و از آن در پرس و جو های خود استفاده کنیم.
با استفاده از ترکیب حروف ثابت مورد نظر و نیز علامت های ویژه %
و _
میتوان رشته الگوهایی مشابه زیر ساخت و به عنوان الگو در پرس و جوهای نوشته شده قرار داد.
هر الگو با مقدار موجود در ستون مورد نظرمان در رکورد مورد بررسی، تطابق داده شده و نتیجه حاصل خواهد شد.
s%
: هر عبارتی که ابتدای آن s باشد. (عبارت با s شروع شود)%s
: عبارت با s خاتمه یابد.%aa%
: در هر قسمتی از عبارت، دو حرف a کنار هم قرار گرفته است._r%
: دومین حرف در این عبارت می بایست r باشد.a_%_%
: هر عبارتی که با a شروع شده و حداقل دارای دو حرف دیگر غیر از آن (مجموعاً سه حرف) باشد.a_%n
: هر عبارتی که با a شروع شده، بعد از آن حتما یک حرف وجود داشته باشد و با n پایان یابد.
به طور مشابه میتوانید هر گونه الگوی دیگری با طول و پیچیدگی بیشتر تولید کنید.
استفاده از عملگر LIKE در پایگاه داده
خروجی عملگر LIKE
به صورت true یا false بوده و میتوان از آن در هر جایی که نیاز به بررسی و داشتن یک خروجی به صورت boolean داشته باشیم استفاده کرد.
فرض کنید میخواهیم در ستون آدرس مشتریان سیستم خود به دنبال یک الگو بگردیم. در نیتجه یک query با ساختار کلی زیر خواهیم داشت.
SELECT * FROM customers WHERE address LIKE pattern
به جای کلمه pattern رشته الگوی ساخته شده را قرار میدهیم. به مثال های زیر توجه کنید.
1- تمام مشتریانی که آدرس آنها با cityName آغاز میشود.
SELECT * FROM customers WHERE address LIKE 'cityName%'
2- تمام مشتریانی که در آدرسشان کلمه specialName وجود دارد.
SELECT * FROM customers WHERE address LIKE '%specialName%'
استفاده از چند الگو در عملگر LIKE در جستجوی دیتابیس
همانطور که گفته شد، خروجی عملگر LIKE به صورت بولین است، در نتیجه میتوان چندین عملگر LIKE
را برای یک شرط با یکدیگر ترکیب AND یا OR کرد.
3- پیدا کردن تمام مشتریانی که نامشان با sa یا am شروع شده باشد.
SELECT * FROM customers WHERE name LIKE 'sa%' OR name LIKE 'am%'
4- تمام مشتریانی که در نامشان reza وجود داشته و ایمیلشان در سرویس دهنده گوگل (gmail) قرار دارد.
SELECT * FROM customers WHERE name LIKE '%reza%' AND email LIKE '%@gmail.com'
منفی کردن نتیجه عملگر LIKE
میتوانیم به راحتی نتیجه عملگر را برعکس و منفی کرده و از آن استفاده کنیم.
5- مشتریانی که نامشان با a شروع نشده باشد.
SELECT * FROM customers WHERE name NOT LIKE '%a'
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام. در استفاده از این عملگر برای کاراکترهای فارسی مشکل دارم میتونین کمک کنین؟ اعداد و متن انگلیسی مشکلی نداره ولی وقتی عبارت فارسی رو دنبالش میگردم مقدار برگشتی خالیه با اینکه اون الگو در بانک اطلاعاتی وجود داره.
سلام
با فارسی هم مشکلی نداره. عملاً سرچهایی که انجام میدیم هم همینه! نمونه کوئری like رو میفرستید یه چک کنم؟!
سلام مجدد. تشکر از پاسخگویی و همینطور عملکرد سایت که ارسال پاسخ رو ایمیل میکنه. پایگاه داده من sql server هست، یه فیلد داریم از نوع nvarchr(50) ، کوئری رو اینجوری میفرستم:
که چیزی بر نمیگردونه، ولی وقتی میزنم
خروجی داره. طبیعتا نام مدرسه که سین داشته باشه توی پایگاه هست.
خواهش میکنم.
تا حالا این کار رو با فارسی توی sql server انجام ندادم!
اول حس کردم ممکنه collectionـی که برای جدولتون دارید unicode یا بهطور خاصتر utf-8 رو پشتیبانی نکنه. سرچ کردم به نظر گفته شده از نسخه 2019 این مورد پیشفرض فعاله و نوع دیتای nvarchar هم اوکیه. ولی بازم شما یه چک کنید که collection جدولتون utf-8 باشه برای فارسی.
یه موردی دیدم، تست کنید ضرر نداره: قبل شروع رشته یه حرف N قرار بدید یعنی:
سلام مجدد. ممنونم از راهنماییتون. با این کارکتر N مشکل حل شد. امیدوارم تعداد کسایی مثل شما که در انتشار دانششون تنگ نظر نیستن روز به روز بیشتر بشه.
خداروشکر
لطف داری نادر عزیز. خوشحالم که بتونم کمکی به دوستانم در مسیر برنامهنویسی کنم. 🙂
اگر دنبال کلمه ای باشیم که در آن مثلا فقط دو حرف د آماده باشه به چه صورتی هست ؟
پیشنهاد میکنم این مواردی که اجبار به وجود یکسری کاراکترها هست (فقط n کاراکتر یا با ترتیب خاص) رو با regex یا عبارت منظم پیش ببرید. عبارت use regex in sql رو جستجو کنید به نمونههای خوبی میرسید.
اگر بخوام ورودی like رو از خود کاربر بگیره چی؟ مثلا:
SELECT Id, NameFamily, StartWorkDate, EndWorkDate,Year, Ship
FROM Hoghogh
WHERE (StartWorkDate=@StartWorkDate) AND (Ship = @Ship)
توی این مثال میخوام StartWorkDate رو خود کاربر وارد کنه
سلام
مستقیم توی محیط DBMS میخواید از کاربر ورودی بگیرید؟! اگه آره، تا جایی که اطلاع دارم نباید بشه!
اما اگه از یه زبان برنامهنویسی دارید استفاده میکنید، باید در اون زبان از کاربر ورودی بگیرید و بعدش در این کوئری جایگزین کنید.
اگر بخواهیم ۳۵%از دادهای ابتدای جدول را نمایش دهیم کد نویسی به چه صورت است؟؟؟؟؟
مطمئن نیستم که چنین عملگری برای نمایش درصدی از ردیفها داریم یا نه.
اما برای نمایش تعداد مشخصی از دادههای ابتدای جدول میتونید از عملگر LIMIT در انتهای دستور SELECT استفاده کنید؛ مثل LIMIT 3 که سه ردیف اول رو میده.
احتمالاً با بررسی تعداد کل رکوردها، بتونید تعداد 35٪ اونها رو هم محاسبه و استفاده کنید.
عاللیییییییی بودممنون
خوشحالیم که مورد استفادتون قرار گرفته
موفق باشید.