ORACLE学习(十)

--表的重名名

RENAME 旧名 TO 新名

RENAME STU TO TT;

--清空表数据

TRUNCATE TABLE 表

TRUNCATE TABLE TT;

SELECT * FROM TT;

--删除表

DROP TABLE 表名 [PURGE]

加上purge表示物理删除 直接就没了

不加表示逻辑删除 把表放进了回收站

DROP TABLE TT;

DROP TABLE EMP_NULL PURGE;

--查看回收站

SELECT * FROM USER_RECYCLEBIN;

--从回收站闪回表

FLASHBACK TABLE 表名 TO BEFORE DROP [RENAME TO 新表名]

FLASHBACK TABLE TT TO BEFORE DROP RENAME TO STU_NEW;

--视图:

定义:是一张虚拟的表 其内容有查询语句定义

创建:CREATE [OR REPLACE] VIEW 视图名 AS SELECT 语句[WITH READ ONLY]

加上or replace如果视图名存在 会进行覆盖

不加or replace如果视图名存在 会报错(当前名称由现有对象占用)

加上with read only表示只读视图 无法修改数据

不加with read only表示普通视图 可以修改数据

--创建视图v_20 内容是emp中20部门的数据

CREATE OR REPLACE VIEW V_20 AS SELECT * FROM EMP WHERE DEPTNO=20;

SELECT * FROM V_20;

--创建视图 内容是emp和dept关联之后的数据

CREATE OR REPLACE VIEW V_DE AS SELECT E.*,DNAME,LOC FROM EMP E

,DEPT D WHERE E.DEPTNO=D.DEPTNO;

SELECT * FROM V_DE;

注:视图的数据来源表叫基表

视图不存储数据 只存储定义内容的语句 内容由基表提供

当基表的数据发生改变之后 视图的内容跟着改变

修改视图的数据就是在修改基表的数据

视图的优缺点:优点 不占空间 安全

缺点 性能差 修改受限制

--删除视图

DROP VIEW 视图名

DROP VIEW V_20;

--序列 SEQUENCE

数据库中用来存放等差数据列的表

创建序列的语法:

CREATE SEQUENCE 序列名

[START WITH 数] --从几开始 默认是1

[MAXVALUE 数] --最大到几 默认。。。。

[MINVALUE 数] --最小是几 默认是1

[INCREMENT BY 数] --间隔/步长 默认是1

[CACHE 数] --缓冲值 默认是20

[CYCLE] --是否循环

CREATE SEQUENCE S1;

--序列的使用

序列.NEXTVAL --获取新值(初始化)

序列.CURRVAL --回去当前值

SELECT S1.NEXTVAL FROM DUAL;

关闭延迟

alter systerm set deferred列的删除

DROP SEQUENCE 序列名

DROP SEQUENCE S1;

DML语句 数据库操作语言

插入 insert

更新 update

删除 delete

合并 merge

--插入数据

批量插入

手动插入

批量:INSERT INTO 表名[列。。。] select 语句;

--创建一张空表 emp_n

CREATE TABLE EMP_N AS SELECT * FROM EMP WHERE 1=2;

SELECT * FROM EMP_N;

--把emp中10部门的数据插入到emp_n中

INSERT INTO EMP_N SELECT * FROM EMP WHERE DEPTNO=10;

--把emp中20部门的姓名 职位 工资 部门编号插入

INSERT INTO EMP_N(ENAME,JOB,SAL,DEPTNO) SELECT ENAME,JOB,SAL,DEPTNO

FROM EMP WHERE DEPTNO=20;

--把dept中的dname loc deptno 插入到emp_n的ename job deptno中

INSERT INTO EMP_N(ENAME,JOB,DEPTNO) SELECT DNAME,LOC,DEPTNO

FROM DEPT;

手动插入

INSERT INTO 表名[列。。] VALUES(值。。。)

INSERT INTO EMP_N(EMPNO,ENAME,SAL) VALUES(1234,'OLDSIX',3000);

INSERT INTO EMP_N VALUES(2234,'zhangmou','OLDDRIVE',NULL,

SYSDATE,2000,0,40);

SELECT * FROM EMP_N;

--把序列当做主键值插入到表中

CREATE SEQUENCE S5;

INSERT INTO EMP_N(EMPNO,ENAME)

VALUES(S5.NEXTVAL,'神舟'||S5.CURRVAL||'号');

--更新数据

UPDATE 表 SET 列1=值1,列2=值2,。。。[WHERE]

不加where条件会对全表的数据进行更新

--创建emp_1数据同emp

CREATE TABLE EMP_1 AS SELECT * FROM EMP;

SELECT * FROM EMP_1;

--把emp_1中10部门的员工职位改为小写 工资+500

UPDATE EMP_1 SET JOB=LOWER(JOB),SAL=SAL+500 WHERE DEPTNO=10;

--把emp_1中所有人的姓名改为首字母大写

UPDATE EMP_1 SET ENAME=INITCAP(ENAME);

--新建emp_1 更新10部门呢的工资为原来的一半 名字转小写

--20部门 工资减半再减半 名字为首字母大写

--30部门工资为原来的5分之一 名字左边+@

--所有人的奖金+5000

update emp_1 set COMM=NVL(COMM,0)+5000;

--删除数据

DELETE FROM 表 [WHERE 条件]

不加where会把全表的数据进行删除

SELECT * FROM EMP_1;

--删除1981年入职的员工

DELETE FROM EMP_1 WHERE TO_CHAR(HIREDATE,'YYYY')=1981;

DELETE FROM EMP_1;

TRUNCATE 和 DELETE 的区别?

truncate是ddl语句 不能回滚 delete是dml语句 可以撤销

truncate不能加条件 delete可以加条件

truncate速度快 delete速度慢

truncate可以降低高水位线 delete不能降低高水位线

--rowid 伪列 行地址(每一条数据会有一个也全局唯一的行地址)

去重重复的数据

SELECT E.*,ROWID

FROM EMP_1 E

--制造一些重复数据

INSERT INTO EMP_1 SELECT * FROM EMP WHERE DEPTNO=20;

--如何查看重复的数据

SELECT *

FROM EMP_1

WHERE EMPNO IN(SELECT EMPNO FROM EMP_1 GROUP BY EMPNO

HAVING COUNT(1)>1);

--如何去重表中重复的数据

一、

1、创建一个备份表 数据同emp_1中去重之后的数据

CREATE TABLE EMP_1_BACK AS SELECT DISTINCT * FROM EMP_1;

2、清空原来的表

TRUNCATE TABLE EMP_1;

3、把备份表中的数据重新插回到原表中

INSERT INTO EMP_1 SELECT * FROM EMP_1_BACK;

4、删除备份表

DROP TABLE EMP_1_BACK;

二、

DELETE FROM EMP_1 WHERE ROWID NOT IN(SELECT MAX(ROWID) FROM EMP_1

GROUP BY EMPNO);

注:在进入表中的数据rowid最小

--合并数据

MERGE INTO 表A --进行插入和更新的表

USING 表B --参考表

ON 条件

WHEN MATCHED TEHN --匹配成功

UPDATE SET A.列=B.列|值

WHEN NOT MATCHED THEN --没有匹配上

INSERT(A.列。。。) VALUES(B.列|值)

创建两张表 empa empb

a中插入emp中的empno ename deptno

b中插入emp中empno 小写的ename deptno(10变成40)

CREATE TABLE EMPA AS SELECT EMPNO,ENAME,DEPTNO FROM EMP;

CREATE TABLE EMPB AS SELECT EMPNO,LOWER(ENAME) ENAME,DECODE(DEPTNO,10,40,

DEPTNO) DEPTNO FROM EMP;

SELECT * FROM EMPA;

SELECT * FROM EMPB;

参考b对a进行更新

MERGE INTO EMPA A

USING EMPB B

ON(A.EMPNO=B.EMPNO AND A.DEPTNO=B.DEPTNO)

WHEN MATCHED THEN

UPDATE SET A.ENAME=B.ENAME

WHEN NOT MATCHED THEN

INSERT VALUES(B.EMPNO,B.ENAME,B.DEPTNO);

[[补充DDL

--外键约束

外键约束需要两张表 创建外键的表叫子表 参考表是父表

创建外键约束的列叫外键列 参考表的参考列必须是父表的主键列

作用:保证存入外键列中的值一定是父表的主键列中存在的

语法:CONSTRAINT 约束名 FOREIGN KEY(外键列) REFERENCES 父表(主键列)

[ON DELETE CASCADE |ON DELETE SET NULL]

建立父表

CREATE TABLE DEPT1 AS SELECT * FROM DEPT;

ALTER TABLE DEPT1 ADD PRIMARY KEY(DEPTNO);

drop table emp_1;

建立子表

CREATE TABLE EMP_1 AS SELECT EMPNO,ENAME,DEPTNO FROM EMP WHERE 1=2;

SELECT * FROM EMP_1;

在子表中设立外键

ALTER TABLE EMP_1 ADD CONSTRAINT FK_1 FOREIGN KEY(DEPTNO) REFERENCES

DEPT1(DEPTNO) on delete set null;

INSERT INTO EMP_1 SELECT EMPNO,ENAME,DEPTNO FROM EMP;

INSERT INTO EMP_1 VALUES(1234,'LLLLL',40);

INSERT INTO EMP_1 VALUES(2234,'L22LL',50);

不指定级联删除(先删子表在删父表)

DELETE FROM EMP_1 WHERE DEPTNO=10; --删除子表数据没限制

DELETE FROM DEPT1 WHERE DEPTNO=10; --直接删除因为子表有数据不能执行

指定级联删除

DELETE FROM DEPT1 WHERE DEPTNO=10;--可以直接删除父表数据 子表随着删除

指定级联删除为空

DELETE FROM DEPT1 WHERE DEPTNO=10;--可以直接删除父表数据 子表相关项还再

--只是外键列的值变为空

不指定级联删除 no action --啥也不写 默认

级联删除 on delete cascade

指定级联删除为空 ON DELETE SET NULL

注:外键列中的值可以为空 也可以不唯一

删除子表的外键列中值不受影响

删除父表主键的数据的时候

如果没有指定级联删除 要先删除子表的相关项 在去删除父表对应的内容

如果指定可级联删除 子表的数据和父表会一同被删除

如果指定级联删除为空 父表数据删除之后 子表数据还存在 只是外键列的

值变为了空

插入/更新到子表外键列中的值 要在父表的主键列中存在

插入/更新到父表主键列中的值 没有限制(只要满足主键约束即可)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟德斯鸠的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值