دستور SQL INSERT INTO SELECT. Transact-SQL - درج داده اضافه کردن بخشی از ردیف ها

با استفاده از SQL می توانید اطلاعات را از یک جدول به جدول دیگر کپی کنید.

دستور INSERT INTO SELECT داده ها را از یک جدول کپی می کند و آن را در جدول موجود وارد می کند.

دستور SQL INSERT INTO SELECT،

دستور INSERT INTO SELECT داده ها را از یک جدول انتخاب می کند و آن را در جدول موجود وارد می کند. هیچ یک از ردیف های موجود در جدول هدف تغییر نمی کند.

SQL INSERT INTO SELECT، Syntax

ما می توانیم تمام ستون ها را از یک جدول به جدول دیگر کپی کنیم:

درج کنید جدول 2
SELECT * FROM میز 1؛

یا می‌توانیم فقط ستون‌هایی را که می‌خواهیم در جدول موجود دیگری کپی کنیم:

درج کنید جدول 2
(نام(های)_ستون)
انتخاب کنید نام(های) ستون
از جانب میز 1؛

نسخه آزمایشی پایگاه داده

در این آموزش از پایگاه داده معروف Northwind استفاده خواهیم کرد.

در زیر منتخبی از جدول "مشتریان" آمده است:

شناسه کاربرنام مشتریفرد تماسنشانیشهرکد پستییک کشور
1 آلفرد فوترکیست ماریا آندرس اوبره خ. 57 برلین 12209 آلمان
2 Ana Trujillo Emparedados y Helados آنا تروخیلو آودا. de la Constitucion 2222 مکزیک D.F. 05021 مکزیک
3 آنتونیو مورنو تاکوریا آنتونیو مورنو ماتادروس 2312 مکزیک D.F. 05023 مکزیک

و انتخاب از جدول "تامین کنندگان":

SQL INSERT INTO SELECT، مثالها

کپی کردن تنها چند ستون از "تامین کنندگان" به "مشتریان":

کپی کردن فقط تامین کنندگان آلمانی به "مشتریان".

آخرین به روز رسانی: 1396/07/13

برای اضافه کردن داده ها، از دستور INSERT استفاده کنید که دستور رسمی زیر را دارد:

درج نام جدول [(فهرست_ستون)] VALUES (مقدار1، مقدار2، ... مقدارN)

ابتدا عبارت INSERT INTO می آید، سپس در داخل پرانتز می توانید لیستی از ستون های جدا شده با کاما را مشخص کنید که داده ها باید به آنها اضافه شوند و در پایان، پس از کلمه VALUES، مقادیری که برای ستون ها اضافه می شود در لیست قرار می گیرند. پرانتز.

به عنوان مثال، فرض کنید پایگاه داده زیر قبلا ایجاد شده است:

ایجاد پایگاه داده productsdb; GO USE productsdb; محصولات جدول ایجاد کنید (ID INT IDENTITY PRIMARY KEY، نام محصول NVARCHAR(30) NOT NULL، سازنده NVARCHAR(20) NOT NULL، ProductCount INT DEFAULT 0، Price MONEY NOT NULL)

بیایید با استفاده از دستور INSERT یک خط به آن اضافه کنیم:

مقادیر محصولات را درج کنید ("iPhone 7"، "Apple"، 5، 52000)

پس از اجرای موفقیت آمیز در SQL Server Management Studio، پیام "1 ردیف(های) تحت تاثیر قرار گرفت" باید در قسمت پیام ظاهر شود:

شایان ذکر است که مقادیر ستون های داخل پرانتز پس از کلمه کلیدی VALUES به ترتیبی که آنها اعلام شده اند ارسال می شوند. به عنوان مثال، در عبارت CREATE TABLE بالا، می بینید که ستون اول Id است. اما از آنجایی که ویژگی IDENTITY برای آن مشخص شده است، مقدار این ستون به طور خودکار تولید می شود و می توان آن را حذف کرد. ستون دوم نشان دهنده ProductName است، بنابراین اولین مقدار، رشته "iPhone 7" به آن ستون ارسال می شود. مقدار دوم - رشته "Apple" به ستون سوم سازنده و غیره منتقل می شود. یعنی مقادیر به صورت زیر به ستون ها منتقل می شوند:

    نام محصول: "iPhone 7"

    سازنده: "Apple"

همچنین، هنگام وارد کردن مقادیر، می‌توانید ستون‌های فوری که مقادیر به آن‌ها اضافه می‌شوند را مشخص کنید:

درج در محصولات (نام محصول، قیمت، سازنده) VALUES ("iPhone 6S"، 41000، "Apple")

در اینجا مقدار فقط برای سه ستون مشخص شده است. علاوه بر این، اکنون مقادیر به ترتیب ستون ها منتقل می شوند:

    نام محصول: "iPhone 6S"

    سازنده: "Apple"

برای ستون‌های نامشخص (در این مورد ProductCount)، اگر ویژگی DEFAULT مشخص شده باشد، یک مقدار پیش‌فرض اضافه می‌شود، یا یک مقدار NULL. با این حال، ستون های نامشخص باید nullable یا دارای ویژگی DEFAULT باشند.

همچنین می توانیم چندین خط را به طور همزمان اضافه کنیم:

درج در محصولات VALUES ("iPhone 6"، "Apple"، 3، 36000)، ("Galaxy S8"، "Samsung"، 2، 46000)، ("Galaxy S8 Plus"، "Samsung"، 1، 56000)

در این صورت سه ردیف به جدول اضافه می شود.

همچنین، هنگام اضافه کردن، می‌توانیم تعیین کنیم که ستون باید یک مقدار پیش‌فرض با استفاده از کلمه کلیدی DEFAULT یا یک مقدار NULL داشته باشد:

درج در محصولات (نام محصول، سازنده، تعداد محصول، قیمت) VALUES ("Mi6"، "Xiaomi"، پیش فرض، 28000)

در این حالت، مقدار پیش‌فرض ستون ProductCount استفاده می‌شود (اگر تنظیم شده باشد، اگر تنظیم نشده باشد، NULL).

اگر همه ستون‌ها دارای یک ویژگی DEFAULT هستند که یک مقدار پیش‌فرض را مشخص می‌کند، یا nullable هستند، می‌توانید مقادیر پیش‌فرض را برای همه ستون‌ها درج کنید:

درج در محصولات مقادیر پیش فرض

اما اگر جدول Products را بگیریم، چنین دستوری با خطا مواجه می شود، زیرا چندین فیلد ویژگی DEFAULT را ندارند و در عین حال مقدار NULL را مجاز نمی دانند.

علاوه بر عبارت SELECT که قبلاً مورد بحث قرار گرفت، زبان دستکاری داده ها (DML) شامل سه عبارت دیگر است: INSERT، UPDATE، و DELETE. مانند دستور SELECT، این سه دستور بر روی جداول یا نماها عمل می کنند. این مقاله عبارت INSERT را مورد بحث قرار می دهد و دو عبارت دیگر در مقاله بعدی مورد بحث قرار می گیرند.

عبارت INSERTسطرها (یا قسمت هایی از ردیف ها) را در جدول قرار می دهد. دو شکل متفاوت از این دستورالعمل وجود دارد:

درج tab_name [(col_list)] مقادیر پیش‌فرض | VALUES (( پیش فرض | NULL | عبارت ) [ ,...n]) INSERT INTO tab_name | view_name [(col_list)] (select_statement | execute_statement) قراردادهای نحوی

فرم اول دستورالعمل به شما امکان می دهد یک ردیف (یا بخشی از آن) را در جدول قرار دهید. و شکل دوم دستور INSERT به شما امکان می دهد مجموعه نتایج یک دستور SELECT یا یک رویه ذخیره شده اجرا شده توسط یک دستور EXECUTE را در جدول درج کنید. رویه ذخیره شده باید داده ها را برای درج در جدول برگرداند. هنگامی که با دستور INSERT استفاده می‌شود، یک دستور SELECT می‌تواند مقادیری را از یک جدول متفاوت یا یکسان که داده‌ها در آن درج می‌شوند انتخاب کند، تا زمانی که انواع داده‌های ستون‌های مربوطه با هم سازگار باشند.

برای هر دو فرم، نوع داده هر مقدار درج شده باید با نوع داده ستون جدول مربوطه سازگار باشد. تمام رشته ها و داده های موقت باید در گیومه محصور شوند. لازم نیست مقادیر عددی در گیومه قرار بگیرند.

درج یک ردیف

برای هر دو شکل عبارت INSERT، مشخص کردن لیست ستون به صراحت اختیاری است. لیست نکردن ستون ها مانند مشخص کردن همه ستون ها در جدول است.

پارامتر DEFAULT VALUESمقادیر پیش فرض را برای همه ستون ها درج می کند. ستون هایی با نوع داده TIMESTAMP یا ویژگی IDENTITY به طور پیش فرض با مقادیری که به طور خودکار توسط سیستم تولید می شوند درج می شوند. برای ستون‌های دیگر انواع داده‌ها، مقدار پیش‌فرض غیر تهی متناظر در صورت موجود بودن یا NULL درج می‌شود. اگر ستونی مقادیر null را مجاز نکند و یک مقدار پیش فرض تعریف نشده باشد، عبارت INSERT از کار می افتد و یک پیام نمایش داده می شود.

مثال زیر ردیف‌هایی را در جدول Employee در پایگاه داده SampleDb وارد می‌کند و استفاده از عبارت INSERT را برای درج مقدار کمی داده در پایگاه داده نشان می‌دهد:

از SampleDb استفاده کنید. INSERT INTO Employee VALUES (34990، "Andrey"، "Batonov"، "d1"); INSERT INTO Employee VALUES (38640، "Alexey"، "Vasin"، "d3");

دو روش مختلف برای درج مقادیر در یک ردیف جدید وجود دارد. عبارت INSERT در مثال زیر به صراحت از کلمه کلیدی NULL استفاده می کند و یک مقدار NULL را در ستون مربوطه وارد می کند:

از SampleDb استفاده کنید. INSERT INTO Employee VALUES (34991، "Andrey"، "Batonov"، NULL);

برای درج مقادیر در برخی (و نه همه) ستون‌های جدول، معمولاً باید آن ستون‌ها را به صراحت مشخص کنید. ستون های نامشخص باید مقادیر NULL را مجاز کنند یا یک مقدار پیش فرض تعریف شده باشند.

از SampleDb استفاده کنید. INSERT INTO Employee(Id, FirstName, LastName) VALUES (34992, "Andrey", "Batonov");

دو مثال قبلی معادل هستند. در جدول Employee، تنها ستونی که مقادیر NULL را مجاز می‌کند، ستون DepartmentNumber است و سایر ستون‌ها با عبارت NOT NULL در عبارت CREATE TABLE غیرفعال شده‌اند.

ترتیب ارزش ها در پیشنهاد VALUESعبارات INSERT ممکن است با ترتیب مشخص شده در عبارت CREATE TABLE متفاوت باشد. در این حالت، ترتیب آنها باید با ترتیبی که ستون های مربوطه در لیست ستون ها فهرست شده اند مطابقت داشته باشد. در زیر نمونه ای از درج داده ها با ترتیبی متفاوت از نمونه اصلی آورده شده است:

از SampleDb استفاده کنید. INSERT INTO Employee(DepartamentNumber, LastName, Id, FirstName) VALUES ("d1"، "Batonov"، 34993، "Andrey");

درج چند ردیف

شکل دوم دستور INSERT یک یا چند ردیف انتخاب شده توسط یک پرسش فرعی را در جدول درج می کند. مثال زیر نحوه درج ردیف ها را با استفاده از شکل دوم عبارت INSERT نشان می دهد. در این مورد، یک پرس و جو برای انتخاب شماره و نام بخش های مستقر در مسکو اجرا می شود و مجموعه نتایج حاصل در جدول جدیدی که قبلاً ایجاد شده است بارگذاری می شود.

جدول جدید MoscowDepartment ایجاد شده در مثال بالا دارای همان ستون‌هایی است که جدول Department موجود است، به جز ستون مکان از دست رفته. پرسش فرعی در عبارت INSERT همه سطرهایی را در جدول Department که مقدار ستون Location برای آنها "Moscow" است، انتخاب می کند، که سپس در جدول جدید ایجاد شده در ابتدای پرس و جو درج می شود.

مثال زیر روش دیگری را برای درج ردیف ها در جدول با استفاده از شکل دوم عبارت INSERT نشان می دهد. در این مورد، یک پرس و جو برای انتخاب شماره پرسنل، شماره پروژه و تاریخ شروع پروژه برای همه کارکنان با موقعیت "مدیر" که روی پروژه p2 کار می کنند اجرا می شود و سپس مجموعه نتیجه حاصل را در جدول جدیدی که در ابتدای آن ایجاد شده است بارگیری می کند. پرس و جو:

از SampleDb استفاده کنید. CREATE TABLE ManagerTeam(EmpId INT NOT NULL، ProjectNumber CHAR (4) NOT NULL، EnterDate DATE)؛ INSERT INTO ManagerTeam (EmpId، ProjectNumber، EnterDate) SELECT EmpId، ProjectNumber، EnterDate FROM Works_on WHERE Job = "Manager";

قبل از درج ردیف ها با استفاده از عبارت INSERT، جداول MoscowDepartment و ManagerTeam (در مثال های بالا) خالی بودند. اگر جدول قبلاً وجود داشت و دارای ردیف هایی با داده بود، ردیف های جدیدی به آن اضافه می شد.

در بخش های قبلی، کار بازیابی داده ها از جداول از پیش ساخته شده را بررسی کردیم. اکنون زمان آن رسیده است که بفهمیم چگونه می توانیم جداول ایجاد/حذف کنیم، رکوردهای جدید اضافه کنیم و موارد قدیمی را حذف کنیم. برای این اهداف در SQLاپراتورهایی مانند: ايجاد كردن- ایجاد جدول، تغییر دهید- تغییر ساختار جدول، رها کردن- یک جدول یا فیلد را حذف می کند، درج کنید- داده ها را به جدول اضافه می کند. بیایید آشنایی با این گروه از اپراتورها را از اپراتور شروع کنیم درج کنید.

1. اضافه کردن کل خطوط

همانطور که از نام آن پیداست، اپراتور درج کنیدبرای درج (الحاق) ردیف ها به جدول پایگاه داده استفاده می شود. اضافه کردن را می توان به چند روش انجام داد:

  • - یک خط کامل اضافه کنید
  • - اضافه کردن بخشی از یک خط
  • - اضافه کردن نتایج پرس و جو

بنابراین، برای افزودن یک ردیف جدید به یک جدول، باید نام جدول را مشخص کنیم، نام ستون ها را لیست کنیم و مقدار هر ستون را با استفاده از ساختار مشخص کنیم. درج کنید جدول_نام (فیلد1، فیلد2 ...) ارزش های (value1, value2...). بیایید به یک مثال نگاه کنیم.

INSERT INTO Sellers (ID، آدرس، شهر، Seller_name، کشور) VALUES("6"، "خیابان اول"، "لس آنجلس"، "هری مونرو"، "ایالات متحده آمریکا")

شما همچنین می توانید ترتیب نام ستون ها را تغییر دهید، اما در همان زمان باید ترتیب مقادیر در پارامتر را تغییر دهید. ارزش های.

2. اضافه کردن بخشی از خطوط

در مثال قبلی هنگام استفاده از عملگر درج کنیدما به صراحت نام ستون های جدول را علامت گذاری کرده ایم. با استفاده از این نحو، می توانیم برخی از ستون ها را رد کنیم. این بدان معنی است که شما مقادیری را برای برخی از ستون ها وارد می کنید اما برای برخی دیگر آنها را ارائه نمی کنید. مثلا:

INSERT INTO Sellers (ID، شهر، Seller_name) VALUES("6"، "لس آنجلس"، "هری مونرو")

در این مثال، مقداری برای دو ستون مشخص نکردیم نشانیو کشور. می توانید برخی از ستون ها را از بیانیه حذف کنید درج کنید، اگر این اجازه تعریف جدول را بدهد. در این مورد، یکی از شرایط باید رعایت شود: این ستون به عنوان معتبر تعریف شده است خالی(عدم وجود هر مقدار) یا مقدار پیش فرض مشخص شده در تعریف جدول. به این معنی که اگر مقداری مشخص نشده باشد، از مقدار پیش فرض استفاده می شود. اگر ستونی از جدول را گم کرده اید که اجازه نمی دهد مقادیر در ردیف های آن ظاهر شوند خالیو مقدار پیش فرض تعریف نشده باشد، DBMS یک پیغام خطا ایجاد می کند و این خط اضافه نخواهد شد.

3. افزودن داده های انتخاب شده

در مثال قبلی، داده ها را با وارد کردن دستی جداول در پرس و جو، درج کردیم. با این حال، اپراتور درج کنیدبه ما این امکان را می دهد که اگر می خواهیم داده ها را از جدول دیگری وارد کنیم، این فرآیند را خودکار کنیم. برای این منظور در SQL چنین ساختاری وجود دارد درج در ... انتخاب .... این طراحی به شما این امکان را می دهد که به طور همزمان داده ها را از یک جدول انتخاب کرده و در جدول دیگر وارد کنید. بیایید فرض کنیم جدول دیگری داریم Sellers_EUبا لیستی از فروشندگان کالاهای ما در اروپا و باید آنها را به جدول کلی اضافه کنیم فروشندگان. ساختار این جداول یکسان است (تعداد ستون ها و نام های یکسان) اما داده ها متفاوت است. برای این کار می توانیم کوئری زیر را بنویسیم:

INSERT INTO Sellers (شناسه، آدرس، شهر، نام فروشنده، کشور) انتخاب کنیدشناسه، آدرس، شهر، نام فروشنده، کشور از فروشندگان_EU

باید توجه کنید تا مقادیر کلیدهای داخلی تکرار نشود (فیلد شناسه) در غیر این صورت خطایی رخ خواهد داد. اپراتور انتخاب کنیدهمچنین ممکن است شامل پیشنهاداتی باشد جایی کهبرای فیلتر کردن داده ها همچنین لازم به ذکر است که DBMS به نام ستون های موجود در بیانیه توجهی نمی کند. انتخاب کنید، فقط ترتیب چیدمان آنها برای او مهم است. بنابراین، داده ها در اولین ستون مشخص شده که به دلیل انتخاب شده است انتخاب کنید، در هر صورت در ستون اول جدول پر می شود فروشندگان، بعد از اپراتور مشخص شده است درج کنید، صرف نظر از نام فیلد.

4. کپی داده ها از یک جدول به جدول دیگر

اغلب هنگام کار با پایگاه های داده، نیاز به ایجاد کپی از هر جداول به منظور تهیه نسخه پشتیبان یا اصلاح وجود دارد. برای ایجاد یک کپی کامل از یک جدول، SQL یک عبارت جداگانه ارائه می کند INTO را انتخاب کنید. به عنوان مثال، باید یک کپی از جدول ایجاد کنیم فروشندگان، باید درخواست را به صورت زیر بنویسید:

SELECT * INTO Sellers_new FROM Sellers

برخلاف طرح قبلی درج در ... انتخاب ...هنگامی که داده ها به جدول موجود اضافه می شود، طرح داده ها را در جدول جدید کپی می کند. شما همچنین می توانید بگویید که ساخت اول داده های وارداتی و دومی صادرات. هنگام استفاده از طرح انتخاب ... به ... از ...موارد زیر باید در نظر گرفته شود:

  • - می توانید از هر جمله ای در عملگر استفاده کنید انتخاب کنید، مانند دسته بندی بر اساسو داشتن
  • - می توانید از یک join برای اضافه کردن داده ها از چندین جدول استفاده کنید
  • - داده ها را فقط می توان به یک جدول اضافه کرد، مهم نیست از چند جدول گرفته شده است.

این عبارت یک یا چند رکورد را به یک جدول اضافه می کند (یک پرس و جو ضمیمه را انجام می دهد).

نحو

درخواست اضافه کردن چندین رکورد:

درج کنید نهایی_شیء [(میدان 1[, میدان 2[, ...]])]
انتخاب کنید [ منبع.]میدان 1[, میدان 2[, ...]
از جانب table_expression

درخواست اضافه کردن یک رکورد:

درج کنید نهایی_شیء [(میدان 1[, میدان 2[, ...]])]
ارزش های ( میدان 1[, میدان 2[, ...])

دستور INSERT INTO از عناصر زیر تشکیل شده است:

قسمت

شرح

نهایی_شیء

نام جدول یا درخواستی که رکوردها در آن اضافه می شوند.

میدان 1, میدان 2

بعد از مشاجره نهایی_شیء- نام فیلدهایی که داده ها به آنها اضافه شده است. بعد از بحث منبع- نام فیلدهایی که داده ها از آنها استخراج می شود.

پایگاه_داده خارجی

مسیر به پایگاه داده خارجی برای توضیح مسیر، به مقاله مربوط به بند IN مراجعه کنید.

منبع

نام جدول یا درخواستی که رکوردها از آن کپی می شوند.

table_expression

یک یا چند نام جدول که می خواهید رکوردها را از آنها بازیابی کنید. این آرگومان می تواند نام یک جدول مجزا، عبارت نتیجه ای باشد که با استفاده از پیوستن داخلی، LEFT JOIN، یا RIGHT JOIN ساخته شده است، یا یک پرس و جو ذخیره شده باشد.

ارزش 1, ارزش 2

مقادیری که به فیلدهای خاص در رکورد جدید اضافه می شوند. هر مقدار در فیلد مربوط به موقعیت آن در لیست درج می شود: ارزش 1اضافه شده به میدان 1ورودی جدید، ارزش 2- V میدان 2و غیره. شما باید مقادیر را با کاما جدا کنید و فیلدهای متنی را در علامت نقل قول (" ") قرار دهید.

یادداشت

دستور INSERT INTO می تواند یک رکورد را با استفاده از نحو بالا به جدول اضافه کند. در این حالت برای هر فیلد در رکورد نام و مقادیر مشخص می شود. شما باید تمام فیلدهایی را در رکورد که مقادیر به آنها اختصاص داده شده و مقادیر مربوطه را مشخص کنید. اگر مقدار فیلد را مشخص نکنید، مقدار پیش فرض یا NULL به آن اختصاص داده می شود. رکوردها به انتهای جدول اضافه می شوند.

دستور INSERT INTO همچنین می تواند برای افزودن مجموعه ای از رکوردها از جدول یا پرس و جوی دیگر با استفاده از عبارت SELECT... FROM همانطور که در بالا نشان داده شده است استفاده شود (به نحو پرس و جو برای افزودن چندین رکورد مراجعه کنید). در این حالت، بند SELECT فیلدهایی را که باید به موارد مشخص شده اضافه شوند را مشخص می کند نهایی_شیء.

منبعیا نهایی_شیءمی تواند یک جدول یا یک پرس و جو باشد. هنگامی که یک پرس و جو داده می شود، موتور پایگاه داده مایکروسافت اکسس، رکوردهایی را به تمام جداولی که برمی گرداند اضافه می کند.

استفاده از عبارت INSERT INTO اختیاری است. اگر مشخص شده باشد، باید قبل از عبارت SELECT باشد.

اگر جدول هدف حاوی یک کلید اصلی است، اطمینان حاصل کنید که مقادیری که به یک یا چند فیلد کلید اصلی اضافه می‌کنید منحصر به فرد و متمایز از آن هستند. خالی; در غیر این صورت مطالب اضافه نخواهد شد.

اگر رکوردها به جدولی با فیلد شمارنده اضافه می شوند و می خواهید آنها را مجددا شماره گذاری کنید، فیلد شمارنده را در پرس و جو وارد نکنید. اگر می خواهید مقادیر اصلی فیلد را حفظ کنید، فیلد Counter را در پرس و جو قرار دهید.

با استفاده از عبارت IN می توانید رکوردها را به جدولی در پایگاه داده دیگری اضافه کنید.

برای ایجاد جدول، از دستور SELECT... INTO برای ایجاد پرس و جو برای ایجاد جدول استفاده کنید.

قبل از اجرای یک پرس و جو افزودن، از یک جستجوی انتخابی با معیارهای انتخاب یکسان استفاده کنید تا از نتایج برای تعیین اینکه کدام رکوردها اضافه می شوند استفاده کنید.

یک پرس و جو ضمیمه رکوردها را از یک یا چند جدول به جدول دیگر کپی می کند. در این حالت جداول حاوی رکوردهای اضافه شده بدون تغییر باقی می مانند.

به جای اضافه کردن رکوردها از جدول دیگری، می توانید مقدار هر فیلد را در یک رکورد جدید جداگانه با استفاده از عبارت VALUES تنظیم کنید. اگر یک لیست فیلد حذف شود، بند VALUES باید مقادیر مربوط به هر فیلد جدول را شامل شود. در غیر این صورت، عملیات INSERT ناموفق خواهد بود. از عبارت INSERT INTO همراه با عبارت VALUES برای هر رکورد اضافی که می خواهید ایجاد کنید استفاده کنید.