زبان SQL تنها زبان استاندارد و جامع پیادهسازی، مدیریت، نگهداری و کار با بانکهای اطلاعاتی میباشد که تقریباً توسط تمام بانکهای اطلاعاتی کوچک و بزرگ مانند Access، SQL Server، Oracle و DB2 پشتیبانی میشود. طراحان و افرادی که بنوعی با بانکهای اطلاعاتی سروکار دارند و همچنین برنامه نویسانی که از این بانکها استفاده میکنند هرکدام باید تا اندازهای با این زبان آشنایی داشته باشند. این مقاله که در سه قسمت تهیه شده است میکوشد تا مفاهیم زبان SQL را در قالب یک مثال کاربردی بیان کند. هرچند که مفاهیم بکار رفته در این مقاله در تمامی بانکهای اطلاعاتی قابل پیادهسازی میباشند ولی مثالهای ارائه شده در 2000 SQL Server مورد تست قرار گرفتهاند.
بانک اطلاعاتی که در این مقاله بعنوان مثال مورد استفاده قرار گرفته است بانک اطلاعاتی یک آموزشگاه میباشد که شامل دو جدول بنامهای teachers و students میباشد. جدول اول اطلاعات اساتید و جدول دوم اطلاعات دانشجویان را در خود نگه میدارد. جدول اول دارای چهار فیلد زیر میباشد: name یا نام از نوع text، family یا فامیل از نوع text، age یا سن از نوع عدد، salary یا حقوق از نوع عدد.
جدول دانشجویان نیز شامل چهار فیلد میباشد، سه فیلد اول آن مشابه سه فیلد اول جدول اساتید میباشد و فیلد چهارم آن عبارتست از GPA یا معدل که یک فیلد عددی است.
زبان SQL دارای دستورات متنوع و نسبتاً زیادی میباشد. به این دستورات Clause نیز گفته میشود. در این مقاله و قسمتهای بعدی آن تعدادی از مهمترین Clauseهای زبان SQL مورد بررسی قرار میگیرند.
1 – دستورهای SELECT و FROM :
هدف نهایی از دادن انبوه اطلاعات به کامپیوتر، جستجو و یافتن اطلاعات مفید میباشد. به این عمل یعنی جستجوی اطلاعات در بانک اطلاعاتی Query نیز گفته میشود. اکثر دستورات زبان SQL نیز در همین راستا مورد استفاده قرار میگیرند. در این بین مهمترین و پرکاربردترین دستور را میتوان دستور SELECT قلمداد کرد.
این دستور جهت انتخاب یک یا چند فیلد از یک یا چند جدول مختلف مورد استفاده قرار میگیرد، فیلدهای انتخاب شده پس از اجرای query روی صفحه نمایش داده خواهند شد.
بعنوان مثال اگر در بانک اطلاعاتی فرضی خودمان بخواهیم اسم و فامیل تمام دانشجویان را مشاهده کنیم باید برنامهای به شکل زیر بنویسیم:
SELECT name, family
FROM students
در این برنامه که به زبان SQL استاندارد نوشته شده است از دو دستور SELECT و FROM استفاده شده است. دستور SELECT مشخص میکند که چه فیلدهایی از جدول باید نمایش داده شوند و دستور FROM نیز مشخص کننده جدولی است که قرار است اطلاعات از داخل آن استخراج شوند. حال اگر بخواهیم نام و فامیل تمام اساتید را ببینیم برنامه بالا را باید بصورت زیر تغییر دهیم:
SELECT name, family
FROM teachers
همان طوری که از مثالهای بالا نیز مشخص است جلوی دستور SELECT نام فیلدهایی نوشته میشوند که قرار است نمایش داده شوند و بعنوان جداکننده نیز باید از کاراکتر کاما استفاده کرد. در صورتی که بخواهیم تمام فیلدهای یک جدول را ببینیم میتوانیم بجای نوشتن اسم تمام فیلدها فقط از یک کاراکتر ستاره استفاده کنیم. کاراکتر ستاره بمعنی تمام فیلدهای یک جدول میباشد. مثلاً دو دستور زیر با هم معادلند:
SELECT *
SELECT name, family, age, gpa
2 – دستور WHERE :
دستور SELECT همان طوری که گفته شد جهت انتخاب و نمایش تعدادی از فیلدهای جداول مورد استفاده قرار میگیرد. در این حالت تمام رکوردها نمایش داده خواهند شد، ولی در بیشتر موارد هدف از نوشتن Query نمایش رکوردهایی است که دارای شرایط ویژهای میباشند مثلاً نمایش مشخصات اساتیدی که بیش از پنجاه سال سن دارند. دستور WHERE برای گذاشتن یک یا چند شرط به دستور SELECT مورد استفاده قرار میگیرد. با اضافه کردن شرط به دستور SELECT تعداد رکوردهای خروجی (پاسخ) معمولاً محدودتر میشود. بعنوان مثال اگر بخواهیم مشخصات اساتیدی که بیش از چهل سال سن دارند را ببینیم باید برنامهای بصورت زیر بنویسیم:
SELECT *
FROM teachers
WHERE age > 40
در این برنامه شرط age > 40 با استفاده از دستور WHERE به Query اضافه شده و باعث شده است تا فقط مشخصات اساتیدی نمایش داده شوند که در این شرط صدق میکنند یعنی بیش از چهل سال سن دارند.
حال اگر بخواهیم مشخصات دانشجویانی را که نام آنها علی میباشد و سن آنها نیز کمتر از پانزده سال است را ببینیم باید Query زیر را اجرا کنیم:
SELECT *
FROM students
WHERE age < 15 AND name = 'ali'
در مثال بالا دو مطلب جدید وجود دارد نخست آنکه در زبان SQL رشته متنی را باید داخل کوتیشن (‘) قرارداد. بنابراین برای معرفی کلمهای بنام علی باید آنرا بصورت ‘ali’ نوشت، زیرا در این حالت این کلمه یک ثابت رشتهای (متنی) بحساب میآید. نکته دیگر آنکه میتوان شرطهای مختلف را توسط AND، OR و NOT با همدیگر ادغام کرده و شرطهای پیچیدهتری را بدست آورد. AND، OR و NOT هر سه از کلمات کلیدی زبان SQL میباشند. بعنوان یک مثال دیگر فرض کنید میخواهیم مشخصات تمام دانشجویانی را که نام آنها، علی یا رضا نباشند را پیدا کنیم، برنامهای که این Query را انجام میدهد بصورت زیر میباشد:
SELECT *
FROM students
WHERE name NOT IN ('ali', 'reza')
در صورتی که NOT را از برنامه بالا حذف کنیم مشخصات تمام دانشجویانی که نام آنها علی یا رضا میباشند نمایش داده خواهد شد.
در این برنامه نیز یک کلمه کلیدی جدید وجود دارد: IN که برای تست عضویت در یک مجموعه بکار میرود. مجموعهای که بادستور IN بکار میرود میتواند دهها عضو داشته باشد و نوع اعضا نیز میتواند رشتهای، عددی یا ... باشد. البته واضح است که تمام اعضا باید هم نوع باشند.
حال بعنوان یک مثال پیشرفتهتر میخواهیم مشخصات دانشجویانی را ببینیم که اسم فامیل آنها به ‘ زاده’ ختم میشود مانند علیزاده، محمد زاده و ... برای این منظور باید Query زیر را نوشته و اجرا کنیم:
SELECT *
FROM family LIKE '% zadeh'
کاربرانی که با Access کار میکنند باید سطر آخر را به صورت زیر تغییر دهند:
WHERE family LIKE '*zadeh'
در این مثال از Wildcardها استفاده شده است که قبلاً با مفهوم آن در DOS و Windows یا حتی Unix آشنا شدهایم (ls a*) . در Wildcard ،SQL هایی به شرح زیر وجود دارند:
% (در Access از * استفاده کنید): این Wild card نشانگر هر تعدادی از کاراکترها (هر کاراکتری) میباشد.
- (در Access از ? استفاده کنید): این Wildcard نشانگر یک کاراکتر میباشد که این کاراکتر میتواند هر کدام از کاراکترهای مجاز کامپیوتر باشد.
جهت جستجو کردن فیلدهایی که دارای یک الگوی (Pattern) خاصی هستند باید از دستور LIKE و Wildcardها استفاده کرد. در مثال زیر نام و سن تمام اساتیدی که اسم آنها با Pe شروع میشود، نمایش داده خواهد شد.
SELECT name, age
FROM teachers
WHERE name LIKE 'Pe%'
بنابراین مشخصات افرادی که نام آنها مثلاً پدرام یا پیمان باشد در خروجی لیست خواهد شد.
3 – دستور ORDERBY :
دستور ORDERBY جهت Sort کردن رکوردهای نمایش داده شده مورد استفاده قرار میگیرد. با این دستور میتوان مشخص کرد که رکوردهایی که قرار است نمایش داده شوند برحسب کدام فیلد باید مرتب شوند. بعنوان مثال برای مشاهده کردن مشخصات اساتیدی که سن آنها بیشتر از 29 سال میباشد و در ضمن لیست خروجی بترتیب اسم فامیل نیز مرتب شده باشد باید Query زیر را اجرا کرد.
SELECT *
FROM teachers
ORDERBY family
در این حالت افراد بترتیب اسم فامیل خود لیست خواهند شد. (از A تا Z) در صورتی که بخواهیم ترتیب Sort شدن برعکس شود (از Z تا A) میتوان پس از دستور ORDERBY از کلمه کلیدی DESC استفاده کرد، مانند مثال زیر
SELECT *
FROM teachers
ORDERBY DESC name
در این مثال Sort شدن بترتیب اسم و نه بترتیب فامیل انجام میگیرد.
برای دستور ORDERBY میتوان چند فیلد تعریف کرد، در این صورت این دستور عمل Sort کردن را با در نظرگرفتن اولین فیلد انجام خواهد داد در صورتی که چند رکورد دارای مقدار مشابهی در این فیلد باشند ملاک مرتب سازی آنها فیلد دومی خواهد بود که در دستور ORDERBY ذکر شده است، در صورتی که این فیلد نیز دارای مقادیر مشابهی باشد ملاک تصمیم گیری فیلد سوم خواهد بود والی آخر.
بعنوان مثال در Query زیر نام اساتیدی که بیش از 30 سال دارند برحسب فامیل آنها مرتب میشود در صورتی که چند استاد دارای اسم فامیل یکسانی باشند ملاک مرتب شدن، اسم کوچک آنها خواهد بود.
SELECT *
FROM teachers
WHERE age > 30
ORDERBY family, name
4 – استفاده از توابع:
در دستور SELECT علاوه بر تعریف فیلدها میتوان از عبارتهای ریاضی و یا توابع استاندارد SQL نیز استفاده کرد.
بعنوان مثال اگر مالیات بردرآمد پنج درصد باشد Query زیر نام اساتید و مالیاتی را که هر کدام میپردازند را مشخص میکند.
SELECT family, name, salary*5/100
FROM teachers
علاوه بر عبارتهای ریاضی میتوان از توابع استاندارد SQL نیز استفاده کرد، تعدادی از این توابع عبارتند از:
تابع COUNT : تعداد فیلدها را برمیگرداند.
تابع SUM : مجموع یک فیلد عددی را برمیگرداند.
تابع AVG : میانگین یک فیلد عددی را برمیگرداند.
تابع MIN : مینیمم یک فیلد عددی را برمیگرداند.
تابع MAX : ماکزیمم یک فیلد عددی را برمیگرداند.
بعنوان مثال اگر بخواهیم تعداد اساتید و مجموع حقوقهایی را که به آنها پرداخت شده است را ببینیم میتوانیم از Query زیر استفاده بکنیم.
SELECT COUNT (name), SUM (Salary)
FROM teachers
5 – Queryهای چند جدولی:
تمام Queryهایی که تاکنون مشاهده کردید، Queryهای تک جدولی بودند بدین معنی که در هر Query فقط اطلاعات یک جدول مورد جستجو قرار میگرفت. در SQL امکان نوشتن Queryهای چند جدولی نیز وجود دارد. در این حالت اطلاعات چند جدول بطور همزمان مورد جستجو قرار میگیرد و حتی امکان مقایسه فیلدهایی از یک جدول با فیلدهایی از جدول دیگر نیز وجود دارد. اگر در بین جداولی که در Query شرکت داده میشوند فیلدهای هم نام وجود داشته باشد باید نام آن فیلدها را Fully qualified کرد بدین معنی که ابتدا اسم جدول و سپس اسم فیلد را ذکر کرد. بین اسم جدول و اسم فیلد نیز باید از یک کاراکتر نقطه (‘.’) استفاده کرد.
بعنوان مثال اگر بخواهیم لیست اساتید و دانشجویانی که دارای ارتباط فامیلی هستند را ببینیم میتوانیم از Query زیر استفاده بکنیم:
SELECT *
FROM students, teachers
WHERE students.family = teachers. Family
و یا اگر بخواهیم لیست اساتیدی را مشاهده کنیم که سن آنها از سن برخی از دانشجویان کمتر است، میتوانیم Query زیر را اجرا کنیم:
SELECT teachers.family, teachers.name
FROM students, teachers
WHERE teachers.age < students.age
6 – کلام آخر:
کلام آخر اینکه زبان SQL برخلاف زبانهایی مانند C یا C++ یک زبان Case Sensitive نیست بدین معنی که به بزرگ یا کوچک بودن حروف حساس نمیباشد. بنابراین به راحتی میتوان دستورات و کلمات کلیدی آنرا در هر برنامهای با حروف کوچک یا بزرگ تایپ کرد.