【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 子句中的列名产生的空表
完毕