مقدمه
زبان پرس و جو ساختاریافته، که بیشتر با نام SQL شناخته می شود، انعطاف پذیری زیادی را از نظر نحوه درج داده ها در جداول فراهم می کند. به عنوان مثال، میتوانید ردیفهای جداگانه دادهها را با کلمه کلیدی VALUES مشخص کنید، مجموعهای از کل دادهها را از جداول موجود با کوئریهای SELECT کپی کنید، و همچنین ستونها را به گونهای تعریف کنید که باعث شود SQL دادهها را به طور خودکار در آنها وارد کند.
در این راهنما، نحوه استفاده از سینتکس INSERT INTO SQL برای افزودن داده ها به جداول با هر یک از این روش ها را بررسی خواهیم کرد.
پیش نیازها
برای پیروی از این راهنما، به رایانه ای نیاز دارید که دارای نوعی سیستم مدیریت پایگاه داده رابطه ای (RDBMS) است که از SQL استفاده می کند. دستورالعمل ها و مثال های موجود در این راهنما با استفاده از محیط زیر تأیید شدند:
- سروری که اوبونتو 20.04 را اجرا می کند، با یک کاربر غیر ریشه با امتیازات مدیریتی و فایروال پیکربندی شده با UFW.
- MySQL روی سرور نصب و ایمن شده است.
همچنین به یک پایگاه داده و جدولی نیاز دارید که با آن بتوانید درج داده ها را تمرین کنید. اگر اینها را ندارید، میتوانید بخش اتصال به MySQL و راهاندازی یک پایگاه داده نمونه را برای جزئیات بیشتر در مورد نحوه ایجاد پایگاه داده و جدولی که این راهنما در نمونههایی از آن استفاده میکند، بخوانید.
اتصال به MySQL و راه اندازی یک پایگاه داده نمونه
اگر سیستم پایگاه داده SQL شما بر روی یک سرور راه دور اجرا می شود، SSH را از دستگاه محلی خود به سرور خود وارد کنید:
ssh sammy@your_server_ip
سپس اعلان سرور MySQL را باز کنید و نام حساب کاربری MySQL خود را جایگزین سامی کنید:
mysql -u sammy -p
یک پایگاه داده به نام insertDB ایجاد کنید:
CREATE DATABASE insertDB;
اگر پایگاه داده با موفقیت ایجاد شده باشد، خروجی زیر را دریافت خواهید کرد:
Query OK, 1 row affected (0.01 sec)
برای انتخاب پایگاه داده insertDB، عبارت USE زیر را اجرا کنید:
USE insertDB;
Output
Database changed
پس از انتخاب پایگاه داده insertDB، یک جدول درون آن ایجاد کنید. به عنوان مثال، فرض کنید شما صاحب یک کارخانه هستید و می خواهید جدولی برای ذخیره برخی اطلاعات در مورد کارمندان خود ایجاد کنید. این جدول دارای پنج ستون زیر خواهد بود:
name
: نام هر کارمند که با استفاده از نوع داده varchar با حداکثر 30 کاراکتر بیان می شودposition
: این ستون عنوان شغلی هر کارمند را ذخیره می کند که دوباره با استفاده از نوع داده varchar با حداکثر 30 کاراکتر بیان می شود.department
: بخشی که هر کارمند در آن کار می کند، با استفاده از نوع داده varchar اما حداکثر تنها با 20 کاراکتر بیان می شود.hourlyWage
: ستونی برای ثبت دستمزد ساعتی هر کارمند، از نوع داده اعشاری با مقادیر موجود در این ستون به طول حداکثر چهار رقم با دو عدد از آن رقم در سمت راست نقطه اعشار استفاده می کند. بنابراین، محدوده مقادیر مجاز در این ستون 99.99- تا 99.99 استstartDate
: تاریخ استخدام هر کارمند، که با استفاده از نوع داده تاریخ بیان می شود. مقادیر این نوع باید با قالب YYYY-MM-DD مطابقت داشته باشد
جدولی به نام factoryEmployees ایجاد کنید که دارای این پنج ستون باشد:
CREATE TABLE factoryEmployees (
name varchar(30),
position varchar(30),
department varchar(20),
hourlyWage decimal(4,2),
startDate date
);
با آن، شما آماده هستید تا بقیه راهنما را دنبال کنید و شروع به یادگیری نحوه درج داده با SQL کنید.
درج داده ها به صورت دستی
سینتکس کلی برای درج داده در SQL به شکل زیر است:
INSERT INTO table_name
(column1, column2, . . . columnN)
VALUES
(value1, value2, . . . valueN);
برای نشان دادن، دستور INSERT INTO زیر را اجرا کنید تا جدول factoryEmployees با یک ردیف داده بارگیری شود:
INSERT INTO factoryEmployees
(name, position, department, hourlyWage, startDate)
VALUES
('Agnes', 'thingamajig foreman', 'management', 26.50, '2017-05-01');
Output
Query OK, 1 row affected (0.00 sec)
این عبارت با کلمات کلیدی INSERT INTO شروع می شود و به دنبال آن نام جدولی که می خواهید داده ها را در آن درج کنید. پس از نام جدول، فهرستی از ستونهایی است که عبارت دادهها را به آنها اضافه میکند، که در پرانتز پیچیده شدهاند. بعد از لیست ستون، کلمه کلیدی VALUES قرار دارد و سپس مجموعه ای از مقادیر در پرانتز پیچیده شده و با کاما از هم جدا شده اند.
ترتیبی که ستون ها را فهرست می کنید مهم نیست. مهم است که به خاطر داشته باشید که ترتیب مقادیری که ارائه میکنید با ترتیب ستونها مطابقت دارد. SQL همیشه سعی می کند اولین مقدار داده شده را در ستون اول لیست شده، مقدار دوم را در ستون بعدی و غیره وارد کند. برای نشان دادن، عبارت INSERT زیر ردیف دیگری از داده ها را اضافه می کند، اما ستون ها را به ترتیب متفاوتی فهرست می کند:
INSERT INTO factoryEmployees
(department, hourlyWage, startDate, name, position)
VALUES
('production', 15.59, '2018-04-28', 'Jim', 'widget tightener');
Output
Query OK, 1 row affected (0.00 sec)
اگر مقادیر را به درستی تراز نکنید، SQL ممکن است داده های شما را در ستون های اشتباه وارد کند. علاوه بر این، اگر هر یک از مقادیر با نوع داده ستون مغایرت داشته باشد، خطا ایجاد می کند، مانند این مثال:
INSERT INTO factoryEmployees
(name, hourlyWage, position, startDate, department)
VALUES
('Louise', 'doodad tester', 16.50, '2017-05-01', 'quality assurance');
Output
ERROR 1366 (HY000): Incorrect decimal value: 'doodad tester' for column 'hourlyWage' at row 1
توجه داشته باشید که در حالی که باید برای هر ستونی که مشخص می کنید یک مقدار ارائه دهید، لزوماً لازم نیست که هر ستون را در جدول هنگام اضافه کردن یک ردیف جدید از داده ها مشخص کنید. تا زمانی که هیچ یک از ستون هایی که حذف می کنید محدودیتی نداشته باشد که در این مورد خطا ایجاد کند (مانند NOT NULL)، MySQL NULL را به ستون های نامشخص اضافه می کند:
INSERT INTO factoryEmployees
(name, position, hourlyWage)
VALUES
('Harry', 'whatzit engineer', 26.50);
Output
Query OK, 1 row affected (0.01 sec)
اگر قصد دارید یک ردیف با مقادیر برای هر ستون در جدول وارد کنید، اصلاً نیازی به وارد کردن نام ستونها ندارید. به خاطر داشته باشید که مقادیری که وارد میکنید باید همچنان با ترتیبی که ستونها در تعریف جدول تعریف شدهاند، هماهنگ باشند.
در این مثال، مقادیر فهرست شده با ترتیبی که ستون ها در دستور CREATE TABLE جدول factoryEmployee تعریف شده اند، تراز می شوند:
INSERT INTO factoryEmployees
VALUES
('Marie', 'doodad welder', 'production', 27.88, '2018-03-29');
Output
Query OK, 1 row affected (0.00 sec)
همچنین میتوانید با جدا کردن هر ردیف با کاما، چندین رکورد را همزمان اضافه کنید، مانند این:
INSERT INTO factoryEmployees
VALUES
('Giles', 'gizmo inspector', 'quality assurance', 26.50, '2019-08-06'),
('Daphne', 'gizmo presser', 'production', 32.45, '2017-11-12'),
('Joan', 'whatzit analyst', 'quality assurance', 29.00, '2017-04-29');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
کپی کردن داده ها با بیانیه های SELECT
به جای تعیین ردیف به ردیف داده ها، می توانید چندین ردیف از داده ها را از یک جدول کپی کرده و با یک کوئری SELECT در جدول دیگر وارد کنید.
سینتکس این نوع عملیات به شکل زیر است:
INSERT INTO table_A (col_A1, col_A2, col_A3)
SELECT col_B1, col_B2, col_B3
FROM table_B;
به جای دنبال کردن لیست ستون با کلمه کلیدی VALUES، این نحو مثال آن را با یک عبارت SELECT دنبال می کند. عبارت SELECT در این نحو مثال فقط شامل عبارت FROM است، اما هر پرس و جو معتبری می تواند کار کند.
برای نشان دادن، عملیات CREATE TABLE زیر را اجرا کنید تا یک جدول جدید به نام showroomEmployees ایجاد کنید. توجه داشته باشید که نامها و انواع دادههای ستونهای این جدول با سه ستون از جدول factoryEmployees مورد استفاده در بخش قبل یکسان است:
CREATE TABLE showroomEmployees (
name varchar(30),
hourlyWage decimal(4,2),
startDate date
);
Output
Query OK, 0 rows affected (0.02 sec)
اکنون می توانید این جدول جدید را با برخی از داده ها از جدول factoryEmployees که قبلاً با گنجاندن یک کوئری SELECT در عبارت INSERT INTO ایجاد شده است، بارگیری کنید.
اگر کوئری SELECT همان تعداد ستون را به همان ترتیب ستونهای جدول هدف برمیگرداند، و همچنین دارای انواع دادههای منطبق هستند، میتوانید فهرست ستونها را از عبارت INSERT INTO حذف کنید:
INSERT INTO showroomEmployees
SELECT
factoryEmployees.name,
factoryEmployees.hourlyWage,
factoryEmployees.startDate
FROM factoryEmployees
WHERE name = 'Agnes';
Output
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
دستور SELECT در این عملیات شامل یک عبارت WHERE است که باعث می شود پرس و جو فقط ردیف هایی را از جدول factoryEmployees که ستون نام آن حاوی مقدار Agnes است برگرداند. از آنجایی که تنها یک ردیف در جدول منبع وجود دارد، فقط آن ردیف در جدول کارکنان نمایشگاه کپی می شود.
برای تأیید این موضوع، کوئری زیر را اجرا کنید تا هر رکورد در جدول کارمندان نمایشگاه را بازگرداند:
SELECT * FROM showroomEmployees;
Output
+-------+------------+------------+
| name | hourlyWage | startDate |
+-------+------------+------------+
| Agnes | 26.50 | 2017-05-01 |
+-------+------------+------------+
1 row in set (0.00 sec)
می توانید چندین ردیف داده را با هر پرس و جوی وارد کنید که بیش از یک ردیف از جدول منبع را برمی گرداند. به عنوان مثال، پرس و جو در عبارت زیر، هر رکوردی را در پایگاه داده factoryEmployees که در آن مقدار در ستون name با J شروع نمی شود، برمی گرداند:
INSERT INTO showroomEmployees
SELECT
factoryEmployees.name,
factoryEmployees.hourlyWage,
factoryEmployees.startDate
FROM factoryEmployees
WHERE name NOT LIKE 'J%';
Output
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
برای برگرداندن هر رکورد در جدول کارکنان نمایشگاه، دوباره این کوئری را اجرا کنید:
SELECT * FROM showroomEmployees;
+--------+------------+------------+
| name | hourlyWage | startDate |
+--------+------------+------------+
| Agnes | 26.50 | 2017-05-01 |
| Agnes | 26.50 | 2017-05-01 |
| Harry | 26.50 | NULL |
| Marie | 27.88 | 2018-03-29 |
| Giles | 26.50 | 2019-08-06 |
| Daphne | 32.45 | 2017-11-12 |
+--------+------------+------------+
6 rows in set (0.00 sec)
توجه کنید که دو ردیف یکسان با Agnes در ستون نام وجود دارد. هر بار که یک عبارت INSERT INTO را اجرا می کنید که از SELECT استفاده می کند، SQL نتایج حاصل از پرس و جو را به عنوان مجموعه جدیدی از داده ها در نظر می گیرد. مگر اینکه محدودیت های خاصی را بر روی جدول خود اعمال کنید یا پرس و جوهای دقیق تری ایجاد کنید، هیچ چیز مانع از بارگیری پایگاه داده شما با رکوردهای تکراری هنگام اضافه کردن داده هایی مانند این نیست.
درج اطلاعات به صورت خودکار
هنگام ایجاد جدول، می توانید ویژگی های خاصی را به ستون ها اعمال کنید که باعث می شود RDBMS آنها را به طور خودکار با داده ها پر کند.
برای توضیح، عبارت زیر را اجرا کنید تا جدولی به نام کارآموز تعریف شود. با این کار جدولی به نام interns ایجاد می شود که دارای سه ستون است. اولین ستون در این مثال، internID، داده هایی از نوع int را در خود جای می دهد. البته توجه داشته باشید که ویژگی AUTO_INCREMENT را نیز شامل می شود. این ویژگی باعث می شود که SQL به طور خودکار یک مقدار عددی منحصر به فرد را برای هر ردیف جدید ایجاد کند که به طور پیش فرض با 1 شروع می شود و سپس با هر رکورد بعدی یک عدد افزایش می یابد.
به طور مشابه، ستون دوم، بخش، شامل کلمه کلیدی DEFAULT است. اگر بخش را از لیست ستونی عبارت INSERT INTO حذف کنید، باعث می شود RDBMS مقدار پیش فرض – “production” در این مثال را به طور خودکار وارد کند:
CREATE TABLE interns (
internID int AUTO_INCREMENT PRIMARY KEY,
department varchar(20) DEFAULT 'production',
name varchar(30)
);
برای نشان دادن این ویژگیها، با اجرای دستور INSERT INTO زیر، جدول کارآموزان را با مقداری داده بارگیری کنید. این عملیات فقط مقادیر ستون نام را مشخص می کند:
INSERT INTO interns (name) VALUES ('Pierre'), ('Sheila'), ('Francois');
Output
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
سپس این کوئری را اجرا کنید تا هر رکورد از جدول برگردد:
SELECT * FROM interns;
Output
+----------+------------+----------+
| internID | department | name |
+----------+------------+----------+
| 1 | production | Pierre |
| 2 | production | Sheila |
| 3 | production | Francois |
+----------+------------+----------+
3 rows in set (0.00 sec)
این خروجی نشان میدهد که به دلیل تعاریف ستونها، عبارت قبلی INSERT INTO مقادیری را به هر دو بخش داخلی و بخش اضافه میکند، حتی اگر آنها مشخص نشده باشند.
برای افزودن مقداری غیر از مقدار پیش فرض به ستون بخش، باید آن ستون را در عبارت INSERT INTO مشخص کنید، مانند این:
INSERT INTO interns (name, department)
VALUES
('Jacques', 'management'),
('Max', 'quality assurance'),
('Edith', 'management'),
('Daniel', DEFAULT);
Output
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
توجه داشته باشید که آخرین ردیف از مقادیر ارائه شده در این مثال به جای مقدار رشته، کلمه کلیدی DEFAULT را شامل می شود. این باعث می شود پایگاه داده مقدار پیش فرض (‘production’) را وارد کند:
SELECT * FROM interns;
Output
+----------+-------------------+----------+
| internID | department | name |
+----------+-------------------+----------+
| 1 | production | Pierre |
| 2 | production | Sheila |
| 3 | production | Francois |
| 4 | management | Jacques |
| 5 | quality assurance | Max |
| 6 | management | Edith |
| 7 | production | Daniel |
+----------+-------------------+----------+
7 rows in set (0.00 sec)
نتیجه
با خواندن این راهنما، چندین روش مختلف برای درج دادهها در یک جدول، از جمله تعیین ردیفهای جداگانه دادهها با کلمه کلیدی VALUES، کپی کردن مجموعههای کامل دادهها با کوئریهای SELECT، و تعریف ستونهایی که SQL دادهها را به طور خودکار وارد میکند، یاد گرفتید.
دستورات ذکر شده در اینجا باید روی هر سیستم مدیریت پایگاه داده ای که از SQL استفاده می کند کار کند. به خاطر داشته باشید که هر پایگاه داده SQL از پیادهسازی منحصربهفرد خود از زبان استفاده میکند، بنابراین برای توضیح کاملتر در مورد نحوه مدیریت بیانیه INSERT INTO و گزینههای موجود برای آن، باید به اسناد رسمی DBMS خود مراجعه کنید.