如何使用 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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...