系列文章目录

【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事
【SQL开发实战技巧】系列(二):简单单表查询
【SQL开发实战技巧】系列(三):SQL排序的那些事
【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项
【SQL开发实战技巧】系列(五):从执行计划看IN、EXISTS 和 INNER JOIN效率,我们要分场景不要死记网上结论
【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放
【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
【SQL开发实战技巧】系列(十):从拆分字符串、替换字符串以及统计字符串出现次数说起
【SQL开发实战技巧】系列(十一):拿几个案例讲讲translate|regexp_replace|listagg|wmsys.wm_concat|substr|regexp_substr常用函数
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
【SQL开发实战技巧】系列(十三):讨论一下常用聚集函数&通过执行计划看sum()over()对员工工资进行累加
【SQL开发实战技巧】系列(十四):计算消费后的余额&计算银行流水累计和&计算各部门工资排名前三位的员工
【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report
【SQL开发实战技巧】系列(十六):数据仓库中时间类型操作(初级)日、月、年、时、分、秒之差及时间间隔计算
【SQL开发实战技巧】系列(十七):数据仓库中时间类型操作(初级)确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数
【SQL开发实战技巧】系列(十八):数据仓库中时间类型操作(进阶)INTERVAL、EXTRACT以及如何确定一年是否为闰年及周的计算
【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?
【SQL开发实战技巧】系列(二十):数据仓库中时间类型操作(进阶)获取季度开始结束时间以及如何统计非连续性时间的数据
【SQL开发实战技巧】系列(二十一):数据仓库中时间类型操作(进阶)识别重叠的日期范围,按指定10分钟时间间隔汇总数据


文章目录

  • 系列文章目录
  • 前言
    • 一、插入数据
    • 二、阻止对某几列插入
    • 三、复制表的定义和数据以及注意事项
    • 四、比创建约束功能更强大!用 WITH CHECK OPTION限制数据录入
    • 五、如何一个insert将数据同时插入多个表
  • 总结

前言

本篇文章讲解的主要内容是:插入数据、阻止对某几列插入的实现、复制表的定义和数据以及注意事项、比创建约束功能更强大!用 WITH CHECK OPTION限制数据录入、如何一个insert将数据同时插入多个表
【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。


一、插入数据

先创建一个测试表,然后插入一条数据

create table test(
aa varchar2(20) default 'aa',
bb varchar2(20) default 'bb',
cc varchar2(20) default 'cc',
dd date default sysdate
);
insert into test(aa,bb,cc) values(default,null,'zyd');SQL> select * from test;AA                   BB                   CC                   DD
-------------------- -------------------- -------------------- -----------
aa                                        zyd                  2023-2-7 16

注意以下几点:

  1. 如果INSERT语句中没有含默认值的列,则会添加默认值,如dd列。
  2. 如果包含有默认值的列,需要用DEFAULT关键字,才会添加默认值,如aa列。
  3. 如果已显示设定了NULL或其他值,则不会再生成默认值,如bb列。
  4. 建立表时,有时明明设定了默认值,可生成的数据还是NULL,原因在于我们在代码中不知不觉地加入了NULL。

二、阻止对某几列插入

这种需求我们可以创建一个视图,视图中暴露出来可以变更的列,然后DML操作均基于此视图来做,看下面这个案例:

SQL> insert into vtest values('a','b',sysdate);1 row insertedSQL> select * from vtest;AA                   BB                   DD
-------------------- -------------------- -----------
aa                                        2023-2-7 16
a                    b                    2023-2-7 16SQL> insert into vtest values('c',default,sysdate);
insert into vtest values('c',default,sysdate)ORA-32575: 对于正在修改的视图, 不支持显式列默认设置

ok,看上面的操作我们可以通过视图实现需求,但是视图这种方式有个弊端就是通过VIEW新增数据,不能再使用关键字DEFAULT

三、复制表的定义和数据以及注意事项

我们可以用以下语句复制表 TEST:

create table  test2 as select * from test;

也可以先复制表的定义,再新增数据:

create table test3 as select * from test where 1=2;
insert into test3 select * from test;

但是!看下面这个操作:

SQL> create table test4 as2  select '1' as aa, null bb, '' cc, sysdate dd from test;
create table test4 as
select '1' as aa, null bb, '' cc, sysdate dd from testORA-01723: 不允许长度为 0 的列

当我们CTAS操作的时候,如果你的字段中包含null时候,会创建失败,因为你没有指定这个列的数据类型, oracle咋个推断你的数据类型呢?

四、比创建约束功能更强大!用 WITH CHECK OPTION限制数据录入

当约束条件比较简单时,可以直接加在表中,如工资必须>0:

SQL> alter table emp add constraints ck_sal check(sal > 0);
Table altered

但有些复杂或特殊的约束条件是不能这样放在表里的,如雇佣日期大于当前日期

SQL> alter table emp add constraints ck_hiredate check(hiredate>sysdate);ORA-02436: 日期或系统变量在 CHECK 约束条件中指定错误

这时我们可以使用加了WITH CHECK OPTION关键字的VIEW来达到目的。下面的示例中,我们限制了不符合内联视图条件的数据(SYSDATE+1)

SQL> insert into (2  select * from test where dd<=sysdate with check option3  )4  select 'a1','b1','c1',sysdate5  from dual;1 row insertedSQL> select * from test;AA                   BB                   CC                   DD
-------------------- -------------------- -------------------- -----------
aa                                        zyd                  2023-2-7 16
a                    b                    cc                   2023-2-7 16
a1                   b1                   c1                   2023-2-7 17SQL> rollback;Rollback completeSQL> select * from test;AA                   BB                   CC                   DD
-------------------- -------------------- -------------------- -----------
aa                                        zyd                  2023-2-7 16
a                    b                    cc                   2023-2-7 16SQL>
SQL> insert into (2  select * from test where dd<=sysdate with check option3  )4  select 'a1','b1','c1',sysdate+15  from dual;
insert into (
select * from test where dd<=sysdate with check option
)
select 'a1','b1','c1',sysdate+1
from dualORA-01402: 视图 WITH CHECK OPTION where 子句违规

因为里面有关键字WITH CHECK OPTION,所以INSERT的数据不符合其中的条件(hiredate<=SYSDATE)时,就不允许利用INSERT。
当规则较复杂,无法用约束实现时,这种限制方式就比较有用。

五、如何一个insert将数据同时插入多个表

多表插入语句分为以下四种:

  • 无条件INSERT
  • 有条件INSERT ALL
  • 转置INSERT
  • 有条件INSERT FIRST

接下来先创建两个临时表

create table empa as select empno,ename,job from emp where 1=2;
create table empb as select empno,ename,deptno from emp where 1=2;
  • 无条件INSERT
INSERT ALL
into empa(empno,ename,job)VALUES(empno,ename,job)
into empb(empno,ename,deptno)VALUES(empno,ename,deptno)
SELECT empno,ename,job,deptno FROM emp WHERE deptno in (10,20);
16 rows insertedSQL> select * from empa;EMPNO ENAME      JOB
----- ---------- ---------7369 SMITH      CLERK7566 JONES      MANAGER7782 CLARK      MANAGER7788 SCOTT      ANALYST7839 KING       PRESIDENT7876 ADAMS      CLERK7902 FORD       ANALYST7934 MILLER     CLERK8 rows selectedSQL> select * from empb;EMPNO ENAME      DEPTNO
----- ---------- ------7369 SMITH          207566 JONES          207782 CLARK          107788 SCOTT          207839 KING           107876 ADAMS          207902 FORD           207934 MILLER         108 rows selectedSQL> rollback;Rollback complete

因为没有加条件,所以会同时向两个表中插入数据,且两个表中插入的条数一样。

  • 有条件 INSERT ALL
INSERT ALL
when job in('SALESMAN','MANAGER') then
into empa(empno,ename,job)VALUES(empno,ename,job)
when deptno in('20','30')then
into empb(empno,ename,deptno)VALUES(empno,ename,deptno)
SELECT empno,ename,job,deptno FROM emp WHERE deptno in (10,20);
7 rows insertedSQL> select * from empa;EMPNO ENAME      JOB
----- ---------- ---------7566 JONES      MANAGER7782 CLARK      MANAGERSQL> select * from empb;EMPNO ENAME      DEPTNO
----- ---------- ------7369 SMITH          207566 JONES          207788 SCOTT          207876 ADAMS          207902 FORD           20SQL> rollback;Rollback complete

当增加条件后,就会按条件插入。如EMPNO=7654等数据在两个表中都有。

  • INSERT FIRST就不一样
INSERT FIRST
when job in('SALESMAN','MANAGER') then
into empa(empno,ename,job)VALUES(empno,ename,job)
when deptno in('20','30')then
into empb(empno,ename,deptno)VALUES(empno,ename,deptno)
SELECT empno,ename,job,deptno FROM emp WHERE deptno in (10,20);6 rows insertedSQL> select * from empa;EMPNO ENAME      JOB
----- ---------- ---------7566 JONES      MANAGER7782 CLARK      MANAGERSQL> select * from empb;EMPNO ENAME      DEPTNO
----- ---------- ------7369 SMITH          207788 SCOTT          207876 ADAMS          207902 FORD           20SQL> rollback;

INSERT FIRST语句中,当第一个表符合条件后,第二个表将不再插入对应的行,表empb中不再有与表empa相同的数据EMPN0=7654,这就是INSERT FIRSTINSERT ALL的不同之处。

  • 转置INSERT与其说是一个分类,不如算作"INSERT ALL"的一个用法。

创建一个临时表

create table deptb(
dname varchar2(200),
remark  varchar2(200)
);
insert all
into deptb values(aa,'aa')
into deptb values(bb,'bb')
into deptb values(cc,'cc')
select * from (select 'zhaoyd' aa,'zhaoyandong' bb ,'赵延东'cc from dual
);
SQL> select * from deptb;DNAME                                                                            REMARK
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
zhaoyd                                                                           aa
zhaoyandong                                                                      bb
赵延东                                                                           cc

可以看到,转置INSERT的实质就是把不同列的数据插入到同一表的不同行中。


总结

本章主要是介绍关于insert的一系列常用操作。

【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表相关推荐

  1. 【SQL开发实战技巧】系列(十八):数据仓库中时间类型操作(进阶)INTERVAL、EXTRACT以及如何确定一年是否为闰年及周的计算

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  2. 【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  3. 【SQL开发实战技巧】系列(十):从拆分字符串、替换字符串以及统计字符串出现次数说起

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  4. 【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  5. 【SQL开发实战技巧】系列(三):SQL排序的那些事

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  6. 【SQL开发实战技巧】系列(五):从执行计划看IN、EXISTS 和 INNER JOIN效率,我们要分场景不要死记网上结论

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  7. 【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  8. 【SQL开发实战技巧】系列(二):简单单表查询

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  9. 【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

最新文章

  1. CMD 输入中文看不到输入法的解决方法
  2. 企业有需求,那么站点就应该不断完善功能
  3. Codevs 1005 生日礼物
  4. python处理流程-python的处理流程
  5. C-#数据库方面好书
  6. java自定义类加载器
  7. activemq网络桥接_ActiveMQ –经纪人网络解释–第4部分
  8. leetcode133. 克隆图(bfs)
  9. 计算机科学美国大学专业,2018美国大学计算机科学专业大排名
  10. 创建组_在Allegro软件中的Groups组创建之后怎么进行打散呢?
  11. 2019文都计算机网络百度云,2019计算机考研|计算机网络知识:计算机网络体系结构...
  12. 系统简单的UIImagePickerController
  13. 如何在 Mac 上管理用于锁定备忘录的密码?
  14. idea 包.路径切换为目录结构
  15. 读懂hadoop、hbase、hive、spark分布式系统架构
  16. OpenCV 图片模糊处理
  17. java 批量设置单元格边框,VC下设置Excel单元格的边框 (转)
  18. 【FPGA创新设计竞赛——2022紫光同创杯】1、“基于 RISC-V 处理器的软硬件系统设计”赛题介绍
  19. 支付宝数字化经营能加盟吗?真实情况原来是这样!(深度好文)
  20. C语言画奥运五环以及五角星

热门文章

  1. 学c语言把电脑弄坏了,一不小心把学校的电脑弄坏了怎么样写检讨四百字
  2. 实践数据湖iceberg 第二十四课 iceberg元数据详细解析
  3. 2021级C++上机考(上)
  4. Ubuntu18下通过yolov5进行训练并预测
  5. RHCS+Conga+iSCSI+CLVM+GFS实现Web服务的共享存储HA集群
  6. JQuery放大镜效果实现实例
  7. toad可以连接mysql吗_toad的连接数据库
  8. 3.封包工具——commview
  9. DNS添加KMS SRV记录激动激活
  10. php 模拟蜘蛛,PHP模拟百度蜘蛛,伪造IP爬行网站,附源代码