زبان 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 نيست بدين معني كه به بزرگ يا كوچك بودن حروف حساس نميباشد. بنابراين به راحتي ميتوان دستورات و كلمات كليدي آنرا در هر برنامهاي با حروف كوچك يا بزرگ تايپ كرد.
|