--数据库对象
数据库对象包含:表,视图,索引,序列
视图VIEN
视图在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 1
INCREMENT 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);

OracleSql语句学习(五)的更多相关文章

  1. Oracle中SQL语句学习五(统计分组语句group by和having)

    oracle(41) 在 应用系统开发中,进行需要统计数据库中的数据,当执行数据统计时,需要将表中的数据进行分组显示,在统计分组中是通过group by子句.分组函数.having子句共同实现的.其中 ...

  2. OracleSql语句学习(三)

    --在SELECT子句中出现的函数或表达式会在结果集中作为字段名,这样的可读性差,因此可以为--这样的字段添加别名(别名中不能出现空隔,除非是用双引号括起来的)--别名中如果希望包含空隔或者区分大小写 ...

  3. OracleSql语句学习(四)

    SELECT e.ename,m.ename,d.locFROM emp_weiyiji e JOIN emp_weiyiji m ON e.mgr=m.empnoJOIN dept_weiyiji ...

  4. OracleSql语句学习(二)

    --DQL语句--查询语句用来检查数据使用--SELECT子句用来指定要查询的字段,若写“*”则表示查询所有字段.FROM子句用来指定数据来源的表.--SELECT * FROM emp_weiyij ...

  5. OracleSql语句学习(一)

    --SQL语句本身是不区分大小写的,每个关键字用空格隔开,为了增加可读性,退出所有关键字--全部大写,非关键字都小写SELECT SYSDATE FROM dual--创建表CREATE TABLE ...

  6. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  7. 【java开发】分支语句、循环语句学习

    一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...

  8. Oracle----SQL语句积累 (Oracle 导入 dmp文件)

    Oracle----SQL语句积累 (Oracle 导入 dmp文件) Oracle SQL PL  导入dum文件 1.数据库DBA权限: 注意:这个是在cmd命令行中直接输入,不需要进入Oracl ...

  9. SQL语句学习手册实例版

    SQL语句学习手册实例版 表操作 例1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, ...

随机推荐

  1. Redis in python

    什么是Redis 数据库类型分为两种,关系型和非关系型,Redis是一个非常重要的非关系型数据库. 既然是数据库,就是存储数据的一个空间,或者说是一个软件,非关系就是不再按照一对一多对多等结构进行外键 ...

  2. Java与.net的选择和比较

    跨平台对开发商是一个巨大的诱惑.一次开发,多个平台使用,降低了迁移成本,有利.但Java的开发工具没有.net顺手,对编码人员的要求比.net要高. .net培训成本低,上手快.尤其如果开发人员以前都 ...

  3. Java中的锁——锁的分类

    Java中有各种各样的锁,例如公平锁.乐观锁等等,这篇文章主要介绍一下各种锁的分类. 按照其性质分类 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁是指多个线程获取锁的顺序并 ...

  4. vue2.x 给一个对象里添加一个没有的属性

    obj = {...obj, name:'addName'} //给obj对象 添加一个name字段,并且赋值为‘addName’ 参考:

  5. Dynamics 365检查工作流、SDK插件步骤是否选中运行成功后自动删除系统作业记录

    本人微信公众号:微软动态CRM专家罗勇 ,回复298或者20190120可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 系统 ...

  6. 等价路由在路由器和CE交换机上默认的行为是不同的,路由器总是走第一个下一跳,CE交换机是逐包。

    结论: 1.在eNSP中实验,路由器和CE交换机对于等价路由的默认转发行为是不同的, 路由器:默认是基于流的转发形态,更准确的来讲,ping两个不同的下一跳,都是走等价路由的第一个路由,不走第二条路由 ...

  7. iOS----------YYModel

    weaterInfoModel *weather = [weaterInfoModel yy_modelWithDictionary:returnData[@"weatherinfo&quo ...

  8. python(day16)内置函数,匿名函数

    # add = lambda x,y:x+y # print(add(1,2)) # dic={'k1':10,'k2':100,'k3':30} # def func(key): # return ...

  9. JHipster技术栈定制 - JHipster Registry消息总线配置

    本文说明了如何定制化JHipster-Registry,增加消息总线功能. 实现的效果就是修改配置中心的文件后,通过消息队列主动推送给微服务而无需重启微服务,实现配置内容热加载. 1 整体规划 1.1 ...

  10. 结对编程项目——C语言实现WordCount Web化

    结对编程项目 代码地址 201631062219,201631011410 gitee项目地址:https://gitee.com/xxlznb/pair_programming 作业地址:https ...