درآمدی بر زبان SQL (بخش سوم)

درآمدی بر زبان SQL (بخش سوم)

پس از آشنایی با دستوراتی که برای اِعمال تغییر در داده‌های ذخیره‌شده در دیتابیس به کار می‌روند، در این آموزش به بررسی برخی از پرکاربردترین عملگرها در زبان SQL و همچنین مفهومی تحت عنوان Alias در این زبان خواهیم پرداخت.

اپراتور IN
برای مشخص کردن چندین مقدار در کلاز WHERE، می‌توان از این اپراتور به شکل زیر استفاده کرد:

SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, …);

به‌ عنوان مثال، فرض کنید می‌خواهیم از جدول students رکوردهای مربوط به دانشجویانی که سن آن‌ها ۲۵ یا ۲۷ است را فِچ (بازیابی) کنیم در این‌ صورت می‌توان از کوئری زیر استفاده نمود:

SELECT * FROM students WHERE age IN (25, 27);

که خروجی دستور بالا ریزالت‌سِتی به صورت زیر خواهد بود:

+----+-------+---------+----------+------+
| id | name  | address | phone    | age  |
+----+-------+---------+----------+------+
|  1 | Amir  | Ilam    | 33856972 |   25 |
|  4 | Sogol | Semnan  | 88695214 |   27 |
+----+-------+---------+----------+------+

در اینجا حتی می‌توانیم به‌ جای تعیین مقادیر مختلف، از دستور SELECT نیز همچون کوئری زیر استفاده کرد:

SELECT column_name(s) FROM table_name WHERE column_name IN (SELECT STATEMENT);

مثلاً فرض کنید می‌خواهیم تمامی دانشجویانی را که هم‌سن یکی از اساتید هستند را از جدول students فچ کنیم که در این صورت می‌توان از کوئری زیر استفاده کرد:

SELECT * FROM students WHERE age IN (SELECT age FROM professors);

لازم به ذکر است برای اینکه نتیجه کوئری شامل یکسری از رکوردهایی که نیازی به آن‌ها نداریم نباشد، می‌توان از کیورد (کلمهٔ کلیدی) NOT قبل از اپراتور IN استفاده کرد به طوری که مثلاً برای دست یافتن به تمامی دانشجویان به‌ جز آن‌هایی که اهل تهران و ایلام هستند، می‌توان به شکل زیر عمل کرد:

SELECT * FROM students WHERE address NOT IN ('Tehran', 'Ilam');

و یا به جای استفاده از کیورد NOT، می‌توان از عملگر <> نیز همچون کوئری زیر استفاده نمود:

SELECT * FROM students WHERE address <> 'Tehran' AND address <> 'Ilam';

که ریزالت‌سِت دو کوئری فوق دقیقاً یکسان است و به شکل زیر خواهد بود:

+----+--------+---------+----------+------+
| id | name   | address | phone    | age  |
+----+--------+---------+----------+------+
|  3 | Sahand | Karaj   | 55698265 |   33 |
|  4 | Sogol  | Semnan  | 88695214 |   27 |
|  5 | Parviz | Mashhad | 87597704 |   28 |
+----+--------+---------+----------+------+

اپراتور BETWEEN
از این اپراتور جهت مشخص کردن دامنهٔ خاصی از مقادیر استفاده می‌شود. به‌ عنوان مثال، برای به دست آوردن اطلاعات دانشجویانی که سن آن‌ها بین ۳۰ تا ۴۰ سال است، می‌توان از کوئری زیر استفاده کرد:

SELECT * FROM students WHERE age NOT BETWEEN 30 AND 40;

که با توجه به دیتاهای موجود در جدول students، نتیجهٔ کوئری فوق ریزالت‌سِتی به شکل زیر خواهد بود:

+----+--------+---------+----------+------+
| id | name   | address | phone    | age  |
+----+--------+---------+----------+------+
|  3 | Sahand | Karaj   | 55698265 |   33 |
+----+--------+---------+----------+------+

دقت کنید که این اپراتور شامل مقادیر ابتدایی و انتهایی دامنه (مثلاً ۳۰ و ۴۰ در مثال بالا) نیز می‌شود.

اپراتور LIKE
این اپراتور جهت جستجوی یک Pattern (الگو) خاص در مقادیر یک فیلد خاص در WHERE استفاده می‌شود. به طور کلی، دو به‌ اصطلاح Wildcard (کاراکترهایی که جایگزین دیگر کاراکترها در یک استرینگ یا رشتهٔ متنی می‌شوند) که همراه این اپراتور استفاده می‌شوند عبارتند از:

- علامت % که اشاره به صفر، یک و یا چندین کاراکتر در پَترن دارد.
- آندراِسکُر یا علامت _ که اشاره به فقط و فقط یک کاراکتر در پترن دارد.

برای مثال '%a' به‌ دنبال مجموعه کاراکترهایی می‌گردد که با حرف a شروع می‌شوند و یا '%r_' به یک اِسترینگ‌ (رشته) اشاره می‌کند که دقیقاً حرف دومش r باشد (توجه داشته باشید که این دو وایلکارد همچنین می‌توانند هم‌زمان با هم نیز استفاده شوند.) به‌ عنوان مثالی دیگر، برای بازیابی رکوردهای مربوط به دانشجویانی که نام آن‌ها با حرف s شروع می‌شود و حداقل شامل سه کاراکتر باشند، می‌توان از کوئری زیر استفاده کرد:

SELECT * FROM students WHERE name LIKE 's_%_%';

که نتیجهٔ کوئری فوق یک ریزالت‌سِت به شکل زیر خواهد بود:

+----+--------+---------+----------+------+
| id | name   | address | phone    | age  |
+----+--------+---------+----------+------+
|  3 | Sahand | Karaj   | 55698265 |   33 |
|  4 | Sogol  | Semnan  | 88695214 |   27 |
|  7 | Saeid  | NULL    | NULL     |   31 |
+----+--------+---------+----------+------+

انجام عملیات جستجوی یک اِسترینگ در اکثر وب‌ اپلیکیشن‌ها معمولاً با استفاده از اپراتور LIKE به سادگی قابل پیاده‌سازی خواهد بود. مثلاً فرض کنید کاربری به‌ دنبال اطلاعات دانشجویانی است که در نام آن‌ها کلمهٔ gol باشد که در این صورت می‌توان با کوئری زیر تمامی دانشجویان که این شرط در موردشان صدق می‌کند را بازیابی کرده و در نتیجه نشان داد:

SELECT * FROM students WHERE name LIKE '%gol%';

آشنایی با مفهوم Alias در زبان SQL
هنگام بازیابی اطلاعات از دیتابیس می‌توانیم به یکی از فیلدهای از جدولی خاص یک نام مستعار و موقتی داد که برای این کار می‌توان از سینتکس زیر استفاده کرد:

SELECT column_name AS alias_name FROM table_name;

همچنین برای دادن نام مستعار به یک جدول نیز می‌توان از سینتکس زیر استفاده کرد:

SELECT column_name(s) FROM table_name AS alias_name;

دقت داشته باشید که این نام‌های مستعار فقط نام فیلدها و جداول را در نتیجهٔ کوئری تغییر می‌دهند و هیچ‌گونه تغییری در نام فیلدها و جداول واقعی موجود در دیتابیس ایجاد نمی‌کنند. به طور کلی، از جمله کاربردهای Alias می‌توان به موارد زیر اشاره کرد:

- زمانی که از بیش از یک جدول بازیابی اطلاعات صورت گیرد.
- در کوئری از فانکشن‌ها استفاده می‌کنیم.
- نام فیلدها طولانی است و یا از خوانایی کمی برخوردار هستند.
- دو یا چند فیلد با یکدیگر ادغام می‌شوند.

برای درک بهتر این موضوع، یک مثال می‌زنیم. در کوئری زیر اقدام به ایجاد یک نام مستعار برای فیلد name از جدول students کرده‌ایم:

SELECT id, name AS 'first name' FROM students;

که نتیجه کوئری فوق یک جدول حاوی دو فیلد به‌ نام‌های id و first name خواهد بود (باید توجه داشته باشید که اگر نام مستعار شامل اِسپیس (فاصله) باشد، آن نام مستعار حتماً باید داخل دابل کوتیشن (") و یا سینگل کوتیشن (') قرار گیرد.) همچنین می‌توان همانند مثال زیر برای ترکیب دو یا چند فیلد از جدول، از یک Alias (نام مستعار) استفاده کرد:

SELECT name, address + ', ' + phone AS 'contact info' FROM students;

البته ذکر این نکته ضروری است که جهت اجرای درست کوئری فوق در MySQL می‌بایست از فانکشن از پیش تعریف شدهٔ CONCAT در زبان SQL به شکل زیر استفاده کرد:

SELECT name, CONCAT(address, ', ', phone) AS 'contact info' FROM students;

که نتیجه کوئری بالا یک جدول حاوی دو فیلد به نام‌های name و contact info به شکل زیر خواهد بود:

+--------+-------------------+
| name   | contact info      |
+--------+-------------------+
| Amir   | Ilam, 33856972    |
| Negar  | Tehran, 88547265  |
| Sahand | Karaj, 55698265   |
| Sogol  | Semnan, 88695214  |
| Parviz | Mashhad, 87597704 |
+--------+-------------------+

توجه داشته باشید که فانکشن CONCAT در MySQL جهت الحاق و پیوند چند عبارت با یکدیگر به کار می‌رود.