源码-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; 

你可能感兴趣的:(数据库(DB))