📚 فصل ۱۹ — الگوها و جستجو با LIKE در SQL Server
1️⃣ مقدمه — چرا به LIKE نیاز داریم؟
در برنامههای واقعی، اغلب لازم داریم دادهها را بر اساس الگوها جستجو کنیم، نه یک تطابق کامل.
برای مثال:
- پیدا کردن همه مشتریانی که نامشان با “حمید” شروع میشود.
- یافتن همه محصولاتی که توضیح آنها کلمه “کتاب” را دارد.
- جستجو برای ایمیلهایی که با
@gmail.com
ختم میشوند.
اینجاست که عملگر LIKE وارد میشود.
2️⃣ ساختار پایه LIKE
SELECT ستونها
FROM جدول
WHERE ستون LIKE الگو;
مثال ساده:
SELECT *
FROM Customers
WHERE FullName LIKE N'علی%';
📌 همه نامهایی که با “علی” شروع میشوند.
3️⃣ کاراکترهای ویژه (Wildcards) در LIKE
عملگر LIKE از الگوها استفاده میکند که شامل کاراکترهای ویژه زیر هستند:
کاراکتر | معنی | مثال |
---|---|---|
% | صفر یا چند کاراکتر | %رضا% → وجود کلمه “رضا” در هر جا |
_ | دقیقاً یک کاراکتر | علی_ → “علی” + یک حرف |
[abc] | هر یک از کاراکترها | [abc]تینا → اتینا، بتینا، ستینا |
[a-z] | بازه کاراکترها | [A-C]% → شروع با A یا B یا C |
[^abc] | هر کاراکتری به جز اینها | [^م]حمد → نامهایی که با م شروع نمیشوند |
4️⃣ مثالهای پایه با %
شروع با متن خاص
SELECT *
FROM Customers
WHERE FullName LIKE N'محمد%';
📌 هر اسمی که با “محمد” شروع میشود.
پایان با متن خاص
SELECT *
FROM Customers
WHERE Email LIKE '%@gmail.com';
شامل متن خاص
SELECT *
FROM Products
WHERE Description LIKE N'%کتاب%';
5️⃣ مثالهای پایه با _
دقیقاً یک کاراکتر در جای مورد نظر
SELECT *
FROM Customers
WHERE FullName LIKE N'علی_';
📌 “علیا”، “علیب”، “علیک” ولی نه “علی” یا “علیرضا”.
6️⃣ استفاده از [ ]
برای محدوده کاراکتر
مثال — حروف اول بین الف و د
SELECT *
FROM Students
WHERE FirstName LIKE N'[ا-د]%';
7️⃣ استفاده از [^ ]
برای استثناء
مثال — اولین حرف به جز الف
SELECT *
FROM Students
WHERE FirstName LIKE N'[^ا]%';
8️⃣ حساسیت به حروف بزرگ/کوچک
به صورت پیشفرض، در SQL Server حساسیت به حروف بستگی به Collation دارد.
برای حساس بودن:
SELECT *
FROM Users
WHERE Username LIKE 'Admin' COLLATE SQL_Latin1_General_CP_CS_AS;
9️⃣ ترکیب LIKE با AND و OR
SELECT *
FROM Products
WHERE (Name LIKE N'%کتاب%' OR Name LIKE N'%دفتر%')
AND Price > 50000;
🔟 مثالهای پیشرفته
یافتن شمارهتلفنهای با پیششماره خاص
SELECT *
FROM Customers
WHERE Phone LIKE '0912%';
ایمیلهایی که با حرف الف شروع و gmail دارند
SELECT *
FROM Customers
WHERE Email LIKE N'ا%@gmail.com';
تمام کدهای پستی که رقم سومشان ۵ است
SELECT *
FROM Addresses
WHERE PostalCode LIKE '__5%';
1️⃣1️⃣ استفاده از ESCAPE برای کاراکترهای خاص
اگر بخواهید %
یا _
را به عنوان متن معمولی جستجو کنید، باید از ESCAPE
استفاده کنید.
مثال:
SELECT *
FROM Notes
WHERE Content LIKE '%!%%' ESCAPE '!';
📌 جستجوی متن شامل %
واقعی.
1️⃣2️⃣ کارایی و بهینهسازی LIKE
- اگر الگو با
%
شروع شود (%متن
)، معمولاً ایندکسها بیاثر میشوند. - بهتر است دنبال الگوهایی باشید که ابتدای آن ثابت باشد (
متن%
).
1️⃣3️⃣ سناریوهای واقعی پروژهای
سناریو 1 — جستجوی مشتریان بر اساس بخش نام
کاربر یک کلمه وارد میکند و میخواهیم همه نتایج مشابه را برگردانیم:
DECLARE @Search NVARCHAR(50) = N'رضا';
SELECT *
FROM Customers
WHERE FullName LIKE '%' + @Search + '%';
سناریو 2 — محصولات با کد خاص
SELECT *
FROM Products
WHERE ProductCode LIKE 'PRD[0-9][0-9][0-9]';
سناریو 3 — پیدا کردن کاربران تستی
SELECT *
FROM Users
WHERE Username LIKE N'%test%' OR Email LIKE N'%test%';
1️⃣4️⃣ اشتباهات رایج
- استفاده از LIKE به جای جستجوی دقیق (=) وقتی نیازی نیست.
- گذاشتن
%
در ابتدای الگو که باعث حذف استفاده از ایندکس میشود. - فراموش کردن کاراکتر N قبل از رشتههای یونیکد فارسی.
1️⃣5️⃣ تمرینهای عملی
- نمایش همه مشتریانی که نامشان با “س” شروع میشود.
- همه محصولاتی که توضیحشان شامل کلمه “پلاستیک” است.
- همه ایمیلهایی که دامنهی
@yahoo.com
دارند. - شمارهحسابهایی که رقم آخرشان ۵ است.
- کاربرانی که نامشان شامل “علی” ولی نه “علیرضا” باشد.
1️⃣6️⃣ جمعبندی
در این فصل یاد گرفتید:
- ساختار LIKE و کاراکترهای
%
,_
,[ ]
,[^ ]
- ترکیب LIKE با شرطهای دیگر
- استفاده از ESCAPE برای جستجوی کاراکترهای خاص
- نکات بهینهسازی و اشتباهات رایج
- تمرینها و سناریوهای واقعی