数据库对象
视图VIEW:
数据库对象包含:表,视图,索引,序列 ①视图在SQL语句中体现的角色与表一样,但是视图并非真实存在的表,它只是对应一条查询语句的结果集 ②使用视图通常是为了重用子查询,简化SQL语句的复杂度和限制某些数据的访问。 创建一个包含10号部门员工信息的视图: CREATE VIEW v_emp_10_weiyiji AS SELECT empno,ename,sal,job,deptno FROM emp_weiyiji WHERE deptno=10 查看视图结构 DESC v_emp_10_weiyiji SELECT * FROM v_emp_10_weiyiji ③视图中对应的子查询中若含有函数或表达式,那么该字段必须给别名。并且字段的别名会成为该视图对应字段的名字。 CREATE OR REPLACE VIEW v_emp_10_weiyiji AS SELECT empno id,ename name, sal salary,job,deptno FROM emp_weiyiji WHERE deptno = 10 SELECT * FROM v_emp_10_weiyiji 针对视图的DML操作:复杂视图不能进行DML操作 ④对简单视图进行DML操作就是对该视图数据来源的基础表进行的。 INSERT INTO v_emp_10_weiyiji (id,name,salary,job,deptno) VALUES (1001,'JACK',2000,'CLERK',10) SELECT * FROM v_emp_10_weiyiji SELECT * FROM emp_weiyiji UPDATE v_emp_10_weiyiji SET salary=3000 WHERE id=1001 DELETE FROM v_emp_10_weiyiji WHERE id=1001 对视图进行DML操作是可能会污染基础表数据的,即:对视图进行DML操作后,视图对该数据不可见,从视图插入一行其他部门数据数据,视图看不见,但是基表存在。 INSERT INTO v_emp_10_weiyiji (id ,name,salary,job,deptno) VALUES (1001,'JACK',2000,'CLERK',20) SELECT * FROM v_emp_10_weiyiji SELECT * FROM emp_weiyiji 将视图的部门号改成20 UPDATE v_emp_10_weiyiji SET deptno=20 SELECT * FROM v_emp_10_weiyiji ⑤为了避免不当的DML操作会污染基表,可以为视图添加检查选项:WITH CHECK OPTION,当视图添加了该选项后,那么对视图进行DML操作时,视图会检查执行该操作后视图是否对操作的记录可见,不可见则不允许该DML操作。 CREATE OR REPLACE VIEW v_emp_10_weiyiji AS SELECT empno id ,ename name, sal salary,job deptno FROM emp_weiyiji WHERE deptno = 10 WITH CHECK OPTION 为视图添加只读选项后,该视图不允许进行DML任何操作 CREATE OR REPLACE VIEW v_emp_10_weiyiji AS SELECT empno id ,ename name, sal salary,job deptno FROM emp_weiyiji WHERE deptno = 10 WHERE READ ONLY 数据字典可以产看用户创建的数据库对象信息 SELECT object_name,object_type FROM user_objects WHERE object_name LIKE '%_WEIYIJI' SELECT view_name,text FROM user_views WHERE view_name LIKE '%_WEIYIJI' 创建复杂视图:当视图对应的SQL语句含有函数,表达式分组,去重或关联查询时,该视图为复杂视图。 复杂视图不允许进行DML操作 创建一个含有每个部门薪资情况的视图 CREATE VIEW v_dept_weiyiji 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_weiyiji e, dept_weiyiji d WHERE e.deptno=d.deptno GROUP BY d.deptno,d.dname SELECT * FROM v_dept_weiyiji 查看谁的工资高于所在部门的平均工资? SELECT e.ename,e.sal,e.deptno FROM emp_weiyiji e,v_dept_weiyiji v WHERE e.deptno=v.deptno AND e.sal>v.avg_sal 删除视图 DROP VIEW v_emp_weiyiji
序列
①序列也是数据库对象之一,序列作用是生成一系列数字。 通常使用序列是为表的主键(ID)字段提供值。 创建一个序列 CREATE SEQUENCE seq_emp_weiyiji_id START WITH 1INCREMENT BY 1 ②序列提供了两个伪列用于取数字 NEXTVAL:获取序列下一个数字。 ③序列会根据序列最后生成的数字加上步长来得到。NEXTVAL会导致序列步进 ④序列是不能回退的,发生步进后之前的数字就无法再次获取。 CURRVAL:获取序列最后生成的数字。在使用CURRVAL之前至少调用过一次NEXTVAL后才可以使用 SELECT seq_emp_weiyiji_id.NEXTVAL FROM dual 使用seq_emp_id为emp表提供主键值: INSERT INTO emp_weiyiji (empno,ename,job,sal,deptno) VALUES (seq_emp_weiyiji_id.NEXTVAL,'JACK','CLERK',2000,20) 删除序列 DROP SEQUENCE seq_emp_weiyiji_id
INDEX索引
索引是为了提高查询效率,索引的实现是数据库内部完成。 单列索引 CREATE INDEX idx_emp_weiyiji_ename ON emp_weiyiji(ename); SELECT * FROM emp_weiyiji 多列索引 CREATE INDEX idx_emp_weiyiji_job_sal ON emp_weiyiji(job,sal) SELECT empno,ename,sal,job FROM emp_weiyiji ORDER BY job,sal 为函数添加索引 CREATE INDEX emp_weiyiji_ename_upper_idx ON emp_weiyiji(UPPER(ename)); SELECT * FROM emp_weiyiji WHERE UPPER(ename)='KING'; 重建索引idx_emp_weiyiji_ename ALTER INDEX idx_emp_weiyiji_ename REBUILD; 删除索引idx_emp_weiyiji_ename DROP INDEX idx_emp_ename; 建表时添加非空约束 CREATE TABLE employees_weiyiji( eid NUMBER(6), name VARCHAR2(30) NOT NULL, salary NUMBER (7,2), hiredate DATE CONSTRAINT employees_weiyiji_hiredate_nn NOT NULL) DROP TABLE employees_weiyiji DESC employees_weiyiji 修改表时添加非空约束 ALTER TABLE employees_weiyiji MODIFY (eid NUMBER(6)NOT NULL); 取消非空约束 ALTER TABLE employees_weiyiji MODIFY (eid NUMBER(6) null); 添加唯一性约束 唯一性约束可以保证字段的值在整张表中每条记录都不一样,NULL除外。 CREATE TABLE employees1_weiyiji( eid NUMBER(6) UNIQUE, name VARCHAR2(30), email VARCHAR2(50), salary NUMBER(7,2), hiredate DATE, CONSTRAINT employees1_weiyiji_email_uk UNIQUE(email) ) DESC employees1_weiyiji INSERT INTO employees1_weiyiji (eid,NAME,email) VALUES(2,'JACK','JACK2@tedu.cn') SELECT * FROM employees1_weiyiji 建表之后增加唯一性约束条件 ALTER TABLE employees1_weiyiji ADD CONSTRAINT employees1_weiyiji_name_uk UNIQUE(name); DELETE FROM employees1_weiyiji WHERE name='JACK' 主键约束 非空且唯一,且一张表只能有一个字段添加主键约束。 CREATE TABLE employees2_weiyiji( eid NUMBER(6) PRIMARY KEY, name VARCHAR2(30), email VARCHAR2(50), salary NUMBER(7,2), hiredate DATE ); DROP TABLE employees2_weiyiji INSERT INTO employees2_weiyiji (eid,name) VALUES(1,'jack') SELECT * FROM employees2_weiyiji 检查约束 ALTER TABLE employees2_weiyiji ADD CONSTRAINT employees2_weiyiji_salary_check CHECK(salary>2000) INSERT INTO employees2_weiyiji (eid, name,salary,deptno) VALUES(1236,'donna noble',2500,40);
个人学习随笔,若是帮助到您,请给个推荐,或者评论一下下,谢谢了哟。若有不懂之处,请联系QQ:351094262(验证信息:博客园),原创不易,转载请标明出处!