Oracle 语法总结 (五)

mac2022-06-30  21

一,知识点

视图 是数据库的对象之一,在SQL一句中体现和表一样,但是他不是一张真实存在的表,只是对应表的结果集 授予权限 --1 GRANT CREATE VIEW TO liwc 创建简单视图 --2 CREATE VIEW v_emp_10 AS SELECT empno,ename,sal,deptno FROM emp_liwc WHERE deptno = 10 查看视图结构 --3 DESC v_emp_10 查看视图数据 --4 SELECT * FROM v_emp_10 删除视图 --5 DROP VIEW v_emp_10 --6 当视图对应的子查询中有函数或者表达式时,必须指定别名 CREATE VIEW v_emp_10 AS SELECT empno id,ename,sal*12 sal,deptno FROM emp_liwc WHERE deptno = 10 视图对应的子查询分为:简单视图,复杂视图,连接视图 1对应的子查询不含有函数,表达式,去重,分组 2不是简单视图的都是复杂视图 3对应的子查询中有多个表关联 简单视图可以进行DML操作,但是复杂视图不可以 当视图对应的子查询中有函数或者表达式时,必须指定别名 -- 修改视图:视图的结果取决于对应的子查询,随意修改视图就是就是替换对应的子查询 --7 CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id,ename name,sal,deptno FROM emp_liwc WHERE deptno = 10 --8 对视图进行DML操作时,就是对基础表操作 虽然可以操作但是也不能违反基表约束(no null:看不见的默认为null) INSERT INTO v_emp_10 (id,name,sal,deptno) VALUES (1001,'JACK',2000,10)

SELECT * FROM v_emp_10 SELECT * FROM emp_liwc

UPDATE v_emp_10 SET sal = 3000 WHERE id = 1001

DELETE FROM v_emp_10 WHERE id = 1001

对简单视图进行DML操作后会污染及基础表的数据 ,操作简单视图会对基础表进行响应的操作,这些过程都是不可见的 就是对数据的污染 删除不存在数据污染的情况 --9 为视图添加检查选项可以避免产生数据污染 要求DML操作后该记录视图对其可见,否则不允许操作 WITH CHECK OPTION  -- CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id ,ename name,sal,deptno FROM emp_liwc WHERE deptno = 10 WITH CHECK OPTION  SQL 错误: ORA-01402: 视图 WITH CHECK OPTION where 子句违规 INSERT INTO v_emp_10 (id,name,sal,deptno) VALUES (1001,'JACK',2000,20) -- 对视图进行添加只读选项,不允许进行DML操作 WITH READ ONLY  -- CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id ,ename name,sal,deptno FROM emp_liwc WHERE deptno = 10 WITH READ ONLY  SQL 错误: ORA-42399: 无法对只读视图执行 DML 操作 INSERT INTO v_emp_10 (id,name,sal,deptno) VALUES (1001,'JACK',2000,10) --10 数据字典 是一系列的表,这些表的数据数据库自行维护 ,记录的是一些清单信息方便随时查看 USER_OBJECTS:记录用户创建的虽有数据库库对象 USER_VIEWS:记录用户创建的所有视图 USER_TABLES:记录用户创建的所有的表 SELECT * FROM USER_OBJECTS WHERE object_type = 'VIEW' AND object_name LIKE 'V_EMP_10' SELECT * FROM USER_OBJECTS WHERE object_type = 'VIEW' AND object_name LIKE 'V_EMP_10'

SELECT view_name,text FROM USER_VIEWS WHERE view_name like '' SELECT * FROM USER_TABLES --11 创建一个含有各个部门工资的视图 CREATE OR REPLACE VIEW v_emp_dept_sal AS SELECT  MAX(e.sal)max_sal, MIN(e.sal)min_sal, AVG(e.sal)avg_sal, SUM(e.sal)sum_sal, d.deptno,d.dname FROM emp_liwc e JOIN dept_liwc d ON e.deptno = d.deptno GROUP BY d.deptno,dname

SELECT * FROM v_emp_dept_sal SELECT * FROM emp_liwc

查看高于所在部门的平均工资员工 SELECT e.ename,e.sal FROM emp_liwc e,v_emp_dept_sal t WHERE e.deptno = t.deptno AND e.sal>t.avg_sal --12 序列:是数据库的对象之一,作用是根据指定的规则生成一些列数字,通常为某张表关键字段提供使用 主键:通常每张表都有主键字段,该字段要求非空且唯一,使用该字段确定每张表中每条记录使用 创建序列 CREATE SEQUENCE seq_emp_id  START WITH 1 INCREMENT BY 1 删除序列 DROP SEQUENCE seq_emp_id  SQL 错误: ORA-02201: 此处不允许序列 DELETE FROM seq_emp_id 序列提供了两个伪列: NEXTVAL:获取序列的下一个数字,第一次获取返回的是start WITH:指定的数字,以后则是最后获取的数字加上步涨的数字得到的 NEXTVAL会导致序列发生部进,且不可回退

CURRVAL:获取序列的当前数字,即最后一次生成的数字,新创建的序列至少调用一次NEXTVAL才 可以使用,CURRVAL不会发生步进 -- ORA-08002: 序列 SEQ_EMP_ID.CURRVAL 尚未在此会话中定义 SELECT seq_emp_id.CURRVAL FROM dual -- SELECT seq_emp_id.NEXTVAL FROM dual

INSERT INTO emp_liwc (empno,ename,sal,job,deptno) VALUES (seq_emp_id.NEXTVAL,'JACK',3000,'CLERK',10) --13 索引 怎么去添加索引(like不适用索引) 索引是数据库的对象之一, 作用是加快查询效率,创建和使用是数据库自行完成的 经常出现在WHERE字段中,或者去重,排序,关联条件的字段中 创建索引 CREATE INDEX inx_emp_ename ON emp_liwc(ename) 复合索引也叫多列索引,基于多个列的索引 CREATE INDEX inx_emp_job_sal ON emp_liwc(job,sal) CREATE INDEX emp_upper_idx ON emp_liwc(UPPER(ename)) 在使用增加效率 SELECT * FROM emp_liwc WHERE UPPER(ename) = 'KING' -- 修改和删除索引 重建索引emp_upper_idx ALTER INDEX emp_upper_idx REBUILD 删除索引 DROP INDEX emp_upper_idx 原则 小表不建立索引 关键词后字段顺序一致 增删多的不建索引 --12 约束概述 约束条件 -- 非空约束: CREATE TABLE employees( eid NUMBER(6), name VARCHAR2(30) NOT NULL, salary NUMBER(7,2), hiredate DATE CONSTRAINT employees_hiredate_nn NOT NULL ) 修改表时添加 ALTER TABLE employees MODIFY (eid NUMBER(6) NOT NULL) 删除 ALTER TABLE employees MODIFY (name VARCHAR2(30) NULL) -- 唯一性约束 要求改字段在整张表中每条记录的值都不重复null除外 CREATE TABLE employees1( eid NUMBER(6) UNIQUE, name VARCHAR2(30), email VARCHAR2(50), salary NUMBER(7,2), hiredate DATE,--逗号勿忘,前者没有(not null) CONSTRAINT employees_email_nk UNIQUE(email) ) 1 行已插入。 INSERT INTO employees1 (eid,name,email) VALUES (10,'LIWC','lwc.gmail.com') SQL 错误: ORA-00001: 违反唯一约束条件 (LIWC.SYS_C007021) INSERT INTO employees1 (eid,name,email) VALUES (10,'LIWC','lwc.gmail.com') 1 行已插入。 INSERT INTO employees1 (eid,name,email) VALUES (11,'LIWC','lwc.163.com') 1 行已插入。 INSERT INTO employees1 (eid,name,email) VALUES (12,'LIWC',NULL) -- 修改表时添加 ALTER TABLE employees1 ADD CONSTRAINT employees_name_nk UNIQUE(name)

删除?????????????? -- 添加主键约束(非空且唯一) CREATE TABLE employees2( eid NUMBER(6) PRIMARY KEY, name VARCHAR2(30), email VARCHAR2(50), salary NUMBER(7,2), hiredate DATE ) SQL 错误: ORA-01400: 无法将 NULL 插入 ("LIWC"."EMPLOYEES2"."EID") INSERT INTO employees2 (eid) VALUES (NULL) -- 外键约束 --不用 检查约束 员工的薪水必须大于两千 ALTER TABLE employees2 ADD CONSTRAINT employees2_salary_check CHECK(salary>2000) SQL 错误: ORA-02290: 违反检查约束条件 (LIWC.EMPLOYEES2_SALARY_CHECK) INSERT INTO employees2  (eid,salary) VALUES (16,202)

DELETE FROM employees1 DESC employees2

二,例子

1:创建一个视图,包含20号部门的员工信息,字段:empno,ename,sal,job,deptno CREATE VIEW v_emp_20 AS SELECT empno,ename,sal,job,deptno FROM emp_liwc WHERE deptno = 20 2:创建一个序列seq_emp_no,从10开始,步进为10 CREATE SEQUENCE seq_emp_no  START WITH 10 INCREMENT BY 10 3:编写SQL语句查看seq_emp_no序列的下一个数字 SELECT seq_emp_no.NEXTVAL FROM dual 4:编写SQL语句查看seq_emp_no序列的当前数字 SELECT seq_emp_no.CURRVAL FROM dual 5:为emp表的ename字段添加索引:idx_emp_ename  CREATE INDEX idx_emp_no ON emp_liwc(ename) 6:为emp表的LOWER(ename)字段添加索引:idx_emp_lower_ename CREATE INDEX emp_lower_idx ON emp_liwc(LOWER(ename)) 7:为emp表的sal,comm添加多列索引 CREATE INDEX inx_emp_job_sal ON emp_liwc(sal,comm) 8:创建myemployee表,字段:   id NUMBER(4) ,   nameVARCHAR2(20),   birthday DATE,   telephone VARCHAR2(11),   scoreNUMBER(9,2)   其中id作为主键,name要求不能为空,telephone需要唯一,score值必须>=0--1 CREATE TABLE myemployee(   id NUMBER(4)PRIMARY KEY,   name VARCHAR2(20)NOT NULL,   birthday DATE,   telephone VARCHAR2(11)UNIQUE,   score NUMBER(9,2) ); ALTER TABLE myemployee ADD CONSTRAINT myemployee_salary_check CHECK(score>=0)

浮生夢 举世瞩目 当有一天,有星光刺破黑洞的昏暗,那是我吞吐天地的余晖,代表着我已映照诸天。当有一天,有玄雷划过星空的浩瀚,那是我拳光的劲风,代表着我已回来。当星河列阵,宇宙星海星光齐绽,那是我在笑,我已复苏,我在归来,我已无敌!
最新回复(0)