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

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

Structured Query Language یا به اختصار SQL یک زبان استاندارد جهت ذخیره، بازیابی، ویرایش و یا حذف اطلاعات در دیتابیس‌های رابطه‌ای است که در این مقاله با دستور SELECT در این زبان جهت فراخوانی دیتا از دیتابیس آشنا خواهید شد (به طور کلی، دیتابیس مجموعه‌ای است از داده‌ها که طبق یک ساختار مشخص ذخیره شده‌اند که برای آشنایی بیشتر با این مفهوم، می‌توانید به مقاله درآمدی بر مفهوم Database و انواع Data Model مراجعه نمایید.)

درآمدی بر دیتابیس‌های رابطه‌ای
Relational Database (پایگاه‌داده رابطه‌ای) نوعی از دیتابیس‌ها است که دیتا را در قالب Table (جدول) ذخیره می‌کند به طوری که هر جدول دارای یک نام منحصربه‌فرد (مثلاً students) بوده و شامل تعداد زیادی سطر یا به اصطلاح رِکورد و تعدادی ستون یا به اصطلاح فیلد است. فرض کنید در دیتابیسی به‌ نام university جدولی برای ذخیره‌سازی اطلاعات مربوط به دانشجویان به‌ نام students به شکل زیر داریم:

+----+--------+---------+----------+-----+
| id | name   | address | phone    | age |
+----+--------+---------+----------+-----+
|  1 | Ali    | Ilam    | 33856972 |  25 |
|  2 | Negar  | Tehran  | 88547265 |  18 |
|  3 | Sahand | Karaj   | 55698265 |  33 |
|  4 | Sogol  | Semnan  | 88695214 |  27 |
+----+--------+---------+----------+-----+

همان‌طور که مشاهده می‌کنید، در این جدول اطلاعاتی مانند شمارهٔ شناسه، نام، آدرس، تلفن و سن دانشجویان نگهداری می‌شود. حال به منظور درک بهتر ساختار یک جدول، پیش از ادامهٔ بحث لازم است تا به برخی از مهم‌ترین اصطلاحاتی که در رابطه با جداول به کار می‌روند اشاره‌ای داشته باشیم:

- Attribute: به هر یک از صِفات یا خصیصه‌هایی که برای یک موجودیت (که در اینجا دانشجو است) در جدول تعریف می‌شود Attribute می‌گویند. از جمله اتریبیوت‌های جدول فوق می‌توان به id و name اشاره کرد.

Tuple: هر سطر از جدول به‌ عنوان یک تاپِل یا رکورد شناخته می‌شود. به‌ عنوان مثال، جدول students دارای چهار تاپِل است که یکی از آن‌ها عبارت است از:

+----+------+---------+----------+-----+
| id | name | address | phone    | age |
+----+------+---------+----------+-----+
|  1 | Ali  | Ilam    | 33856972 |  25 |
+----+------+---------+----------+-----+

- Degree: به تعداد اَتریبیوت‌های تعریف‌شده در یک جدول Degree (مَرتبه) آن جدول می‌گویند. به‌ عنوان مثال، جدول Students دارای مرتبهٔ ۵ است.

- Cardinality: به تعداد تاپِل‌های یک جدول، کاردینالیتی آن جدول می‌گویند. به عنوان مثال، جدول students دارای کاردینالیتی ۴ است.

- Column: هر ستون یا به اصطلاح Column مجموعه‌ای از مقادیر را برای یک اَتریبیوت خاص نمایش می‌دهد. به‌ عنوان مثال، ستون id از جدول students عبارت است از:

+----+
| id |
+----+
|  1 |
|  2 |
|  3 | 
|  4 |
+----+

درآمدی بر سیستم‌های مدیریت پایگاه‌داده رابطه‌ای
Relational DataBase Management System (سیستم مدیریت پایگاه‌داده رابطه‌ای) و یا به اختصار RDBMS نرم‌افزاری جهت مدیریت دیتا در دیتابیس‌های رابطه‌ای است به طوری که اغلب سیستم‌های مدیریت پایگاه‌داده رابطه‌ای برای دسترسی به دیتابیس از زبان SQL استفاده می‌کنند (برای آشنایی بیشتر با سیستم‌های مدیریت پایگاه‌داده، می‌توانید به مقاله DBMS: درآمدی بر سیستم‌های مدیریت پایگاه‌داده مراجعه کنید.) برای استفاده از این نوع دیتابیس‌ها، نیاز است تا با زبان SQL و انواع کوئری‌هایی که می‌شود با استفاده از این زبان به کار گرفت آشنا شد که در ادامه به معرفی آن‌ها خواهیم پرداخت.

انواع Query (پرس‌وجو) به دیتابیس‌های رابطه‌ای
در حالت کلی، کوئری به دیتابیس‌های رابطه‌ای را می‌توان به سه دسته تقسیم کرد که عبارتند از:

- Data Definition Language: این نوع از کوئری‌ها که به اختصار DDL گفته می‌شوند، برای تعریف ساختار دیتابیس مانند ایجاد دیتابیس، اضافه کردن و یا حذف ستون‌های جدول و کارهایی از این دست به کار می‌روند.

- Data Manipulation Language: این نوع از کوئری‌ها که به اختصار DML گفته می‌شوند، برای ذخیره، ویرایش و حذف داده‌های درون جداول استفاده می‌شوند.

- Data Query Language: این نوع از کوئری‌ها که به اختصار DQL گفته می‌شوند، برای استخراج دیتا از دیتابیس به کار می‌روند.

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

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

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

برای روشن‌تر شدن مطلب، به ذکر مثال‌هایی از دستور SELECT می‌پردازیم اما قبل از هر چیز باید این نکته را ذکر کنیم که عرف بر این است تا دستورات زبان SQL با حروف کَپیتال (بزرگ) نوشته شوند؛ همچنین در پایان تمامی دستورات SQL باید علامت سِمی‌کالُن (;) قرار داد. به طور مثال، برای بازیابی اَتریبیوت‌های ROLL_NO و NAME تمامی دانشجویان، می‌توان به صورت زیر از دستور SELECT استفاده کرد:

SELECT id, name FROM students;

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

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 استفاده می‌کنیم که برخی از اَگریگیشن‌ فانکشن‌های پرکاربرد در SQL عبارتند از:

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

SELECT COUNT (phone) FROM students;

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

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

SELECT SUM (age) FROM students;

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

برای گروه‌بندی رکوردهای یک ریزالت‌سِت بر اساس یک فیلد یا گروهی از فیلدها، می‌توان از GROUP BY استفاده کرد و این در حالی است که 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);

در این مقاله سعی کردیم به یکی از مهم‌ترین دستورات زبان SQL که جهت استخراج اطلاعات به کار می‌رود (SELECT) بپردازیم و این در حالی است که در قسمت دوم این سری از مقالات تحت عنوان درآمدی بر زبان SQL (بخش دوم) به بررسی دستورات UPDATE و DELETE پرداخته‌ایم.