除了序列(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