如何使用 SQL INSERT 語句將數據插入到表中

来源:https://www.cnblogs.com/vin-c/archive/2022/05/18/16284663.html
-Advertisement-
Play Games

本文介紹如何使用 SQL INSERT 語句將數據插入到表中,如何用 INSERT SELECT 從其他表中導入行,如何用 SELECT INTO 將行導出到一個新表。 一、數據插入 毫無疑問,SELECT 是最常用的 SQL 語句了。但是,還有其他 3 個常用的 SQL 語句需要學習。第一個就是 ...


目錄

本文介紹如何使用 SQL INSERT 語句將數據插入到表中,如何用 INSERT SELECT 從其他表中導入行,如何用 SELECT INTO 將行導出到一個新表。

一、數據插入

毫無疑問,SELECT 是最常用的 SQL 語句了。但是,還有其他 3 個常用的 SQL 語句需要學習。第一個就是 INSERT(如何使用 SQL UPDATE 和 DELETE 語句更新或刪除表數據 介紹另外兩個)。

顧名思義,INSERT 用來將行插入(或添加)到資料庫表。插入有幾種方式:

  • 插入完整的行;
  • 插入行的一部分;
  • 插入某些查詢的結果。

下麵逐一介紹這些內容。

提示:插入及系統安全

使用 INSERT 語句可能需要客戶端/伺服器 DBMS 中的特定安全許可權。在你試圖使用 INSERT 前,應該保證自己有足夠的安全許可權。

1.1 插入完整的行

把數據插入表中的最簡單方法是使用基本的 INSERT 語法,它要求指定表名和插入到新行中的值。下麵舉一個例子:

INSERT INTO Customers
VALUES(1000000006,
       'Toy Land',
       '123 Any Street',
       'New York',
       'NY',
       '11111',
       'USA',
       NULL,
       NULL);

這個例子將一個新顧客插入到 Customers 表中。

存儲到表中每一列的數據在 VALUES 子句中給出,必須給每一列提供一個值。

如果某列沒有值,如上面的 cust_contactcust_email 列,則應該使用 NULL 值(假定表允許對該列指定空值)。各列必須以它們在表定義中出現的次序填充。

提示:INTO 關鍵字

在某些 SQL 實現中,跟在 INSERT 之後的 INTO 關鍵字是可選的。

但是,即使不一定需要,最好還是提供這個關鍵字,這樣做將保證 SQL 代碼在 DBMS 之間可移植。

雖然這種語法很簡單,但並不安全,應該儘量避免使用。

上面的 SQL 語句高度依賴於表中列的定義次序,還依賴於其容易獲得的次序信息。即使可以得到這種次序信息,也不能保證各列在下一次表結構變動後保持完全相同的次序。

因此,編寫依賴於特定列次序的 SQL 語句是很不安全的,這樣做遲早會出問題。

編寫 INSERT 語句的更安全(不過更煩瑣)的方法如下:

INSERT INTO Customers(cust_id,
                      cust_name,
                      cust_address,
                      cust_city,
                      cust_state,
                      cust_zip,
                      cust_country,
                      cust_contact,
                      cust_email)
VALUES(1000000006,
       'Toy Land',
       '123 Any Street',
       'New York',
       'NY',
       '11111',
       'USA',
       NULL,
       NULL);

這個例子與前一個 INSERT 語句的工作完全相同,但在表名後的括弧里明確給出了列名。

在插入行時,DBMS 將用 VALUES 列表中的相應值填入列表中的對應項。VALUES 中的第一個值對應於第一個指定列名,第二個值對應於第二個列名,如此等等。

因為提供了列名,VALUES 必須以其指定的次序匹配指定的列名,不一定按各列出現在表中的實際次序。其優點是,即使表的結構改變,這條 INSERT 語句仍然能正確工作。

說明:不能插入同一條記錄兩次

如果你嘗試了這個例子的兩種方法,會發現第二次生成了一條出錯消息,說 ID 為 1000000006 的顧客已經存在。

學習 SQL 之前需要瞭解的基礎知識 我們說過,主鍵的值必須有唯一性,而 cust_id 是主鍵,DBMS 不允許插入相同 cust_id 值的新行。

下一個例子也是同樣的道理。要想再嘗試另一種插入方法,需要首先刪除掉已經插入的記錄(請參閱 如何使用 SQL UPDATE 和 DELETE 語句更新或刪除表數據)。

要麼就別嘗試新方法了,反正記錄已經插入好,你可以繼續往下學習。

下麵的 INSERT 語句填充所有列(與前面的一樣),但以一種不同的次序填充。因為給出了列名,所以插入結果仍然正確:

INSERT INTO Customers(cust_id,
                      cust_contact,
                      cust_email,
                      cust_name,
                      cust_address,
                      cust_city,
                      cust_state,
                      cust_zip)
VALUES(1000000006,
       NULL,
       NULL,
       'Toy Land',
       '123 Any Street',
       'New York',
       'NY',
       '11111');

提示:總是使用列的列表

不要使用沒有明確給出列的 INSERT 語句。給出列能使 SQL 代碼繼續發揮作用,即使表結構發生了變化。

註意:小心使用 VALUES

不管使用哪種 INSERT 語法,VALUES 的數目都必須正確。

如果不提供列名,則必須給每個表列提供一個值;如果提供列名,則必須給列出的每個列一個值。

否則,就會產生一條錯誤消息,相應的行不能成功插入。

1.2 插入部分行

正如所述,使用 INSERT 的推薦方法是明確給出表的列名。使用這種語法,還可以省略列,這表示可以只給某些列提供值,給其他列不提供值。

請看下麵的例子:

INSERT INTO Customers(cust_id,
                      cust_name,
                      cust_address,
                      cust_city,
                      cust_state,
                      cust_zip,
                      cust_country)
VALUES(1000000006,
       'Toy Land',
       '123 Any Street',
       'New York',
       'NY',
       '11111',
       'USA');

在本文前面的例子中,沒有給 cust_contactcust_email 這兩列提供值。這表示沒必要在 INSERT 語句中包含它們。因此,這裡的 INSERT 語句省略了這兩列及其對應的值。

註意:省略列

如果表的定義允許,則可以在 INSERT 操作中省略某些列。省略的列必須滿足以下某個條件。

  • 該列定義為允許 NULL 值(無值或空值)。
  • 在表定義中給出預設值。這表示如果不給出值,將使用預設值。

註意:省略所需的值

如果表中不允許有 NULL 值或者預設值,這時卻省略了表中的值,DBMS 就會產生錯誤消息,相應的行不能成功插入。

1.3 插入檢索出的數據

INSERT 一般用來給表插入具有指定列值的行。

INSERT 還存在另一種形式,可以利用它將 SELECT 語句的結果插入表中,這就是所謂的 INSERT SELECT

顧名思義,它是由一條 INSERT 語句和一條 SELECT 語句組成的。

假如想把另一表中的顧客列合併到 Customers 表中,不需要每次讀取一行再將它用 INSERT 插入,可以如下進行:

INSERT INTO Customers(cust_id,
                      cust_contact,
                      cust_email,
                      cust_name,
                      cust_address,
                      cust_city,
                      cust_state,
                      cust_zip,
                      cust_country)
SELECT cust_id,
       cust_contact,
       cust_email,
       cust_name,
       cust_address,
       cust_city,
       cust_state,
       cust_zip,
       cust_country
FROM CustNew;

說明:新例子的說明

這個例子從一個名為 CustNew 的表中讀出數據並插入到 Customers 表。為了試驗這個例子,應該首先創建和填充 CustNew 表。

CustNew 表的結構與 學習 SQL 所用到的樣例表腳本 中描述的 Customers 表相同。

在填充 CustNew 時,不應該使用已經在 Customers 中用過的 cust_id 值(如果主鍵值重覆,後續的 INSERT 操作將會失敗)。

這個例子使用 INSERT SELECTCustNew 中將所有數據導入 Customers

SELECT 語句從 CustNew 檢索出要插入的值,而不是列出它們。

SELECT 中列出的每一列對應於 Customers 表名後所跟的每一列。這條語句將插入多少行呢?這依賴於 CustNew 表有多少行。

如果這個表為空,則沒有行被插入(也不產生錯誤,因為操作仍然是合法的)。如果這個表確實有數據,則所有數據將被插入到 Customers

提示:INSERT SELECT 中的列名

為簡單起見,這個例子在 INSERTSELECT 語句中使用了相同的列名。但是,不一定要求列名匹配。

事實上,DBMS 一點兒也不關心 SELECT 返回的列名。

它使用的是列的位置,因此 SELECT 中的第一列(不管其列名)將用來填充表列中指定的第一列,第二列將用來填充表列中指定的第二列,如此等等。

INSERT SELECTSELECT 語句可以包含 WHERE 子句,以過濾插入的數據。

提示:插入多行

INSERT 通常只插入一行。要插入多行,必須執行多個 INSERT 語句。

INSERT SELECT 是個例外,它可以用一條 INSERT 插入多行,不管 SELECT 語句返回多少行,都將被 INSERT 插入。

二、從一個表複製到另一個表

有一種數據插入不使用 INSERT 語句。要將一個表的內容複製到一個全新的表(運行中創建的表),可以使用 CREATE SELECT 語句(或者在 SQL Server 里也可用 SELECT INTO 語句)。

說明:DB2 不支持

DB2 不支持這裡描述的 CREATE SELECT

INSERT SELECT 將數據添加到一個已經存在的表不同,CREATE SELECT 將數據複製到一個新表(有的 DBMS 可以覆蓋已經存在的表,這依賴於所使用的具體 DBMS)。

下麵的例子說明如何使用 CREATE SELECT

CREATE TABLE CustCopy AS SELECT * FROM Customers;

若是使用 SQL Server,可以這麼寫:

SELECT * INTO CustCopy FROM Customers;

這條 SELECT 語句創建一個名為 CustCopy 的新表,並把 Customers 表的整個內容複製到新表中。

因為這裡使用的是 SELECT *,所以將在 CustCopy 表中創建(並填充)與 Customers 表的每一列相同的列。要想只複製部分的列,可以明確給出列名,而不是使用 * 通配符。

在使用 SELECT INTO 時,需要知道一些事情:

  • 任何 SELECT 選項和子句都可以使用,包括 WHEREGROUP BY
  • 可利用聯結從多個表插入數據;
  • 不管從多少個表中檢索數據,數據都只能插入到一個表中。

提示:進行表的複製

SELECT INTO 是試驗新 SQL 語句前進行表複製的很好工具。先進行複製,可在複製的數據上測試 SQL 代碼,而不會影響實際的數據。

說明:更多例子

如果想看 INSERT 用法的更多例子,請參閱 學習 SQL 所用到的樣例表腳本 中給出的樣例表填充腳本。

三、小結

本文介紹瞭如何將行插入到資料庫表中。我們學習了使用 INSERT 的幾種方法,為什麼要明確使用列名,如何用 INSERT SELECT 從其他表中導入行,如何用 SELECT INTO 將行導出到一個新表。

如何使用 SQL UPDATE 和 DELETE 語句更新或刪除表數據 講述瞭如何使用 UPDATEDELETE 進一步操作表數據。

原文鏈接:https://www.developerastrid.com/sql/sql-insert/

(完)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼要使用ember.js ​ ember.js是一個JavaScript框架,它大大減少了構建任何web應用程式所需的時間、精力和資源。它專註於讓你,開發人員,通過做所有常見的,重覆的,但重要的,涉及大多數web開發項目的任務,儘可能地提高生產力。 ​ 歷史 Ember.js的原始名稱是Spro ...
  • 管道與重定向的使用 標準輸入的文件描述符為0. 標準輸出的文件描述符為1 錯誤輸出的文件描述符為2 管道 管道:可以讓我們將多條命令連接在一起。 作用:將一個命令的標準輸出重定向給下一個命令,並作為該命令的標準輸入。 (base) [root@localhost ~]# ifconfig ens33 ...
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 單片機每隔1秒採集一次溫度值(0~40℃),並通過串口輸出(ASCII格式)。 硬體設計 在第一節的基礎上,在P ...
  • ps命令 ps命令來自於英文片語”process status“的縮寫,其功能是用於顯示當前系統的進程狀態。使用ps命令可以查看到進程的所有信息,例如進程的號碼、發起者、系統資源使用占比(處理器與記憶體)、運行狀態等等。幫助我們及時的發現哪些進程出現”僵死“或”不可中斷“等異常情況。 經常會與kill ...
  • 一、概述 在眾多 Hadoop 版本中, CDH(Cloudera Hadoop) 是 Hadoop 眾多分支中比較出色的版本, 它由Cloudera 發行和維護。CDH 基於 Apache 的 Hadoop 進行重新構建,提供了基於 Web 頁面的群集部署和管理操作。Hadoop發行版除了社區的A ...
  • SpringDataRedis的序列化的一些問題 RedisTemplate可以接收任意Object作為值寫入Redis,但是如果不實現設置序列化器的化預設是採用JDK序列化,序列化後的結果可讀性差並且記憶體占用空間大,如下圖。 自定義RedisTemplate的序列化方式 key和 hashKey採 ...
  • 導讀: 今天和大家分享京東零售OLAP平臺的建設和場景的實踐,主要包括四大部分: 管控面建設 優化技巧 典型業務 大促備戰 -- 01 管控面建設 1. 管控面介紹 管控面可以提供高可靠高效可持續運維保障、快速部署小時交付的能力,尤其是針對ClickHouse這種運維較弱但是性能很高的OLAP核心引 ...
  • 本文介紹如何使用 UPDATE 和 DELETE 語句處理表中的數據,還介紹了為什麼 WHERE 子句對 UPDATE 和 DELETE 語句很重要。 一、更新數據 更新(修改)表中的數據,可以使用 UPDATE 語句。有兩種使用 UPDATE 的方式: 更新表中的特定行; 更新表中的所有行。 下麵 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...