zoukankan      html  css  js  c++  java
  • OracleSql语句学习(五)

    数据库对象

    视图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);
     
  • 相关阅读:
    命令[34]
    命令[33]
    命令[27]
    命令[38]
    命令[19]
    命令[22]
    命令[30]
    命令[37]
    命令[23]
    命令[26]
  • 原文地址:https://www.cnblogs.com/zblwyj/p/10612056.html
Copyright © 2011-2022 走看看