سرفصل‌های آموزشی
آموزش SQL و MySQL
آشنایی با کاربرد دستور SELECT در SQL

آشنایی با کاربرد دستور SELECT در SQL

برای فِچ (بازیابی) اطلاعات از دیتابیس‌های رابطه‌ای، از دستور SELECT که یکی از انواع دستورات DQL است به شکل زیر استفاده می‌کنیم:

SELECT [DISTINCT] Attribute_List FROM R1, R2 ...
[WHERE condition]
[GROUP BY (Attributes)[HAVING condition]]
[ORDER BY(Attributes)[DESC]];

توجه داشته باشید که در نمونه کوئری فوق تمامی بخش‌هایی که داخل [] قرار گرفته‌اند اختیاری هستند و بنا به نیاز دولوپر به کار می‌روند ولی وجود خط اول برای بازیابی اطلاعات از دیتابیس‌های رابطه‌ای الزامی است.

نکته عرف بر این است تا دستورات زبان اس‌کیو‌ال با حروف کَپیتال (بزرگ) نوشته شوند مضاف بر اینکه در پایان تمامی دستورات این زبان باید علامت سِمی‌کالُن (;) قرار داد.

به طور مثال، برای بازیابی اَتریبیوت‌های ROLL_NO و NAME تمامی دانشجویان، می‌توان به صورت زیر از دستور SELECT استفاده کرد:

SELECT id, name FROM students;

باید توجه داشت که نتیجهٔ دستور SELECT نیز در قالب یک جدول برگردانده خواهد شد که اصطلاحاً به آن Result Set می‌گویند که با مد نظر قرار دادن جدول students که در آموزش‌های گذشته ایجاد کردیم، نتیجهٔ دستور بالا جدولی حاوی فیلدهای id و name با چهار رکورد است.

به منظور درک بهتر سازوکار این دستور، در ادامه برای فِچ کردن id و name دانشجویانی که شناسهٔ آن‌ها بزرگ‌تر از ۲ است، می‌توان یک کوئری به شکل زیر به دیتابیس ارسال کرد:

SELECT id, name FROM students WHERE id > 2;

‌اگر بخواهیم اقدام به بازیابی تمامی اَتریبیوت‌های جدول students با این شرط بکنیم که مقدار فیلد id آن‌ها بزرگ‌تر از ۲ باشد، می‌توان در کوئری خود از علامت * استفاده کرد که در این صورت داریم:

SELECT * FROM students WHERE id > 2;

جهت مرتب‌سازی Result Set (نتیجهٔ) حاصل از دستور SELECT بر اساس یک فیلد خاصی همچون age به‌ صورت صعودی یا نزولی، می‌توان از ORDER BY همانند آنچه در دستور زیر آمده است استفاده کرد:

SELECT * FROM students ORDER BY age;

توجه داشته باشید که ORDER BY age در کوئری فوق به صورت پیش‌فرض معادل با ORDER BY age ASC است و از همین روی نتیجهٔ کوئری بر اساس فیلد age به‌ صورت صعودی (از کم به زیاد) مرتب خواهد شد در حالی که اگر بخواهیم نتیجهٔ حاصل از کوئری به‌ صورت نزولی (از زیاد به کم) مرتب شود، باید از ORDER BY age DESC استفاده کرد. برای حذف رکوردهای تکراری از ریزالت‌سِت نیز می‌توان از DISTINCT به صورت استفاده کرد:

SELECT DISTINCT address FROM students;

معرفی توابع به اصطلاح Aggregation  
برای انجام عملیات ریاضیاتی بر روی داده‌های یک جدول، از فانکشن‌های به اصطلاح Aggregation استفاده می‌کنیم که برخی از اَگریگیشن‌ فانکشن‌های پرکاربرد در اس‌کیو‌ال عبارتند از:

- COUNT: این فانکشن جهت شمارش تعداد رکوردها در یک جدول به کار می‌رود. به‌ عنوان مثال، با توجه به جدول students نتیجهٔ دستور زیر یک ریزالت‌سِت با فیلدی به‌ نام count و یک رکورد با مقدار ۴ خواهد بود:

SELECT COUNT (phone) FROM students;

دقت داشته باشید با توجه به اینکه در جدول students تمامی رکوردهای مربوط به فیلد phone دارای مقدار هستند، عدد ۴ در ریزالتسِت برگردانده شده است که در غیر این صورت، اگر مثلاً فقط سه رکورد مربوط به این فیلد دارای مقدار بودند، عدد ۳ برگردانده می‌شد.

- SUM: این فانکشن برای جمع مقادیر یک فیلد استفاده می‌شود. به‌ عنوان مثال، دستور زیر مجموع مقادیر فیلد age را برمی‌گرداند:

SELECT SUM (age) FROM students;

به همین ترتیب می‌توان از فانکشن‌های MAX ،MIN و AVG نیز استفاده کرد که به ترتیب مقادیر مینیمم، ماکزیمم و میانگین را برمی‌گرداند (همان‌طور که در بالا اشاره شد، تمامی اَگریگیشن‌ فانکشن‌ها فقط یک رکورد را به‌ عنوان نتیجه کوئری برمی‌گردانند.)

برای گروه‌بندی رکوردهای یک ریزالت‌سِت بر اساس یک فیلد یا گروهی از فیلدها می‌توان از GROUP BY استفاده کرد و این در حالی است که این دستور همیشه همراه با اَگریگیشن‌ فانکشن‌ها استفاده می‌شود:

SELECT address, SUM (age) FROM students GROUP BY (address);

در کوئری بالا، (SUM(age فقط برای هر آدرس محاسبه می‌شود نَه برای کل جدول که نتیجه به‌ صورت زیر برگردانده می‌شود:

+---------+----------+
| address | SUM(age) |
+---------+----------+
| Ilam    |    25    |
| Karaj   |    33    |
| Semnan  |    27    |
| Tehran  |    18    |
+---------+----------+

دقت داشته باشید که فقط اَتریبیوت‌هایی که در قسمت GROUP BY ذکر شوند می‌توانند در قسمت SELECT بازیابی گردند به طوری که داریم:

SELECT id, address, SUM (age) FROM students GROUP BY (address);

به عبارتی، به علت اینکه ممکن است بیش از یک دانشجو برای هر آدرس وجود داشته باشد، دستور فوق به درستی عمل نخواهد کرد و اِرور خواهد داد.

online-support-icon