常用数据库知识(五)
来源:互联网 发布:欧特克软件qq群 编辑:程序博客网 时间:2024/04/30 21:56
--视图
--视图是数据库对象之一
--视图在SQL语句中体现的角色与表一致,但并非真实存在的表,他是对应一个SELECT语句查询出来的
--结果集。使用视图的主要目的:
--1.重用子查询,简化SQL复杂度
--2.限制数据访问
CREATE VIEW v_emp_lst
AS
SELECT empno,ename,sal,deptno FROM emp WHERE deptno=10
SELECT * FROM v_emp_lst
DESC v_emp_lst
--删除视图:
DROP VIEW v_emp_lst
--创建视图对应的子查询若含有函数或者表达式,那么该函数或者表达式必须给别名
CREATE VIEW v_emp_10 AS
SELECT ename,sal*12 yearsal,job,deptno
FROM emp
WHERE deptno=10
select * from v_emp_10
--修改视图就是替换视图中对应的子查询
CREATE OR REPLACE VIEW v_emp_10 AS
SELECT empno,ename,sal,job,deptno
FROM emp
WHERE deptno=10
select * from v_emp_10
--对视图进行DML操作
--对视图进行DML操作就是对视图数据来源的基础表进行的操作。
--只能对简单视图进行DML操作,复杂视图不允许DML操作,并且对简单视图进行DML操作不能违反视图数据
--来源的基础表的约束条件
INSERT INTO v_emp_10
(empno,ename,sal,job,deptno) VALUES (1001,'JACK',3000,'CLERK',10)
SELECT * FROM emp
UPDATE v_emp_10
SET sal=5000
WHERE ename = 'JACK'
DELETE FROM v_emp_10 WHERE ename='JACK'
--对视图的不当DML操作会污染基础表
--所谓污染,指的是对视图进行DML操作后,视图对基础表做相应DML操作,但是操作后视图对这些数据
--不可见
INSERT INTO v_emp_10
(empno,ename,sal,job,deptno)
VALUES
(1001,'JACK',5000,'CLERK',20)
SELECT * FROM v_emp_10
SELECT * FROM emp
UPDATE v_emp_10 SET deptno=20
--为视图添加检查选项,这样做可以避免对视图进行DML操作后对基表数据污染,因为检查选项的意义在于
--视图对进行DML操作后的数据要检查是否可见,不可见则不允许操作
CREATE OR REPLACE VIEW v_emp_10
AS
SELECT empno,ename,sal,job,deptno
FROM emp
WHERE deptno=10
WITH CHECK OPTION
---为视图添加只读选项,该视图不允许进行DML操作
CREATE OR REPLACE VIEW v_emp_10
AS
SELECT empno,ename,sal,job,deptno
FROM emp
WHERE deptno=10
WITH READ ONLY
--数据字典
--数据字典也是一堆表,这些表是有书库自行维护,作为“清单”使用,可以查看如:创建过得表、
--视图等信息
--USER_OBJECTS:记录用户的所有数据对象
SELECT object_name FROM user_objects WHERE object_type='VIEW'
AND object_name LIKE '%'
--USER_VIEWS:记录用户创建的所有视图
SELECT view_name,text
FROM user_views
--USER_TABLES:记录用户创建的所有表
SELECT * FROM user_tables
--USER_UPDATABLE_COLUMNS:
--复杂视图:
--视图对应的子查询中含有函数、表达式、分组、去重、关联查询等操作时,该视图为复杂视图
--复杂视图不允许进行DML操作。
--创建一个部门工资情况的视图,包含信息:部门编号,部门名称,平均,最高,最低工资和工资总和
CREATE VIEW v_emp_salinfo AS
SELECT d.deptno,d.dname,AVG(sal) avg_sal,MAX(sal) max_sal,MIN(sal) min_sal,
SUM(sal) sum_sal
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.deptno,d.dname
SELECT * FROM v_emp_salinfo
--查看比自己所在部门平均工资高的员工?
SELECT * FROM emp e,v_emp_salinfo v
WHERE e.deptno = v.deptno AND e.sal>v.avg_sal
--序列
--序列也是数据库对象之一,序列是用来根据指定规律生成一系列数字使用的,通常使用
--序列为表的主键字段生成值
CREATE SEQUENCE seq_emp_id
START WITH 1000 INCREMENT BY 1
--序列提供了两个伪列:
--NEXTVAL:获取序列下一个数字(序列最后生成的数字加步长得到)
--CURRVAL:获取序列最后生成的数字
--需要注意,新创建的序列至少使用NEXTVAL生成一个数字以后才可以使用CURRVAL
--NEXTVAL回导致序列发生步进,且序列是不能回退的,不受事务影响
SELECT seq_emp_id.NEXTVAL FROM dual;
SELECT seq_emp_id.CURRVAL FROM dual
INSERT INTO emp
(empno,ename,sal,job,deptno)
VALUES
(seq_emp_id.NEXTVAL,'kuangshuo',3000,'CLERK',20)
SELECT * FROM emp
--删除序列
DROP SEQUENCE seq_emp_id
--索引
--索引是数据库对象之一,索引的意义在于加快查询效率
--索引的创建于使用是数据库自行完成的,我们的操作在于是否对表创建索引
CREATE INDEX idx_emp_ename ON emp(ename);
SELECT * FROM emp ORDER BY ename
--经常出现在WHERE中,ORDER BY中或DISTITNCT中的字段可以创建索引,需要注意的是,对于字符
--串类型字段,在WHERE中若是LIKE判断是不会使用到索引的
--复合索引也叫多列索引,是基于多个列的索引
CREATE INDEX idex_emp_job_sal ON emp(job,sal)
SELECT empno,ename,sal,job,FROM emp ORDER BY job,sal
--基于函数的索引
CREATE INDEX emp_ename_upper_idx ON emp(UPPER(ename))
SELECT * FROM emp WHERE UPPER(ename)='KING'
--重建索引
ALTER INDEX idx_emp_ename REBUILD
--当一个表上有不合理的索引,会导致操作性能下降,删除索引的语法;
DROP INDEX index_name
--删除索引
DROP INDEX idx_emp_ename
--约束
--非空约束
CREATE TABLE employees(eid NUMBER(6),name VARCHAR2(30) NOT NULL,
salary NUMBER(7,2),hiredate DATE CONSTRAINT employees_hiredate_nn NOT NULL)
desc employees
ALTER TABLE employees MODIFY(eid NUMBER(6) NOT NULL)
--唯一性约束
--当表中某个字段使用了唯一性约束后,该字段的值不允许有重复的,NULL除外
DROP TABLE employees ; --将表删掉重新创建
CREATE TABLE employees (
eid NUMBER(6) UNIQUE,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7, 2),
hiredate DATE,
CONSTRAINT employees_email_uk UNIQUE(email)
);
--在表创建之后增加唯一性约束条件
ALTER TABLE employees ADD CONSTRAINT employees_name_uk UNIQUE(name)
--在建表时添加主键约束条件
CREATE TABLE employees1(
eid NUMBER(6) PRIMARY KEY,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7,2),
hiredate DATE
)
DESC employees1
INSERT INTO employees1 (eid,name) VALUES (NULL,'JACK')
--检查约束
ALTER TABLE employees1 ADD CONSTRAINT employees1_salary_check CHECK (salary>2000)
INSERT INTO employees1(eid,name,salary) VALUES (123856,'JACK',1000)
--视图是数据库对象之一
--视图在SQL语句中体现的角色与表一致,但并非真实存在的表,他是对应一个SELECT语句查询出来的
--结果集。使用视图的主要目的:
--1.重用子查询,简化SQL复杂度
--2.限制数据访问
CREATE VIEW v_emp_lst
AS
SELECT empno,ename,sal,deptno FROM emp WHERE deptno=10
SELECT * FROM v_emp_lst
DESC v_emp_lst
--删除视图:
DROP VIEW v_emp_lst
--创建视图对应的子查询若含有函数或者表达式,那么该函数或者表达式必须给别名
CREATE VIEW v_emp_10 AS
SELECT ename,sal*12 yearsal,job,deptno
FROM emp
WHERE deptno=10
select * from v_emp_10
--修改视图就是替换视图中对应的子查询
CREATE OR REPLACE VIEW v_emp_10 AS
SELECT empno,ename,sal,job,deptno
FROM emp
WHERE deptno=10
select * from v_emp_10
--对视图进行DML操作
--对视图进行DML操作就是对视图数据来源的基础表进行的操作。
--只能对简单视图进行DML操作,复杂视图不允许DML操作,并且对简单视图进行DML操作不能违反视图数据
--来源的基础表的约束条件
INSERT INTO v_emp_10
(empno,ename,sal,job,deptno) VALUES (1001,'JACK',3000,'CLERK',10)
SELECT * FROM emp
UPDATE v_emp_10
SET sal=5000
WHERE ename = 'JACK'
DELETE FROM v_emp_10 WHERE ename='JACK'
--对视图的不当DML操作会污染基础表
--所谓污染,指的是对视图进行DML操作后,视图对基础表做相应DML操作,但是操作后视图对这些数据
--不可见
INSERT INTO v_emp_10
(empno,ename,sal,job,deptno)
VALUES
(1001,'JACK',5000,'CLERK',20)
SELECT * FROM v_emp_10
SELECT * FROM emp
UPDATE v_emp_10 SET deptno=20
--为视图添加检查选项,这样做可以避免对视图进行DML操作后对基表数据污染,因为检查选项的意义在于
--视图对进行DML操作后的数据要检查是否可见,不可见则不允许操作
CREATE OR REPLACE VIEW v_emp_10
AS
SELECT empno,ename,sal,job,deptno
FROM emp
WHERE deptno=10
WITH CHECK OPTION
---为视图添加只读选项,该视图不允许进行DML操作
CREATE OR REPLACE VIEW v_emp_10
AS
SELECT empno,ename,sal,job,deptno
FROM emp
WHERE deptno=10
WITH READ ONLY
--数据字典
--数据字典也是一堆表,这些表是有书库自行维护,作为“清单”使用,可以查看如:创建过得表、
--视图等信息
--USER_OBJECTS:记录用户的所有数据对象
SELECT object_name FROM user_objects WHERE object_type='VIEW'
AND object_name LIKE '%'
--USER_VIEWS:记录用户创建的所有视图
SELECT view_name,text
FROM user_views
--USER_TABLES:记录用户创建的所有表
SELECT * FROM user_tables
--USER_UPDATABLE_COLUMNS:
--复杂视图:
--视图对应的子查询中含有函数、表达式、分组、去重、关联查询等操作时,该视图为复杂视图
--复杂视图不允许进行DML操作。
--创建一个部门工资情况的视图,包含信息:部门编号,部门名称,平均,最高,最低工资和工资总和
CREATE VIEW v_emp_salinfo AS
SELECT d.deptno,d.dname,AVG(sal) avg_sal,MAX(sal) max_sal,MIN(sal) min_sal,
SUM(sal) sum_sal
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.deptno,d.dname
SELECT * FROM v_emp_salinfo
--查看比自己所在部门平均工资高的员工?
SELECT * FROM emp e,v_emp_salinfo v
WHERE e.deptno = v.deptno AND e.sal>v.avg_sal
--序列
--序列也是数据库对象之一,序列是用来根据指定规律生成一系列数字使用的,通常使用
--序列为表的主键字段生成值
CREATE SEQUENCE seq_emp_id
START WITH 1000 INCREMENT BY 1
--序列提供了两个伪列:
--NEXTVAL:获取序列下一个数字(序列最后生成的数字加步长得到)
--CURRVAL:获取序列最后生成的数字
--需要注意,新创建的序列至少使用NEXTVAL生成一个数字以后才可以使用CURRVAL
--NEXTVAL回导致序列发生步进,且序列是不能回退的,不受事务影响
SELECT seq_emp_id.NEXTVAL FROM dual;
SELECT seq_emp_id.CURRVAL FROM dual
INSERT INTO emp
(empno,ename,sal,job,deptno)
VALUES
(seq_emp_id.NEXTVAL,'kuangshuo',3000,'CLERK',20)
SELECT * FROM emp
--删除序列
DROP SEQUENCE seq_emp_id
--索引
--索引是数据库对象之一,索引的意义在于加快查询效率
--索引的创建于使用是数据库自行完成的,我们的操作在于是否对表创建索引
CREATE INDEX idx_emp_ename ON emp(ename);
SELECT * FROM emp ORDER BY ename
--经常出现在WHERE中,ORDER BY中或DISTITNCT中的字段可以创建索引,需要注意的是,对于字符
--串类型字段,在WHERE中若是LIKE判断是不会使用到索引的
--复合索引也叫多列索引,是基于多个列的索引
CREATE INDEX idex_emp_job_sal ON emp(job,sal)
SELECT empno,ename,sal,job,FROM emp ORDER BY job,sal
--基于函数的索引
CREATE INDEX emp_ename_upper_idx ON emp(UPPER(ename))
SELECT * FROM emp WHERE UPPER(ename)='KING'
--重建索引
ALTER INDEX idx_emp_ename REBUILD
--当一个表上有不合理的索引,会导致操作性能下降,删除索引的语法;
DROP INDEX index_name
--删除索引
DROP INDEX idx_emp_ename
--约束
--非空约束
CREATE TABLE employees(eid NUMBER(6),name VARCHAR2(30) NOT NULL,
salary NUMBER(7,2),hiredate DATE CONSTRAINT employees_hiredate_nn NOT NULL)
desc employees
ALTER TABLE employees MODIFY(eid NUMBER(6) NOT NULL)
--唯一性约束
--当表中某个字段使用了唯一性约束后,该字段的值不允许有重复的,NULL除外
DROP TABLE employees ; --将表删掉重新创建
CREATE TABLE employees (
eid NUMBER(6) UNIQUE,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7, 2),
hiredate DATE,
CONSTRAINT employees_email_uk UNIQUE(email)
);
--在表创建之后增加唯一性约束条件
ALTER TABLE employees ADD CONSTRAINT employees_name_uk UNIQUE(name)
--在建表时添加主键约束条件
CREATE TABLE employees1(
eid NUMBER(6) PRIMARY KEY,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7,2),
hiredate DATE
)
DESC employees1
INSERT INTO employees1 (eid,name) VALUES (NULL,'JACK')
--检查约束
ALTER TABLE employees1 ADD CONSTRAINT employees1_salary_check CHECK (salary>2000)
INSERT INTO employees1(eid,name,salary) VALUES (123856,'JACK',1000)
阅读全文
0 0
- 常用数据库知识(五)
- 常用数据库知识(一)
- 常用数据库知识(二)
- 常用数据库知识(四)
- 常用的数据库知识(三)
- 数据库常用知识补充
- 数据库常用知识总结
- 数据库的一些常用知识
- 数据库的一些常用知识
- ORACLE数据库 DBA常用知识
- oracl数据库的常用知识
- postgresql数据库常用知识总结
- oracle数据库常用知识1
- 五大数据库常用SQL比较(五)
- 常用内存数据库介绍(五)
- java知识回顾(五)
- oracle实用知识(五)
- SQL Server 数据库开发常用知识
- Java虚拟机(四)垃圾收集算法
- TEST
- Application中的OnCreate方法执行两次
- 网络技术开发——新闻客户端
- nitification 使用
- 常用数据库知识(五)
- Android-MPAndroidChart使用总结
- FluentValidation使用案例
- JavaScript处理ajax时net::ERR_CONNECTION_REFUSED
- 进入MySQL数据库的方法
- 原生HTML5自定义事件
- PHP经典算法题
- java中匿名对象&final
- Kotlin学习资料收集