برای فِچ (بازیابی) اطلاعات از دیتابیسهای رابطهای، از دستور 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);
به عبارتی، به علت اینکه ممکن است بیش از یک دانشجو برای هر آدرس وجود داشته باشد، دستور فوق به درستی عمل نخواهد کرد و اِرور خواهد داد.