در مدل رابطهای دادهها، زبان ساختارمند پرسشها یا اسکیوال یا سیکوال (Structured Query Language - SQL) زبانی است بلندتراز مبتنی بر زبان كوتاهتراز و ریاضی جبر رابطهای که برای ایجاد، تغییر، و بازیابی دادهها و نیز عملیات بر روی آنها بهكار میرود.زبان SQL به سمت مدل شیگرا - رابطهای نیز پیشرفت کردهاست.
تاریخچه
منشا اصلی سیکوال به مقالهٔ سال 1970 ادگار كاد تحت عنوان «مدل رابطهای دادهها برای بانکهای بزرگ دادههای اشتراکی»[1] باز میگردد. در دههٔ 70 گروهی از شرکت آیبیام در شهر سان خوزه بر روی سیستم پایگاه دادههای سیستم آر بدون توجه به این مقاله کار میکردند و زبان SEQUEL [2] را به منظور عملیات و بازیابی اطلاعات ذخیره شده در سیستم آر ایجاد کردند. اگر چه اسکیوال ناشی از تلاشهای کاد بود اما Donald D. Chamberlin و Raymond F. Boyce را به عنوان طراحان زبان SEQUEL میدانند.سمینارهایی در زمینه فناوری بانک اطلاعاتی و مباحثاتی در مورد مزایای مدل رابطهای جدید برگزار گردید. تا 1976 مشخص بود که IBM طرفدار جدی فناوری بانک اطلاعاتی رابطهای بوده، توجه زیادی نسبت به زبان سیکوال دارد. تبلیغات در زمینه سیستم آر باعث جذب گروهی از مهندسین در Menlo Park در کالیفرنیا گردید. این گروه به این نتیجه رسیدند که تحقیقات آىبىام منجر به یک بازار تجاری برای بانکهای اطلاعاتی رابطهای خواهد گردید.در 1977 این گروه شرکتی بنام Inc وRelational Software تأسیس نمودند تا یک دىبىاماس[3] رابطهای بر اساس سیکوال بسازند. محصولی بنام اوراكل در 1979 عرضه گردید، و اولین دىبىاماس رابطهای بوجود آمد. به این ترتیب محصول اوراکل باعث گردید اولین محصول آىبىام برای مدت 2 سال در بازار دچار رکود باشد. این محصول بر روی مینی کامپیوترهای VAx Digital’s اجرا میشد که خیلی از کامپیوترهای بزرگ آىبىام ارزان تر بودند.امروزه این شرکت با نام Oracle Corporation اولین فروشنده سیستمهای مدیریت بانک اطلاعاتی رابطهای است. استادان آزمایشگاههای کامپیوتر در دانشگاه برکلی کالیفرنیا نیز در نیمه دهه 1970 مشغول تحقیق در زمینه بانکهای اطلاعاتی رابطهای بودن (مانند تیم تحقیق آىبىام)، گروه فوق نیز یک نمونه از دىبىاماس رابطهای ایجاد نمودند و سیستم خود را Ingres نام نهادند.پروژه Ingres شامل یک زبان پرسش[4] بنام QUEL بود، اگر چه از سیکوال خیلی ساخت یافته تر بود، اما شباهت آن به زبان انگلیسی کمتر بود.در حالیکه اوراکل و Ingres برای ارائه محصولات تجاری در رقابت بودند، پروژه سیستم آر شرکت آىبىام در تلاش بودهاست که یک محصو ل تجاری با نام SQL/Data system (یاSQL/DS) عرضه نماید. آىبىام موجودیت SQL/DS را در 1981 اعلام، و در 1982 شروع به عرضه محصول خود نمود. در سال 1983 آىبىام یک نسخه SQL/DS را برای VM/CMS (سیستم عاملی که در کامپیوتر بزرگ آىبىام غالبا استفاده شده بود)، اعلام نمود.همچنین در سال 1983 شرکت آىبىام، محصول دیبیتو[5] را معرفی نمود که یک دىبىاماس رابطهای بود برای سیستمهای بزرگ آن شرکت. دیبیتو تحت سیستم عامل IBM’s VMS(سیستم عامل مراکز کامپیوتری بزرگ) اجرا میشد. اولین نسخه دیبیتو در 1985 عرضه گردید، و مسئولین آىبىام اعلام نمو دند که این محصول یک برنامه استراتژیک برای تکنولوژی نرم افزاری آىبىام میباش دیبیتو .از آن تاریخ تاکنون دىبىاماس رابطهای شاخص بوده و آىبىام از آن حمایت نموده و زبان «سیکوال دیبیتو»[6] استاندارد عملی زبان بانک اطلاعاتی بودهاست.
استانداردها
سیکوال استاندارد (ANSI (American National Standards Institute را در سال 1986 و ISO (International Organization for Standardization) را در سال 1987 اتخاذ نمود. استانداردهای مختلفی از اسکیوال تاکنون عرضه شده که در جدول زیر بیان میکنیم:
SQL-87
SQL-89
SQL-92
SQL:1999
SQL:2003
SQL \ 2005
SQL \ 2008
حوزه و وسعت
بسیاری از اصطلاحات زبان اسکیوال تحت استاندارد بین المللی بوده، و در نتیجه، از آنها شبیه بقیه زبانهای استاندارد مثل محصولات شرکت اوراکل PL/SQL [7] یا Sybase و SQL PL (مدل رویهای) از شرکت آیبیام میباشد.اسکیوال برای کارهای ویژه و محدودی (گزارش گیری از دادهها در پایگاه دادههای رابطهای) طراحی شدهاست. بر خلاف زبانهای دستوری مثل بیسیک یا سی که برای حل مسائل طراحی شده، SQL زبانی بر پایه اعلان است. زبانهای توسعه یافتهای مثل PL/SQL به دنبال کامل کردن زبان به هدف ایجاد زبان برنامه نویسی با حفظ مزیتهای SQL میباشد. شیوه دیگر کار این است که به کدهای زبان برنامه نویسی اجازه دسترسی به پایگاه داده به کمک دستورات SQL داده شود مثلاً PostgreSQL به توابعش اجازه میدهد که درون کدهای Perl، Tcl و C نوشته شوند. گاهی به شوخی گفته میشود که SQL نه ساخت یافتهاست،نه محدود به گزارش گیریها و اصلاً یک زبان نیست!
واژههای کلیدی
واژههای کلیدی اسکیوال به گروههای مختلفی تقسیم میگردد، در زیر به برخی از آنها اشاره میکنیم آنهایی که آشنا تر هستند را تنها با یک مثال شرح میدهیم:
دستور بازیابی دادهها: SELECT
دستورات عملیات دادهها: INSERT ،UPDATE ،MERGE ،TRUNCAT، و DELETE
دستورات تراکنش دادهها: COMMIT و ROLLBACK
دستورات تعریف دادهها: CREATE وDROP
دستورات کنترل دادهها: GRANT و REVOKE
دستور بازیابی دادهها
دستور SELECT جهت بازیابی برشی سطری از یک یا چند جدول به کار میرود. این دستور پرکاربردترین دستور DML میباشد و برای گزارش گیریهای موثر مورد استفاده قرار میگیرد. ساختمان این دستور میتواند از اجزای زیر تشکیل شده باشد:
FROM: مشخص کردن جداول و نحوه اتصال آنها به هم.
WHERE: انتخاب سطرهایی با شرایط خاص.
GROUP BY: ترکیب سطرها با مقادیر مربوط به مجموعهای از سطرهای کوچکتر.
HAVING: مشخص کردن سطرهای ترکیبی.
ORDER BY: مشخص کردن اینکه کدام ستونها برای مرتب کردن دادهها به کار میرود.
مثال 1) نشان دادن رکوردهای تمام کتابهای بیش 100٫00 واحد قیمت. نتایج بر اساس نام کتاب مرتب میگردد. نماد ستاره(*) به معنای نشان دادن تمام ستونهای ( صفات)[8] جدول میباشد:
SELECT * FROM books WHERE price 100٫00
ORDER BY title
مثال 2) این مسئله نحوه استفاده از جداول چندگانه را نشان میدهد. bk و ba نام مستعار جداول میباشد. در این مثال تعداد مولفان مختلف هر کتاب را نشان داده میشود:
SELECT bk.title, count(*) AS Authors
FROM books AS bk, book_authors AS ba
WHERE bk.book_number = ba.book_number
GROUP BY bk.title
[ویرایش] دستورات عملیات روی دادهها
این دستورات به اختصار (DML ( Data Manipulation Language گفته میشود و شامل دستوراتی همچون زیر است:
INSERT: اضافه کردن سطرهایی (تاپلهایی) به جدول موجود.
INSERT INTO My_table (field1, field2, field3) VALUES ('test', 'N', NULL);
UPDATE: جهت تغییر مقادیر سطرهای موجود جدول.
UPDATE My_table SET field1 = 'updated value' WHERE field2 = 'N';
MERGE: ترکیب کردن دادهها در جداول چندگانه. این دستور جدید در SQL:2003 اضافه شدهاست، پیش از این پایگاه دادهها از دستور UPSERT استفاده میکردند.
TRUNCAT: تمام دادههای جدول را حذف میکند (از دستورات غیر استاندارد اما پر کاربرد SQL میباشد)
DELETE: حذف سطرهایی از جدول موجود.
DELETE FROM My_table WHERE field2 = 'N';
[ویرایش] دستورات تراکنش دادهها
(START TRANSACTION (BEGIN WORK: جهت آغاز یک تراکنش پایگاه داده به کار میرود تا کنترل کند که تراکنش یا به پایان برسد یا اصلاً بی تأثیر باشد.
COMMIT : با عث میشود که تغییرات درون تراكنش به طور دائمی ثبت گردد.
ROLLBACK : باعث میشود که تغییرات از آخرین COMMIT یا ROLLBACK دور انداخته شود، در نتیجه وضعیت دادهها به قبل از درخواست تغییرات آنها بر میگردد.
این دو دستور در کنار هم برای کنترل و قفل گذاری به کار میرود و هنگام خروج از تراکنش این کنترل و قفل گذاری از بین میرود.
مثال 4)
START TRANSACTION;
UPDATE inventory SET quantity = quantity - 3 WHERE item = 'pants';
COMMIT;
[ویرایش] دستورات تعریف دادهها
دومین دسته دستورات سیکوال دستورات تعریف دادهها یا (DDL (Data Definition Language میباشد. این دستورات به کاربر اجازه تعریف جداول جدید و اجزای آنها را میدهد. بیشتر SQLهای تجاری دستوراتی با این خصوصیات را دارند. مهمترین گزینههای پایهای DDL دستورات زیر است:
CREATE: ایجاد یک شی (مثلاً یک جدول).
DROP: حذف شی تعریف شدهای در پایگاه داده.
بیشتر پایگاههای دادهها دستور ALTER را نیز دارند که اجازه تغییر یک شی موجود را به شیوههای مختلف میدهد ( مثلاً اضافه کردن یک ستون به جدول).
مثال 5:
CREATE TABLE My_table ( my_field1 INT, my_field2 VARCHAR (50), my_field3 DATE NOT NULL, PRIMARY KEY (my_field1, my_field2) );
[ویرایش] دستورات کنترل داده
سومین دسته از دستورات SQL دستورات کنترل داده یا (DCL (Data Control Language میباشد. این دستورات جنبههای اجازه دسترسی به دادهها را مشخص میکند و تعیین میکند کدام کاربر میتواند روی پایگاه داده عملیات انجام دهد یا کدام کاربر تنها میتواند قابلیت خواندن آنها را داشته باشد. دو دستور اصلی به قرار زیر است:
GRANT: اجازه دادن به یک یاچند کاربر برای اجرا کردن یک یا مجموعهای ازدستورات بر روی یک شی.
REVOKE: حذف یا محدود کردن قدرت اجرای کاربران.
مثال 6:
SELECT * FROM inventory;
همهٔ اقلام موجود در جدول inventory بازیابی شود.