بررسی کامل مبحث wildcard ها

11 اسفند 1397
درسنامه درس 12 از سری آموزش زبان SQL
sql-language-wildcards

با سلام خدمت شما همراهان همیشگی روکسو، در جلسه ی قبل با مفهوم کلی wildcard ها آشنا شدیم و ترکیب آن ها را با اپراتور LIKE بررسی کردیم. در این قسمت قصد داریم مبحث wildcard ها را باز کنیم و به صورت مفصل مورد بررسی قرار دهیم اما ابتدا یادآوری کوتاهی از جلسه ی قبل داریم.

مفهوم wildcard

به نظر شما Wildcard چیست؟ به زبان ساده بگویم، wildcard ها معمولا کاراکتر هایی هستند که به جای یک یا چند کاراکتر دیگر قرار می گیرند.

مثلا در ویندوز هنگامی که نام یک فایل را جست و جو می کنید می توانید از کاراکتر * استفاده کنید که به جای هر کاراکتر دیگری قرار می گیرد. مثلا اگر بگوییم ttf.* یعنی فایل هایی که پسوند ttf دارند و نامشان مهم نیست. اگر بگوییم A*.ttf یعنی تمام فایل هایی که نامشان با حرف A شروع می شود و پسوند ttf دارند (مثل: A.ttf یا AA.ttf یا Ahugjf.ttf یا A547Uh.ttf و الی آخر). در قسمت بعد بیشتر با Wildcard ها آشنا می شویم.

این ویندوز بود اما در مورد SQL چطور؟ wildcard ها با اپراتور LIKE استفاده می شوند. سپس اپراتور LIKE را در یک عبارت WHERE استفاده می کنیم تا الگوی خاصی را دنبال کنیم. در مثال بالا تمام نام هایی که ذکر شد مانند AA.ttf و A.ttf و ... دارای الگوی خاصی هستند. الگوی آن ها این است که با حرف A شروع می شوند و دارای پسوند ttf هستند. همین کار ها را می توان با پایگاه داده انجام داد. به جدول های زیر توجه کنید:

wildcard های مخصوص MS Access

نماد توضیحات مثال
* نماینده ی تعداد صفر کاراکتر یا بیشتر  *bl عبارات bl ،black ،blue و blob را پیدا می کند.
? نماینده ی یک کاراکتر (هر کاراکتری باشد) h?t عبارات hat ،hot و hit را پیدا می کند.
[] نماینده ی یکی از کاراکتر های داخل براکت h[oa]t عبارات hat ،hot را پیدا می کند اما hit را نه
! نماینده ی هر کاراکتری که داخل براکت نباشد1 h[!oa]t عبارت hit را پیدا می کند اما hot و hat را نه
- نماینده ی محدوده ای از کاراکتر ها c[a-b]t عبارات cat و cbt را پیدا می کند2
# نماینده ی یک کاراکتر عددی 2#5 اعداد 205 و 215 و 225 و ... را پیدا می کند.

1- در زبان های برنامه نویسی علامت ! معمولا شرط را برعکس می کند و معنی NOT می دهد. بنابراین برعکس h[oa]t می شود h[!oa]t که یعنی تمام کاراکتر ها به جز o و a.

2- محدوده ای (range) از کاراکتر ها: وقتی می گوییم [a-b] یعنی تمام کاراکتر هایی که بین a و b قرار دارند که شامل خود a و b نیز می شوند. اگر بگوییم [c-h] یعنی از کاراکتر c الی کاراکتر h (بر اساس ترتیب حروف در الفبای انگلیسی) که می شود کاراکتر های c d e f g h.

wildcard های مخصوص SQL Server

نماد توضیحات مثال
% نماینده ی تعداد صفر کاراکتر یا بیشتر %bl عبارات bl ،black ،blue و blob را پیدا می کند.
_ نماینده ی یک کاراکتر (هر کاراکتری باشد) h_t عبارات hat ،hot و hit را پیدا می کند.
[] نماینده ی یکی از کاراکتر های داخل براکت h[oa]t عبارات hat ،hot را پیدا می کند اما hit را نه
^ نماینده ی هر کاراکتری که داخل براکت نباشد h[^oa]t عبارت hit را پیدا می کند اما hot و hat را نه
- نماینده ی محدوده ای از کاراکتر ها c[a-b]t عبارات cat و cbt را پیدا می کند

نکته: شما می توانید wildcard ها را با هم ترکیب کنید. به مثال های زیر دقت کنید:

اپراتور LIKE توضیحات - چه چیزی را پیدا می کند؟
WHERE CustomerName LIKE 'a%' هر مقداری که با حرف a شروع شود.
WHERE CustomerName LIKE '%a' هر مقداری که با حرف a تمام شود.
WHERE CustomerName LIKE '%or%' هر مقداری که رشته ی  "or" را در خود داشته باشد (در هر جایش).
WHERE CustomerName LIKE '_r%' هر مقداری که حرف r را به عنوان کاراکتر دوم خود داشته باشد.
WHERE CustomerName LIKE 'a_%_%' هر مقداری که حداقل 3 کاراکتر داشته و با حرف a شروع شود.
WHERE ContactName LIKE 'a%o' هر مقداری که با a شروع شود و با o تمام شود.

قبل از بررسی مثال ها باید به جدول Customers نگاهی بیندازیم:

Country PostalCode City Address ContactName CustomerName CustomerID
Germany 12209 Berlin Obere Str. 57 Maria Anders Alfreds Futterkiste 1
Mexico 05021 México D.F. Avda. de la Constitución 2222 Ana Trujillo Ana Trujillo Emparedados y helados 2
Mexico 05023 México D.F. Mataderos 2312 Antonio Moreno Antonio Moreno Taquería 3
UK WA1 1DP London 120 Hanover Sq. Thomas Hardy Around the Horn 4
Sweden S-958 22 Luleå Berguvsvägen 8 Christina Berglund Berglunds snabbköp 5

در مثال های پایین از انواع wildcard ها استفاده کرده ایم. تفاوت این مثال ها با مثال های جلسه ی قبل این است که سخت تر هستند. از آن جا که در این جلسه به طور خاص به مبحث wildcard ها پرداختیم از مثال های پیچیده تری استفاده می کنیم.

مثال استفاده از %

مثال اول - دستور SQL زیر تمام مشتریانی را انتخاب می کند که ستون City شان با رشته ی "ber" شروع شود:

SELECT * FROM Customers
WHERE City LIKE 'ber%';

برای اجرای این کد در پایگاه داده ی Northwind روی این لینک کلیک کنید.

مثال دوم - دستور SQL زیر تمام مشتریانی را انتخاب می کند که ستون City شان دارای رشته ی "es" باشد:

SELECT * FROM Customers
WHERE City LIKE '%es%';

برای اجرای این کد در پایگاه داده ی Northwind روی این لینک کلیک کنید.

مثال استفاده از _

مثال اول - دستور SQL زیر تمام مشتریانی را انتخاب می کند که ستون City شان با هر کاراکتری شروع شود و سپس رشته ی "erlin" را داشته باشد:

SELECT * FROM Customers
WHERE City LIKE '_erlin';

برای اجرای این کد در پایگاه داده ی Northwind روی این لینک کلیک کنید.

مثال دوم - دستور SQL زیر تمام مشتریانی را انتخاب می کند که ستون City شان با حرف L شروع شود، سپس هر کاراکتری که می خواهد باشد، سپس حرف n را داشته باشد، سپس هر کاراکتر دیگری که میخواهد باشد و در آخر با رشته ی "on" تمام شود:

SELECT * FROM Customers
WHERE City LIKE 'L_n_on';

برای اجرای این کد در پایگاه داده ی Northwind روی این لینک کلیک کنید.

مثال استفاده از [ ]

مثال اول - دستور SQL زیر تمام مشتریانی را انتخاب می کند که ستون City شان با حروف b یا s یا p شروع شود:

SELECT * FROM Customers
WHERE City LIKE '[bsp]%';

برای اجرای این کد در پایگاه داده ی Northwind روی این لینک کلیک کنید.

مثال دوم - دستور SQL زیر تمام مشتریانی را انتخاب می کند که ستون City شان با حروف a یا b یا c شروع شود (به صورت محدوده ای):

SELECT * FROM Customers
WHERE City LIKE '[a-c]%';

برای اجرای این کد در پایگاه داده ی Northwind روی این لینک کلیک کنید.

مثال استفاده از [ ! ]

مثال اول - دستور SQL زیر تمام مشتریانی را انتخاب می کند که ستون City شان با حروف b یا s یا p شروع نشود:

SELECT * FROM Customers
WHERE City LIKE '[!bsp]%';

برای اجرای این کد در پایگاه داده ی Northwind روی این لینک کلیک کنید.

نکته: دستور بالا را می توان به این شکل نیز نوشت:

SELECT * FROM Customers
WHERE City NOT LIKE '[bsp]%';

اضافه کردن NOT مانند اضافه کردن ! است اما نمی توانید از هر دو به صورت همزمان استفاده کنید.

خلاصه ی مقاله

در این قسمت مبحث wildcard ها را به صورت کامل بررسی کردیم و مثال های متعددی از آن ها را دیدیم. امیدوارم از این قسمت استفاده کرده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش زبان SQL توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (2 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی ملا
18 بهمن 1400
لینکها در قسمت مثال ها صحیح نیستند لطفا اصلاح کنید ممنون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

حامد حاجوی
29 آبان 1400
با سلام و سپاس فراوان دو نکته از این مقاله و مقاله قبلی برداشت میشه: 1- مبحث پترن ها نسبت به بزرگی و کوچکی حروف حساس نیستند. 2- شما فرمودین که نمیشه بطور همزمان از عملگر NOT و همچنین نماد ! استفاده کرد، ولی وقتی اسفاده می کنیم هیچ خطایی نمیده و خروجی مد نظر رو نشون میده. پس چرا؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی ملا
27 دی 1400
خروجی وقتی که هر دورا با هم استفاده میکنیم با وقتی که تنها یکی را بکار میبریم متفاوت است!

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.