SQL必知必會筆記十五(插入資料)

2021-10-05 18:58:08 字數 3802 閱讀 1362

利用sql的insert語句將資料插入表中。

insert用來將行插入(或新增)到資料庫表。插入有幾種方式:

• 插入完整的行;

• 插入行的一部分;

• 插入某些查詢的結果。

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

插入完整的行

例如:insert into customers values('1000000006', 'toy land', '123 any street', 'new york', 'ny', '11111', 'usa', null, null);

將乙個新顧客插入到customers表中。儲存到表中每一列的資料在values子句中給出,必須給每一列提供乙個值。如果某列沒有值,如上面的cust_contact和cust_email列,則應該使用null值(假定表允許對該列指定空值)。各列必須以它們在表定義**現的次序填充。

在某些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語句仍然能正確工作。

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

注意:小心使用values

不管使用哪種insert語法,values的數目都必須正確。如果不提供列名,則必須給每個表列提供乙個值;如果提供列名,則必須給列出的每個列乙個值。否則,就會產生一條錯誤訊息,相應的行不能成功插入。

插入部分行

例如: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_contact和cust_email這兩列提供值。這表示沒必要在insert語句中包含它們。因此,這裡的insert語句省略了這兩列及其對應的值。

注意:省略列

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

• 該列定義為允許null值(無值或空值)。

• 在表定義中給出預設值。這表示如果不給出值,將使用預設值。

如果對錶中不允許null值且沒有預設值的列不給出值,dbms將產生錯誤訊息,並且相應的行插入不成功。

注意:省略所需的值

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

插入檢索出的資料

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;

這個例子使用insert select從custnew中將所有資料匯入customers。select語句從custnew檢索出要插入的值,而不是列出它們。select中列出的每一列對應於customers表名後所跟的每一列。這條語句將插入多少行呢?這依賴於custnew表有多少行。如果這個表為空,則沒有行被插入(也不產生錯誤,因為操作仍然是合法的)。如果這個表確實有資料,則所有資料將被插入到customers。

為簡單起見,這個例子在insert和select語句中使用了相同的列名。但是,不一定要求列名匹配。事實上,dbms一點兒也不關心select返回的列名。它使用的是列的位置,因此select中的第一列(不管其列名)將用來填充表列中指定的第一列,第二列將用來填充表列中指定的第二列,如此等等。

insert select中select語句可以包含where子句,以過濾插入的資料。

insert通常只插入一行。要插入多行,必須執行多個insert語句。insert select是個例外,它可以用一條insert插入多行,不管select語句返回多少行,都將被insert插入。

有一種資料插入不使用insert語句。要將乙個表的內容複製到乙個全新的表(執行中建立的表),可以使用select into語句。

說明:db2不支援

db2不支援這裡描述的select into。

與insert select將資料新增到乙個已經存在的表不同,select into將資料複製到乙個新錶(有的dbms可以覆蓋已經存在的表,這依賴於所使用的具體dbms)。

說明:insert select與select into

它們之間的乙個重要差別是前者插入資料,而後者匯出資料。

例如:select * into custcopy from customers;

這條select語句建立乙個名為custcopy的新錶,並把customers表的整個內容複製到新錶中。因為這裡使用的是select *,所以將在custcopy表中建立(並填充)與customers表的每一列相同的列。要想只複製部分的列,可以明確給出列名,而不是使用*萬用字元。

mariadb、mysql、oracle、postgresql和sqlite使用的語法稍有不同:

例如:create table custcopy as select * from customers;

在使用select into時,需要知道一些事情:

• 任何select選項和子句都可以使用,包括where和group by;

• 可利用聯結從多個表插入資料;

• 不管從多少個表中檢索資料,資料都只能插入到乙個表中。

先用select into複製表,再試驗新sql語句,是很好的做法。先進行複製,可在複製的資料上測試sql**,而不會影響實際的資料。

SQL必知必會 插入資料(十五)

insert用來將行插入 或新增 到資料庫表。插入有幾種方式 注意 1 使用insert語句可能需要客戶端 服務端dbms中的特定安全許可權。在你試圖使用insert前,應該保證自己有足夠的安全許可權 insert into customers values toy land 123 any str...

SQL 必知必會第十五課 插入資料

插入完整的行 insert into customers values 1000000006 toy land 123 any street new york ny 11111 usa null null 繁瑣卻更加保險的方法 insert into customers cust id,cust n...

《sql必知必會》學習筆記(二)插入資料

15.1.1 插入完整行insert into customers values 100 toy null insert into customers cust id,cust name,cust email values 100 toy null 注意 1 可以保證在值與列的對應。2 values...