محدودیتها، پیوندها، اجتماع نتایج، مقدار NULL، نام مستعار و ایندکسها در SQL
محدودیتهای SQL
محدودیتها قواعدی هستند که روی ستونهای دادهٔ جدول اعمال میشوند تا نوع دادهای را که میتواند وارد جدول شود محدود کنند. این کار به دقت و قابلیت اعتماد دادههای پایگاه داده کمک میکند. محدودیت میتواند در سطح ستون یا در سطح جدول تعریف شود؛ محدودیت سطح ستون فقط روی یک ستون اثر میگذارد، در حالی که محدودیت سطح جدول کل جدول را دربر میگیرد.
محدودیتهای رایج SQL عبارتاند از:
NOT NULL: اجازه نمیدهد ستون مقدار NULL داشته باشد.
DEFAULT: اگر مقداری مشخص نشده باشد، مقدار پیشفرض ستون را فراهم میکند.
UNIQUE: تضمین میکند همهٔ مقادیر یک ستون متفاوت باشند.
PRIMARY KEY: هر سطر یا رکورد جدول را بهطور یکتا شناسایی میکند.
FOREIGN KEY: سطر یا رکوردی را در جدول دیگری ارجاع میدهد و دو جدول را به هم مرتبط میکند.
CHECK: تضمین میکند مقادیر ستون شرط تعیینشده را برآورده کنند.
INDEX: برای ایجاد مسیر دسترسی سریع و بازیابی سریع دادهها بهکار میرود.
محدودیت NOT NULL
بهطور پیشفرض، یک ستون میتواند مقدار NULL داشته باشد. اگر نباید ستونی NULL بپذیرد، باید محدودیت NOT NULL برای آن تعریف شود. NULL با «نبودن داده» به معنای رشتهٔ خالی یا صفر یکسان نیست؛ در اینجا نشاندهندهٔ دادهٔ ناشناخته است.
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
اگر جدول از قبل ایجاد شده باشد، در Oracle و MySQL میتوان برای ستون SALARY محدودیت NOT NULL را به شکل زیر افزود:
ALTER TABLE CUSTOMERS
MODIFY SALARY DECIMAL (18, 2) NOT NULL;
محدودیت DEFAULT
DEFAULT زمانی که دستور INSERT INTO برای یک ستون مقدار مشخصی ارائه نمیکند، مقدار پیشفرض آن ستون را تعیین میکند. در نمونهٔ زیر، مقدار پیشفرض SALARY برابر 5000.00 است.
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2) DEFAULT 5000.00,
PRIMARY KEY (ID)
);
ALTER TABLE CUSTOMERS
MODIFY SALARY DECIMAL (18, 2) DEFAULT 5000.00;
برای حذف مقدار پیشفرض، متن منبع این دستور را ارائه میکند:
ALTER TABLE CUSTOMERS
ALTER COLUMN SALARY DROP DEFAULT;
محدودیت UNIQUE
UNIQUE مانع از آن میشود که دو رکورد برای یک ستون مشخص مقدار یکسان داشته باشند. در مثال زیر ستون AGE یکتا تعریف شده است:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL UNIQUE,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
ALTER TABLE CUSTOMERS
MODIFY AGE INT NOT NULL UNIQUE;
همچنین میتوان محدودیت را نامگذاری کرد و آن را روی چند ستون قرار داد:
ALTER TABLE CUSTOMERS
ADD CONSTRAINT myUniqueConstraint UNIQUE(AGE, SALARY);
حذف محدودیت:
ALTER TABLE CUSTOMERS
DROP CONSTRAINT myUniqueConstraint;
در MySQL، متن منبع این صورت را نیز نشان میدهد:
ALTER TABLE CUSTOMERS
DROP INDEX myUniqueConstraint;
PRIMARY KEY (کلید اصلی)
کلید اصلی فیلدی است که هر سطر یا رکورد را بهطور یکتا شناسایی میکند. مقدارهای کلید اصلی باید یکتا باشند و ستون کلید اصلی نمیتواند NULL باشد. هر جدول فقط یک کلید اصلی دارد، اما کلید اصلی میتواند از یک یا چند فیلد ساخته شود؛ کلیدی که از چند فیلد تشکیل شده باشد «کلید مرکب» نام دارد.
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
اگر جدول موجود باشد:
ALTER TABLE CUSTOMER ADD PRIMARY KEY (ID);
نمونهٔ کلید اصلی مرکب:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID, NAME)
);
ALTER TABLE CUSTOMERS
ADD CONSTRAINT PK_CUSTID PRIMARY KEY (ID, NAME);
برای حذف کلید اصلی، منبع این دستور را ذکر میکند:
ALTER TABLE CUSTOMERS DROP PRIMARY KEY;
FOREIGN KEY (کلید خارجی)
کلید خارجی برای مرتبطکردن دو جدول بهکار میرود و گاهی «کلید ارجاعدهنده» نیز نامیده میشود. مقدار یک ستون یا ترکیبی از ستونهای کلید خارجی با کلید اصلی جدولی دیگر مطابقت دارد. بنابراین رابطهٔ دو جدول با تطبیق کلید اصلی یکی از جدولها با کلید خارجی جدول دوم شکل میگیرد.
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
CREATE TABLE ORDERS (
ID INT NOT NULL,
DATE DATETIME,
CUSTOMER_ID INT references CUSTOMERS(ID),
AMOUNT double,
PRIMARY KEY (ID)
);
اگر جدول ORDERS موجود باشد:
ALTER TABLE ORDERS
ADD FOREIGN KEY (Customer_ID) REFERENCES CUSTOMERS (ID);
حذف کلید خارجی طبق متن منبع:
ALTER TABLE ORDERS
DROP FOREIGN KEY;
محدودیت CHECK
CHECK شرطی را روی مقداری که وارد رکورد میشود بررسی میکند. اگر شرط نادرست باشد، رکورد محدودیت را نقض کرده و وارد جدول نمیشود. مثال زیر اجازهٔ ثبت مشتری زیر ۱۸ سال را نمیدهد:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL CHECK (AGE >= 18),
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
ALTER TABLE CUSTOMERS
MODIFY AGE INT NOT NULL CHECK (AGE >= 18);
ALTER TABLE CUSTOMERS
ADD CONSTRAINT myCheckConstraint CHECK(AGE >= 18);
برای حذف محدودیت CHECK، متن منبع این دستور را ارائه میکند و یادآور میشود که این نحو در MySQL کار نمیکند:
ALTER TABLE CUSTOMERS
DROP CONSTRAINT myCheckConstraint;
INDEX
ایندکس برای ایجاد و بازیابی سریع داده بهکار میرود. ایندکس میتواند روی یک ستون یا گروهی از ستونها ساخته شود. متن منبع توضیح میدهد که هنگام ایجاد ایندکس، برای سطرها ROWID در نظر گرفته میشود و سپس داده مرتب میشود. ایندکس مناسب برای Performance (کارایی) پایگاه دادههای بزرگ مفید است، اما هنگام ایجاد آن باید دقت کرد؛ زیرا اگرچه عملیات را سریع میکند، خود ایندکس فضای اضافی مصرف میکند.
CREATE INDEX index_name
ON table_name ( column1, column2.....);
DROP INDEX index_name;
حذف محدودیتها و یکپارچگی داده
محدودیتها را میتوان با دستورهای متناسب با DBMS حذف کرد. محدودیتهای یکپارچگی برای تضمین صحت و سازگاری دادهها استفاده میشوند و قواعدی مانند یکتایی، عدم پذیرش مقدار ناشناخته در فیلدهای ضروری، ارتباط معتبر میان جدولها و رعایت شرطهای تعریفشده را برقرار میکنند.
JOIN (پیوند) در SQL
JOIN برای ترکیب رکوردهای دو یا چند جدول در یک پایگاه داده استفاده میشود. پیوند وسیلهای برای ترکیب فیلدهای دو جدول با استفاده از مقادیری است که میان آنها مشترکاند. در مثالهای این بخش، جدولهای CUSTOMERS و ORDERS مبنا هستند.
CUSTOMERS
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
ORDERS
+-----+---------------------+-------------+--------+
| OID | DATE | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 | 3 | 3000 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060 |
+-----+---------------------+-------------+--------+
INNER JOIN (پیوند داخلی)
INNER JOIN سطرهایی را برمیگرداند که در هر دو جدول بر اساس شرط پیوند تطبیق دارند.
SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;
نمونه:
SQL> SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
INNER JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
+----+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+----+----------+--------+---------------------+
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
+----+----------+--------+---------------------+
LEFT JOIN (پیوند چپ)
LEFT JOIN همهٔ سطرهای جدول سمت چپ را بازمیگرداند، حتی اگر در جدول سمت راست تطبیقی وجود نداشته باشد. برای سطرهای بدون تطبیق، ستونهای جدول راست مقدار NULL میگیرند.
SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_filed = table2.common_field;
SQL> SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
+----+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+----+----------+--------+---------------------+
| 1 | Ramesh | NULL | NULL |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
| 5 | Hardik | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | Muffy | NULL | NULL |
+----+----------+--------+---------------------+
RIGHT JOIN (پیوند راست)
RIGHT JOIN همهٔ سطرهای جدول سمت راست را بازمیگرداند، حتی اگر در جدول چپ تطبیقی نباشد؛ در این حالت ستونهای سمت چپ برای رکورد بدون تطبیق NULL خواهند بود.
SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_filed = table2.common_field;
SQL> SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
RIGHT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+
FULL JOIN (پیوند کامل)
FULL JOIN نتیجهٔ پیوند بیرونی چپ و راست را با هم ترکیب میکند. جدول حاصل همهٔ رکوردهای هر دو جدول را دارد و در جاهایی که تطبیق وجود ندارد، سمت مربوط با NULL پر میشود.
SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_filed = table2.common_field;
SQL> SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
FULL JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
اگر DBMS از FULL JOIN پشتیبانی نکند ــ متن منبع MySQL را مثال میزند ــ میتوان نتیجهٔ دو پیوند را با UNION ALL ترکیب کرد:
SQL> SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
UNION ALL
SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
RIGHT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
SELF JOIN (خودپیوند)
SELF JOIN یک جدول را به خودش پیوند میدهد، بهگونهای که انگار دو جدول مجزا هستند. برای این کار دستکم یکی از نمونههای جدول در همان دستور SQL بهطور موقت نام دیگری میگیرد.
SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_filed = b.common_field;
SQL> SELECT a.ID, b.NAME, a.SALARY
FROM CUSTOMERS a, CUSTOMERS b
WHERE a.SALARY < b.SALARY;
+----+----------+---------+
| ID | NAME | SALARY |
+----+----------+---------+
| 2 | Ramesh | 1500.00 |
| 2 | kaushik | 1500.00 |
| 1 | Chaitali | 2000.00 |
| 2 | Chaitali | 1500.00 |
| 3 | Chaitali | 2000.00 |
| 6 | Chaitali | 4500.00 |
| 1 | Hardik | 2000.00 |
| 2 | Hardik | 1500.00 |
| 3 | Hardik | 2000.00 |
| 4 | Hardik | 6500.00 |
| 6 | Hardik | 4500.00 |
| 1 | Komal | 2000.00 |
| 2 | Komal | 1500.00 |
| 3 | Komal | 2000.00 |
| 1 | Muffy | 2000.00 |
| 2 | Muffy | 1500.00 |
| 3 | Muffy | 2000.00 |
| 4 | Muffy | 6500.00 |
| 5 | Muffy | 8500.00 |
| 6 | Muffy | 4500.00 |
+----+----------+---------+
CARTESIAN JOIN / CROSS JOIN (پیوند دکارتی)
پیوند دکارتی یا CROSS JOIN حاصلضرب دکارتی مجموعه رکوردهای دو یا چند جدول را برمیگرداند. از نظر نتیجه، مانند پیوند داخلیای است که شرط آن همیشه درست است یا اصلاً شرط پیوندی ندارد.
SELECT table1.column1, table2.column2...
FROM table1, table2 [, table3 ];
SQL> SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS, ORDERS;
در مثال منبع، چون CUSTOMERS هفت سطر و ORDERS چهار سطر دارد، نتیجه شامل ۲۸ ترکیب است؛ هر مشتری یکبار با هر سفارش ترکیب میشود.
UNION و عملگرهای مجموعهای
UNION
عملگر UNION نتیجهٔ دو یا چند دستور SELECT را با هم ترکیب میکند، بدون اینکه سطرهای تکراری را برگرداند. برای استفاده از UNION، هر SELECT باید تعداد ستونها و عبارتهای ستونی یکسان، انواع دادهٔ سازگار و ترتیب یکسان داشته باشد؛ طول ستونها الزاماً نباید یکسان باشد.
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition];
SQL> SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
UNION
SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
RIGHT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 1 | Ramesh | NULL | NULL |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
| 5 | Hardik | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | Muffy | NULL | NULL |
+------+----------+--------+---------------------+
UNION ALL
UNION ALL نیز نتیجهٔ دو SELECT را ترکیب میکند، با این تفاوت که سطرهای تکراری را نیز نگه میدارد. همان قواعد تعداد ستون، نوع داده و ترتیب ستونها برای آن برقرار است.
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION ALL
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition];
در مثال منبع، اجرای دو پیوند چپ و راست با UNION ALL باعث میشود سطرهای مشترک نیز دوباره در نتیجه ظاهر شوند.
INTERSECT
عملگر INTERSECT فقط رکوردهایی را برمیگرداند که در نتیجهٔ هر دو SELECT مشترک باشند. قواعد سازگاری ستونها همانند UNION است.
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
INTERSECT
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition];
در مثال جدولهای CUSTOMERS و ORDERS، اشتراک پیوند چپ و راست همان رکوردهایی است که در هر دو طرف تطبیق دارند: سفارشهای مشتریان با شناسههای ۲، ۳ و ۴.
EXCEPT
EXCEPT رکوردهایی را برمیگرداند که در نتیجهٔ SELECT نخست وجود دارند ولی در نتیجهٔ SELECT دوم نیستند.
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
EXCEPT
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition];
SQL> SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
EXCEPT
SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
RIGHT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
+----+---------+--------+------+
| ID | NAME | AMOUNT | DATE |
+----+---------+--------+------+
| 1 | Ramesh | NULL | NULL |
| 5 | Hardik | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | Muffy | NULL | NULL |
+----+---------+--------+------+
مقادیر NULL در SQL
NULL برای نمایش یک مقدار گمشده یا ناشناخته استفاده میشود. فیلدی با مقدار NULL فاقد مقدار است و این وضعیت با عدد صفر یا رشتهای شامل فاصله متفاوت است.
در تعریف جدول زیر، ستونهای ADDRESS و SALARY محدودیت NOT NULL ندارند و بنابراین میتوانند NULL باشند:
SQL> CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
مقایسهٔ یک مقدار ناشناخته با مقدارهای دیگر نتیجهای ناشناخته دارد؛ بنابراین برای آزمودن NULL باید از IS NULL یا IS NOT NULL استفاده کرد.
SQL> SELECT ID, NAME, AGE, ADDRESS, SALARY
FROM CUSTOMERS
WHERE SALARY IS NOT NULL;
این پرسوجو در دادهٔ نمونه رکوردهای شناسهٔ ۱ تا ۵ را بازمیگرداند؛ رکوردهای ۶ و ۷ فاقد مقدار حقوقاند.
SQL> SELECT ID, NAME, AGE, ADDRESS, SALARY
FROM CUSTOMERS
WHERE SALARY IS NULL;
+----+-------+-----+---------+--------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+-------+-----+---------+--------+
| 6 | Komal | 22 | MP | |
| 7 | Muffy | 24 | Indore | |
+----+-------+-----+---------+--------+
نام مستعار (Alias) در SQL
میتوان جدول یا ستون را بهصورت موقت با نام دیگری که Alias (نام مستعار) خوانده میشود معرفی کرد. نام مستعار جدول فقط در همان دستور SQL معتبر است و نام واقعی جدول در پایگاه داده تغییر نمیکند. نام مستعار ستون نیز برای تغییر نام نمایشی ستون در یک پرسوجوی مشخص استفاده میشود.
SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];
SELECT column_name AS alias_name
FROM table_name
WHERE [condition];
نمونهٔ نام مستعار جدول:
SQL> SELECT C.ID, C.NAME, C.AGE, O.AMOUNT
FROM CUSTOMERS AS C, ORDERS AS O
WHERE C.ID = O.CUSTOMER_ID;
+----+----------+-----+--------+
| ID | NAME | AGE | AMOUNT |
+----+----------+-----+--------+
| 3 | kaushik | 23 | 3000 |
| 3 | kaushik | 23 | 1500 |
| 2 | Khilan | 25 | 1560 |
| 4 | Chaitali | 25 | 2060 |
+----+----------+-----+--------+
نمونهٔ نام مستعار ستون:
SQL> SELECT ID AS CUSTOMER_ID, NAME AS CUSTOMER_NAME
FROM CUSTOMERS
WHERE SALARY IS NOT NULL;
+-------------+---------------+
| CUSTOMER_ID | CUSTOMER_NAME |
+-------------+---------------+
| 1 | Ramesh |
| 2 | Khilan |
| 3 | kaushik |
| 4 | Chaitali |
| 5 | Hardik |
| 6 | Komal |
| 7 | Muffy |
+-------------+---------------+
ایندکسها در SQL
ایندکسها جدولهای جستوجوی ویژهای هستند که موتور پایگاه داده میتواند برای سریعترکردن بازیابی داده از آنها استفاده کند. به بیان ساده، ایندکس اشارهگری به دادههای یک جدول است و از این نظر شبیه نمایهٔ انتهای یک کتاب عمل میکند: ابتدا موضوع را در نمایه پیدا میکنید و سپس به شمارهٔ صفحهٔ مربوط میروید.
ایندکس میتواند پرسوجوهای SELECT و شرطهای WHERE را سریعتر کند، اما عملیات ورود داده با UPDATE و INSERT را کندتر میکند. ایجاد یا حذف ایندکس دادهٔ اصلی جدول را تغییر نمیدهد.
دستور CREATE INDEX امکان نامگذاری ایندکس، تعیین جدول و ستون یا ستونهای موردنظر و در بعضی محیطها تعیین ترتیب صعودی یا نزولی را فراهم میکند. ایندکسها همچنین میتوانند یکتا باشند تا از ورود مقدارهای تکراری در ستون یا ترکیب ستونهای ایندکسشده جلوگیری شود.
دستور CREATE INDEX
CREATE INDEX index_name ON table_name;
ایندکس تکستونی
CREATE INDEX index_name
ON table_name (column_name);
ایندکس یکتا
ایندکس یکتا افزون بر Performance (کارایی)، برای یکپارچگی داده نیز بهکار میرود و اجازهٔ ورود مقدار تکراری را نمیدهد. نحو ارائهشده در منبع:
CREATE INDEX index_name
ON table_name (column_name);
ایندکس مرکب
ایندکس مرکب روی دو یا چند ستون جدول ساخته میشود:
CREATE INDEX index_name
ON table_name (column1, column2);
در انتخاب میان ایندکس تکستونی و مرکب باید ستونهایی را در نظر گرفت که مرتب در شرطهای WHERE بهعنوان فیلتر استفاده میشوند. اگر تنها یک ستون غالب است، ایندکس تکستونی مناسب است؛ اگر دو یا چند ستون با هم بهطور مکرر فیلتر میشوند، ایندکس مرکب انتخاب بهتری است.
ایندکسهای ضمنی
ایندکسهای ضمنی بهطور خودکار توسط سرور پایگاه داده هنگام ایجاد بعضی اشیا ساخته میشوند. برای محدودیتهای کلید اصلی و محدودیتهای یکتا معمولاً ایندکس بهطور خودکار ایجاد میشود.
دستور DROP INDEX
ایندکس را میتوان با دستور DROP حذف کرد. هنگام حذف باید دقت کرد، زیرا ممکن است Performance (کارایی) بهتر یا بدتر شود.
DROP INDEX index_name;
چه زمانی باید از ایندکس اجتناب کرد؟
- روی جدولهای کوچک معمولاً نباید ایندکس ایجاد شود.
- برای جدولهایی که مرتب عملیات بزرگ و دستهای
UPDATE یا INSERT دارند، باید در استفاده از ایندکس تجدیدنظر کرد.
- ستونهایی که تعداد زیادی مقدار
NULL دارند معمولاً گزینهٔ خوبی برای ایندکس نیستند.
- ستونهایی که مرتب دستکاری و تغییر میکنند بهتر است ایندکس نشوند.