您的位置:首页 > 数据库

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

2016-07-19 12:11 465 查看
除了序列(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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: