【SQL從一點一滴分析系列文章】爲實際開發中的點點滴滴的總結,從最最簡單的SQL 查詢 到 綜合分析查詢 在分析 SQL 時,也會同時分析 mybatis 、Hibernate 中的相關操做 點擊查看詳情sql
本節講述 在數據庫中插入數據數據庫
向表中插入一條新的記錄。 例如 向用戶表中添加一條新的數據,能夠這樣寫mybatis
insert into t_user (user_id,user_name,user_age,user_address,user_phone)
values(32,'小不點',18,"龍城大街一號院",192303023994)
複製代碼
在 MySQL 和DB2 中,能夠選擇一次插入一行,或者一次插入多行ui
insert into t_user (user_id,user_name,user_age,user_address,user_phone)
values
(32,'小不點',18,"龍城大街一號院",192303023994),
(33,'小李子',20,"龍城大街二號院",192303023995)
複製代碼
insert 語句容許在數據庫表中建立新行,在全部類型的數據庫系統中,插入語句的語法徹底相同,固然還有簡便的寫法就是spa
insert into t_user
values('山西省','小不點',"龍城大街一號院",18,32,192303023994,)
複製代碼
須要注意的是若是沒有列出插入行中的目標字段,則必須插入表中的全部的列。.net
定義表時,能夠爲某些列定義默認值,如今要以默認值插入一行,而無需指定各列的值。code
creat table t_user (user_id default 0)
複製代碼
全部的數據庫系統都支持使用 default 關鍵字顯式的指定某列插入值,有些數據庫還支持其餘的方法來解決這個問題blog
insert into t_user (user_id,user_name,user_age,user_address,user_phone)
values(32,'小不點',18,default,default)
複製代碼
當不須要將表中全部列都插入值時,能夠明確的指定要使用默認值的列名稱,如上述寫 到的 user_address,user_phone 使用的 default開發
Oracle8i 數據庫及其之前版本不支持 default 關鍵字,在 Oracle9 c之前的數據庫中 沒法顯示地插入默認值get
在 MySQL 中,若是表中全部的列都定義了默認值,能夠用一個空的值來解決問題
insert into t_user values()
複製代碼
在這種狀況下,全部的列將設置爲其默認值
在 PostgreSQL 和 SQL Service 中支持 default values 子句
insert into t_user default values
複製代碼
default values 子句將全部的列設置爲其自己的默認值。
在值列表中的 default 關鍵字爲相應列插入默認值,默認值在建立表時定義,全部的數據庫中均可以使用些關鍵字。
在一個定義了默認值的列插入數據,而且須要無論該列的默認值是什麼,能夠將這個值設置爲 NULL
create table t_user (user_id defalut 0,user_flag varchar(100))
複製代碼
如今插入一條數據
insert into t_user (user_id,user_flag) values (null,"今天心與心的交流了一下")
複製代碼
在上述插入的語句中,明確指定了 null,可是在實際開發中,並非全部的人都知道能夠在 insert 語句中明確指定 null 值,全部經常使用的作法是在插入數據時,不須要插入某列數據時,就不指定某列,如上述的插入 null 能夠修改成
insert into t_user (user_flag) values ("今天心與心的交流了一下")
複製代碼
將一個表中的數據複製到另外一個表中,第一步 先查詢第一個表中的數據,第二步 複製,在這個過程當中 查詢數據可能複雜也可能簡單,可是最終的結果就是複製 例如 將表 t_user 中的數據複製到表 t_dep_user 表中
insert into t_dep_user (dep_user_name,dep_user_flag)
select user_name,user_flag from t_user
複製代碼
在這裏使用的方法就是在 insert 語句後面緊跟一個查詢,該查詢用來返回想要獲得的行。
與上述不一樣的是,從一個表中查詢出數據,而後將這些數據複製到多具表中,例如將表 t_user 中的數據複製到 t_user_2 、t_user_3 、t_user_4 中:
在 MySQL 、PostgreSQL 和 SQL Server 中還不支持這種多表插入操做
在 Oracle 中能夠這樣寫
insert all
when user_age < 18 then
into t_user_2(user_name,user_age,user_flag) values (dep_user_name,dep_user_age,dep_user_flag)
when user_age >60 then
into t_user_3(user_name,user_age,user_flag) values (dep_user_name,dep_user_age,dep_user_flag)
else
into t_user_4(user_name,user_age,user_flag) values (dep_user_name,dep_user_age,dep_user_flag)
select dep_user_name,dep_user_age,dep_user_flag from t_user
複製代碼
在 DB2 中能夠將全部的目標用 union all 聯接
///先建立表
create table t_user_2(user_name varchar(10),user_age integer check (user_age <18),user_flag varchar(44))
create table t_user_3(user_name varchar(10),user_age integer check (user_age >=18 and user_age <=60),user_flag varchar(44))
create table t_user_4(user_name varchar(10),user_age integer check (user_age >60),user_flag varchar(44))
///插入數據
insert into (
select * from t_user_2 union all
select * from t_user_3 union all
select * from t_user_4
) select * from t_user
複製代碼
在實際中,想要建立新表,該表與已有的表的結構設置相同,就能夠考慮只複製表結構 在 DB2 中,使用帶有 like 子句的 create table 命令
create table t_user_2 like t_user
複製代碼
在 Oracle 、MySQL 和 PostgreSQL 中,使用一個不返回任何行的子查詢
create table t_user_2 as select * from t_user where 1=0
複製代碼
在這裏 where 1=0 致使了查詢不返回任何行,這樣最終建立的表就是根據查詢中select 子句中的列名產生的空表
完畢