源码-PL/SQL从入门到精通-第七章-操作数据表

除了序列(Sequence)和同义词(Synonym)外,其他语句基本上都在自己创建的iTerm数据中用过了,所以这章感觉不难。

--第7章开始
--7.1.2 插入单行记录

SELECT * FROM emp;

INSERT INTO emp
            (empno, ename, job, mgr,
             hiredate, sal, comm, deptno
            )
     VALUES (7890, '刘七', '副理', 7566,
             TO_DATE ('2001-08-15', 'YYYY-MM-DD'), 8000, 300, 20
            );

INSERT INTO emp
     VALUES (7891, '刘七', '副理', 7566, TO_DATE ('2001-08-15', 'YYYY-MM-DD'),
             8000, 300, 20);

--7.1.3 插入默认值和Null值

--默认值
INSERT INTO emp
            (empno, ename, deptno
            )
     VALUES (7892, '张八', 20
            );

SELECT *
  FROM emp
 WHERE empno = 7892; 

INSERT INTO emp
            (empno, ename, deptno
            )
     VALUES (7892, '张八', 20
            );

INSERT INTO emp
            (empno, ename, deptno
            )
     VALUES (7898, 'O''Malley', 20
            );       

-- 插入NUll值
SELECT * FROM emp;            

INSERT INTO emp
VALUES(7893,'霍九',NULL,NULL,NULL,NULL,NULL,20);

INSERT INTO emp
VALUES(7894,'霍十','',NULL,'',NULL,NULL,20);

INSERT INTO emp
VALUES(7895,USER,NULL,NULL,TRUNC(SYSDATE),3000,200,20);

SELECT *
  FROM emp
 WHERE empno = 7895;

--7.1.4 使用子查询插入多行数据
DROP TABLE emp_copy;

CREATE TABLE emp_copy AS SELECT * FROM emp WHERE 1=2; 

INSERT INTO emp_copy
   SELECT *
     FROM emp
    WHERE deptno = 20;

SELECT * FROM emp;    

INSERT INTO emp_copy
   SELECT *
     FROM emp
    WHERE deptno = 20;    

--指定要插入数据的列名
INSERT INTO emp_copy
            (empno, ename, job, mgr, deptno)
   SELECT empno, ename, job, mgr, deptno
     FROM emp
    WHERE deptno = 30;

--使用Insert插入多表数据
  CREATE TABLE emp_dept_10 AS SELECT * FROM emp WHERE 1=2;
  CREATE TABLE emp_dept_20 AS SELECT * FROM emp WHERE 1=2;
  CREATE TABLE emp_dept_30 AS SELECT * FROM emp WHERE 1=2;
  CREATE TABLE emp_copy AS SELECT * FROM emp WHERE 1=2;    

   INSERT FIRST WHEN deptno = 10 --如果部门编号为10
   THEN INTO emp_dept_10 --则插入到emp_dept_10表
   WHEN deptno = 20 --如果部门编号为20
   THEN INTO emp_dept_20 --则插入到emp_dept_20表
   WHEN deptno = 30 --如果部门编号为30
   THEN INTO emp_dept_30 --则插入到emp_dept_30表
   ELSE --如果deptno不为10、20或者是30
   INTO emp_copy --则插入到emp_copy 表
     SELECT *
     FROM   emp; --查询emp表中的所有数据,插入到目标表

SELECT rowid,x.* from emp x;

select * from emp_dept_20

TRUNCATE TABLE emp_dept_10 ;
TRUNCATE TABLE emp_dept_20 ;
TRUNCATE TABLE emp_dept_30 ;
TRUNCATE TABLE emp_copy ;

INSERT FIRST WHEN deptno = 10 --如果部门编号为10
THEN INTO emp_dept_10 --插入到emp_dept_10,使用VALUES指定字段
  (empno, ename, sal, deptno)
VALUES
  (empno, ename, sal, deptno) WHEN deptno = 20 --如果部门编号为20
THEN INTO emp_dept_20 --插入到emp_dept_20,使用VALUES指定字段
  (empno, ename)
VALUES
  (empno, ename) WHEN deptno = 30 --如果部门编号为30
THEN INTO emp_dept_30 --插入到emp_dept_30,使用VALUES指定字段
  (empno, ename, hiredate)
VALUES
  (empno, ename, hiredate) ELSE --如果部门编号即不为10、20或30
INTO emp_copy --插入到emp_copy,使用VALUES指定字段
  (empno, ename, deptno)
VALUES
  (empno, ename, deptno)
  SELECT *
  FROM   emp; --指定插入子查询

commit;

SELECT * FROM emp_dept_10;

--7.2.1更新单行记录

SELECT * FROM emp;

UPDATE emp SET sal=3000 WHERE empno=7369;

UPDATE emp SET sal=3000,comm=200,mgr=7566 WHERE empno=7369;

SELECT * FROM emp;

SELECT AVG(y.sal) FROM emp y WHERE y.deptno=20;

--7.2.2使用子查询更新记录
UPDATE emp x
   SET x.sal = (SELECT AVG (y.sal)
                  FROM emp y
                 WHERE y.deptno = x.deptno)
 WHERE x.empno = 7369;

UPDATE emp
   SET sal = (SELECT sal
                FROM emp
               WHERE empno = 7782)
 WHERE empno = 7369;

 select * from emp_history;

 DROP TABLE emp_history;

UPDATE emp x
   SET (x.sal, x.comm) = (SELECT AVG (y.sal), MAX (y.comm)
                            FROM emp y
                           WHERE y.deptno = x.deptno)
 WHERE x.empno = 7369;

 CREATE TABLE emp_history AS SELECT * FROM emp;

UPDATE emp_history x
   SET (x.sal, x.comm) = (SELECT sal, comm
                            FROM emp y
                           WHERE y.empno =x.empno )
 WHERE x.empno = 7369;

 SELECT * FROM emp_history;

 SELECT * from emp;

--使用多表关联的形式进行更新
UPDATE (SELECT x.sal sal, y.sal sal_history, x.comm comm, y.comm comm_history
          FROM emp x, emp_history y
         WHERE x.empno = y.empno AND x.empno = 7369)
   SET sal_history = sal,
       comm_history = comm;          

UPDATE /*+bypass_ujvc*/  (SELECT x.sal sal, y.sal sal_history, x.comm comm, y.comm comm_history
          FROM emp x, emp_history y
         WHERE x.empno = y.empno AND x.empno = 7369)
   SET sal_history = sal,
       comm_history = comm;        

DELETE FROM emp WHERE empno=7894                   

INSERT INTO emp
VALUES(7894,'霍十','',DEFAULT,'',NULL,NULL,20);

--7.2.3 使用Merge合并表行
SELECT * FROM emp_copy;

SELECT * FROM emp;

MERGE INTO emp_copy c           --目标表
   USING emp e                  --源表,可以是表、视图或子查询
   ON (c.empno = e.empno)
   WHEN MATCHED THEN             --当匹配时,进行UPDATE操作
      UPDATE
         SET c.ename = e.ename, c.job = e.job, c.mgr = e.mgr,
             c.hiredate = e.hiredate, c.sal = e.sal, c.comm = e.comm,
             c.deptno = e.deptno
   WHEN NOT MATCHED THEN        --当不匹配时,进行INSERT操作
      INSERT
      VALUES (e.empno, e.ename, e.job, e.mgr, e.hiredate, e.sal, e.comm,
              e.deptno);

--7.3.1 删除单行记录
DELETE FROM emp WHERE empno=7903;         

DELETE FROM dept WHERE deptno=20;   

SELECT * FROM dept;  

--7.3.2 使用子查询删除记录
DELETE FROM emp
      WHERE deptno = (SELECT deptno
                        FROM dept
                       WHERE dname = '销售部');      

DELETE FROM emp_copy;      

DELETE FROM emp x
      WHERE EXISTS (SELECT 1
                      FROM emp_copy
                     WHERE empno = x.empno);
--等价语句
DELETE FROM emp x
      WHERE empno IN (SELECT empno
                        FROM emp_copy
                       WHERE empno = x.empno);

--7.3.3 使用Truncate清除表数据
TRUNCATE TABLE dept;

ALTER TABLE dept ENABLE CONSTRAINT pk_dept;

ALTER TABLE emp DISABLE CONSTRAINT PK_EMP;

CREATE TABLE dept_copy AS SELECT * FROM dept;

TRUNCATE TABLE dept;

INSERT INTO dept SELECT * FROM dept_copy;

----7.5.2 创建数据序列
CREATE SEQUENCE invoice_seq
INCREMENT BY 1
START WITH 1
MAXVALUE 9999999
NOCYCLE NOCACHE;

SELECT object_name,object_id,object_type
  FROM user_objects
 WHERE object_name = 'INVOICE_SEQ';

SELECT sequence_name, min_value, max_value, increment_by, last_number
  FROM user_sequences;

  SELECT invoice_seq.CURRVAL,invoice_seq.NEXTVAL FROM DUAL; 

  SELECT invoice_seq.CURRVAL FROM DUAL;

  SELECT invoice_seq.CURRVAL,invoice_seq.NEXTVAL FROM DUAL;   

CREATE TABLE invoice
(
   invoice_id NUMBER PRIMARY KEY,                     --自动编号,唯一,不为空
   vendor_id NUMBER NOT NULL,                                       --供应商ID
   invoice_number VARCHAR2(50)  NOT NULL,                           --发票编号
   invoice_date DATE DEFAULT SYSDATE,                               --发票日期
   invoice_total  NUMBER(9,2) NOT NULL,                             --发票总数
   payment_total NUMBER(9,2)   DEFAULT 0                            --付款总数
)

select * from invoice;

INSERT INTO invoice
            (invoice_id, vendor_id, invoice_number, invoice_total
            )
     VALUES (invoice_seq.NEXTVAL, 10, 'INV' || invoice_seq.CURRVAL, 100
            );

SELECT invoice_id, vendor_id, invoice_number, invoice_total
  FROM invoice;      

ALTER SEQUENCE invoice_seq
INCREMENT BY 2

ALTER SEQUENCE invoice_seq
              INCREMENT BY 2
              MAXVALUE 10
              NOCACHE
              NOCYCLE;

SELECT * FROM SCOTT.EMP;

SELECT * FROM emp;

SELECT userenv('LANG') FROM DUAL;

CREATE PUBLIC SYNONYM  scottemp
     FOR    scott.emp; 

DROP PUBLIC SYNONYM scottemp; 
时间: 2024-10-10 10:00:34

源码-PL/SQL从入门到精通-第七章-操作数据表的相关文章

源码-PL/SQL从入门到精通-第四章-PL/SQL控制语句(基础中的基础)

控制语句对任何一门语言.任何一个程序员而言,都是基础中的基础. 学了PL/SQL,才体会到Java语法的简洁,简直不是一个时代的东西:当然,他们的定位本来就不一样,不能以己之长比之他人之短. --第4章开始 --代码4.1 最简单的IF语句使用示例 DECLARE v_count NUMBER(10) := 0; --定义计数器变量 v_empno NUMBER(4) := 7888; --定义员工编号 BEGIN SELECT COUNT(1) --首先查询指定的员工编号是否存在 INTO v

源码-PL/SQL从入门到精通-第十三章-子程序-Part 2

调试nocopy功能时,为了看到实际效果,设置了一个比较大的循环次数,结果悲剧了: 运行了近1个小时没出结果,电脑死机(任务管理器都打不开):无奈只能强行关机,开机时间又特别长,一度让我以为系统崩溃. 看来,PL/SQL developer下调试这种暴力计算的程序风险很高啊,我在Eclipse下调试Java程序时从来没碰到过这种造成电脑死机的情况. 不过,这章的内容实用性很强,死机也值了(有点心疼电脑了) -代码13.11 使用%Type定义形式参数 CREATE OR REPLACE PROC

源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 1

随书附带的源码没有序号,部分有bug,调试过程中一并更正. --代码2.1 使用书序结构计算员工薪资 DECLARE v_sal1 NUMBER; v_sal2 NUMBER; v_sumsal NUMBER; BEGIN SELECT sal INTO v_sal1 FROM emp WHERE empno = &empno1; SELECT sal INTO v_sal2 FROM emp WHERE empno = &empno2; v_sumsal := v_sal1 + v_sa

源码-PL/SQL从入门到精通-第十章-使用游标-Part 2

虽说下个项目中要用到PL/SQL,但还不清楚需要用到哪些具体的知识点?估计游标是不可或缺了,如果能在现有代码的基础上改一改就能满足项目要求,现在的工作也就更有价值了. --代码10.14 基本的Loop循环结构 DECLARE dept_row dept%ROWTYPE; --定义游标结果记录变量 CURSOR dept_cursor IS SELECT * FROM dept; --定义游标变量 BEGIN OPEN dept_cursor; --打开游标 LOOP --简单循环 FETCH

Unity3D入门 到精通 第七章物理引擎应用小结

实践了书上第七章的CrazyBall, 1.Camera的尾随,本例中没有使用已有的CarmeraFollow脚本,而是直接根据Ball的pos来跟随,当然也使用了插值,并设置了阻尼弹簧方式: transform.position = Vector3.Lerp(transform.position, newPos, Time.deltaTime * dampSpeed); 2.单例模式在游戏Manger管理中的应用: public static myCrazyBallManager mCB;//

SaltStack 入门到精通 - 第七篇: Targeting

什么是Targeting? Targeting minions 是指那些minion会作为运行命令或是执行状态的目标.这些目标可以是一个主机名,系统信息,定义的分组,甚至是自定义的绑定的对象. 例如命令  salt web1 apache.signal restart 可以重启ID 为web1的minion的apache.当然也可以在top文件中使用web1来作为目标匹配的内容: base:   'web1':     - webserver Targing 有哪些匹配方式? Minion Id

D3.js的v5版本入门教程(第七章)—— 比例尺的使用

D3.js的v5版本入门教程(第七章) 比例尺在D3.js中是一个很重要的东西,我们可以这样理解d3.js中的比例尺——一种映射关系,从domain映射到range域(为什么会是domain和range呢?等一下你就会看到,因为我们在建立比例尺是常常会用到domain()和range()两个函数,当然不是绝对的,D3中有很多类型的比例尺) 下面介绍在本套教程中常用的两种比例尺 线性比例尺序数比例尺        线性比例尺 domain域和range域都可以连续变化 <body> <sc

ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 GIS的六大功能是数据获取.存储.查询.分析.表达.输出.在前面的内容里已经介绍了使用ArcGIS进行数据获取.存储.查询.表达和输出的过程,本章将介绍如何在ArcGIS中进行地理分析.分析是GIS的核心和灵魂,是GIS区别于一般的信息系统.CAD或者电子地图系统的主要标志之一. GIS分析,就是研究

MyBatis源码分析-SQL语句执行的完整流程

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis框架主要完成的是以下2件事情: 根据JD