SQL-Oracle08sql视图
2014-01-05 14:34
183 查看
1、表的建立:CREATE TABLE 表名称
Oracle中主要数据类型:
VARCHAR2(长度) :表示一个字符串,有长度限制
NUMBER() :表示数字,可以表示整数或小数
DATE():表示日期格式,按照指定格式编写
CLOB():存储大文本对象,海量文字
BLOB():存储二进制数据,例如:电影、图片、音乐等等。(最大4GB)
2、复制表:CREATE TABLE 表名称 AS 子查询
3、一般表建立之后不要修改,如果非要修改使用ALTER TABLE指令。
ALTER TABLE :
增加列:ALTER TABLE 表名称 ADD(字段名称 字段类型 DEFAULT 默认值)
修改列:ALTER TABLE 表名称 MODIFY(字段名称 字段类型 DEFAULT 默认值)
4、约束:
约束可以保证数据库表中的数据完整性。
5、在SQL中约束一共分为以下五种:
单表约束:
PRIMARY KEY : 一个实体表一般都要去建立一个主键,表示唯一的编号
NOT NULL : 一个列的内容不允许插入空值
UNIQUE : 表示唯一的内容不允许重复
CHECK : 表示此列的内容设置的时候要有限制
关联表上的约束:
FOREIGN KEY : 表示子表的取值与父表中的取值有所关联
删除时应该先删除子表再删除父类
如果现在要想直接删除父类,可以采用Oracle的强制手段:
DROP TABLE 表名称 CASCADE CONSTRAINT ;
级联删除: ON DELETE CASCADE,当父表中的内容被删除掉之后,子表的
对应内容页被删除掉。
约束本身也是可以修改的,但是不建议修改约束
增加约束:ALTER TABLE ADD CONSTRAINT 约束名称 约束类型(约束字段)
删除约束:ALTER TABLE DROP CONSTRAINT 约束名称
如果在建立约束的时候没有给定约束名称,系统会为其自动分配一个约束的名称,
但名称在删除的时候就比较麻烦,所以建立表的时候可以采用CONSTRAINT语句,指定
约束的名字。
6、ROWNUM伪列:所有的记录中都存在此列,用于表示行的编号,在实际中可以通过此列并
结合子查询完成表中的部分数据显示。
7、集合操作:并、交、差
-------------------
===================
视图:保证OracleService和OracleOraDb10g_home1TNSListener两个服务开启。
视图的功能:一个视图实际上就是封装了一条复杂的查询语句。
创建视图的语法:
CREATE VIEW 视图名称 AS 子查询
实际上此时的子查询就表示一条非常复杂的语句。
eg:建立一个视图,此视图包含了全部的20部门的雇员信息(雇员编号,姓名,工作,雇佣日期)
SQL> SET linesize 300 ;
SQL> SET pagesize 30 ;
CREATE VIEW empv20 AS SELECT empno,ename,job,hiredate FROM emp WHERE deptno=20 ;
可以对视图进行查询
SELECT * FROM empv20 ;
此时,是通过视图找到了20部门中的所有数据,
可以使用视图包装需要的查询语句。
此时,此视图中只包含了四个字段的信息,如果现在希望多包含一个字段:
会提示此名称已存在,证明视图是无法重命名的,那么此时只能先删除之后再
重新建立视图。
删除视图的语法:
DROP VIEW 视图名称 ;
eg:删除empv20 ;
删除之后重新执行创建视图的语句
CREATE OR REPLACE 视图名称 AS 子查询;
使用以上语法,在更改视图时就不用先删除再执行了,系统会为用户自动进行删除及
重建的功能。
CREATE OR REPLACE VIEW empv20
AS
SELECT empno,ename,job,sal,hiredate FROM emp
WHERE deptno=20;
视图可封装复杂的查询,那么下面封装一个之前已经存在的一个复杂查询。
次查询返回部门名称,部门的人数平均工资以及最低工资的雇员姓名。
SELECT d.dname,ed.c,ed.a,e.ename
FROM dept d,(
SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min
FROM emp
GROUP BY deptno) ed,emp e
WHERE d.deptno=ed.deptno AND e.sal=ed.min ;
如果在开发中每次都写如此之长的SQL语句,则肯定很不方便,所以此时就应该将其
建立成视图,以方便用户查询操作。
eg:
CREATE OR REPLACE VIEW myemp AS
SELECT d.dname,ed.c,ed.a,e.ename
FROM dept d,(
SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min
FROM emp
GROUP BY deptno) ed,emp e
WHERE d.deptno=ed.deptno AND e.sal=ed.min ;
以后直接查询视图,就可以得到之前的查询结果
SELECT * FROM myemp ;
eg:创建一个只包含20部门的雇员的视图
CREATE OR REPLACE VIEW empv20 AS
SELECT * FROM emp WHERE deptno=20 ;
下面进行更新视图的操作,在视图中是不应该包含真实数据的,而且在此程序中,创建
的视图实际上是存在创建条件的,此条件是deptno=20。
如果现在将视图中的部门编号为7369改为30
UPDATE empv20 SET deptno=30 WHERE empno=7369 ;
此时,已经提示视图正常的进行了更新,重新查询视图之后,会发现在视图中
已经没有了7369这个雇员了。那么emp表中呢?
此时emp表中的7369雇员的部门编号已经修改为30了,这样做明显不合适,因为
创建视图的时候是有条件的,你一旦修改之后,则此条件就破坏了,
所以在创建视图的时候SQL中提供了两个重要的参数:
WITH CHECK OPTION : 不能更新视图的创建条件
eg:在视图创建中使用此参数
CREATE OR DEPLACE VIEW empv20
AS
SELECT * FROM emp WHERE deptno=20
WIDTH CHECK OPTION ;
此时,再对现在的视图进行更新操作,
UPDATE empv20 SET deptno=30 WHERE empno=7369 ;
ORA-01402:视图WIDTH CHECK OPTION where 子句违规
创建条件不能更新,那么其他字段呢,例如:现在将7469的雇员姓名修改为“呵呵”
eg:修改视图中7369的雇员编号
UPDATE empv20 SET ename='hehe' WHERE empno=7369 ;
但是,视图的本身作用还是用来查询的,所以不应该允许更改,所以此时可以使用
第二个参数:
WITH READ ONLY : 创建的视图只读
eg:创建只读视图
CREATE OR REPLACE VIEW empv20
AS
SELECT * FROM emp WHERE deptno=20
WITH READ ONLY ;
再次执行更新操作,更新雇员姓名:
UPDATE empv20 SET ename='史密斯' WHERE empno=7369 ;
ORA-01733:此处不允许虚拟列
此时,提示,视图无法更改,是只读的操作。
Oracle中主要数据类型:
VARCHAR2(长度) :表示一个字符串,有长度限制
NUMBER() :表示数字,可以表示整数或小数
DATE():表示日期格式,按照指定格式编写
CLOB():存储大文本对象,海量文字
BLOB():存储二进制数据,例如:电影、图片、音乐等等。(最大4GB)
2、复制表:CREATE TABLE 表名称 AS 子查询
3、一般表建立之后不要修改,如果非要修改使用ALTER TABLE指令。
ALTER TABLE :
增加列:ALTER TABLE 表名称 ADD(字段名称 字段类型 DEFAULT 默认值)
修改列:ALTER TABLE 表名称 MODIFY(字段名称 字段类型 DEFAULT 默认值)
4、约束:
约束可以保证数据库表中的数据完整性。
5、在SQL中约束一共分为以下五种:
单表约束:
PRIMARY KEY : 一个实体表一般都要去建立一个主键,表示唯一的编号
NOT NULL : 一个列的内容不允许插入空值
UNIQUE : 表示唯一的内容不允许重复
CHECK : 表示此列的内容设置的时候要有限制
关联表上的约束:
FOREIGN KEY : 表示子表的取值与父表中的取值有所关联
删除时应该先删除子表再删除父类
如果现在要想直接删除父类,可以采用Oracle的强制手段:
DROP TABLE 表名称 CASCADE CONSTRAINT ;
级联删除: ON DELETE CASCADE,当父表中的内容被删除掉之后,子表的
对应内容页被删除掉。
约束本身也是可以修改的,但是不建议修改约束
增加约束:ALTER TABLE ADD CONSTRAINT 约束名称 约束类型(约束字段)
删除约束:ALTER TABLE DROP CONSTRAINT 约束名称
如果在建立约束的时候没有给定约束名称,系统会为其自动分配一个约束的名称,
但名称在删除的时候就比较麻烦,所以建立表的时候可以采用CONSTRAINT语句,指定
约束的名字。
6、ROWNUM伪列:所有的记录中都存在此列,用于表示行的编号,在实际中可以通过此列并
结合子查询完成表中的部分数据显示。
7、集合操作:并、交、差
-------------------
===================
视图:保证OracleService和OracleOraDb10g_home1TNSListener两个服务开启。
视图的功能:一个视图实际上就是封装了一条复杂的查询语句。
创建视图的语法:
CREATE VIEW 视图名称 AS 子查询
实际上此时的子查询就表示一条非常复杂的语句。
eg:建立一个视图,此视图包含了全部的20部门的雇员信息(雇员编号,姓名,工作,雇佣日期)
SQL> SET linesize 300 ;
SQL> SET pagesize 30 ;
CREATE VIEW empv20 AS SELECT empno,ename,job,hiredate FROM emp WHERE deptno=20 ;
可以对视图进行查询
SELECT * FROM empv20 ;
此时,是通过视图找到了20部门中的所有数据,
可以使用视图包装需要的查询语句。
此时,此视图中只包含了四个字段的信息,如果现在希望多包含一个字段:
会提示此名称已存在,证明视图是无法重命名的,那么此时只能先删除之后再
重新建立视图。
删除视图的语法:
DROP VIEW 视图名称 ;
eg:删除empv20 ;
删除之后重新执行创建视图的语句
CREATE OR REPLACE 视图名称 AS 子查询;
使用以上语法,在更改视图时就不用先删除再执行了,系统会为用户自动进行删除及
重建的功能。
CREATE OR REPLACE VIEW empv20
AS
SELECT empno,ename,job,sal,hiredate FROM emp
WHERE deptno=20;
视图可封装复杂的查询,那么下面封装一个之前已经存在的一个复杂查询。
次查询返回部门名称,部门的人数平均工资以及最低工资的雇员姓名。
SELECT d.dname,ed.c,ed.a,e.ename
FROM dept d,(
SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min
FROM emp
GROUP BY deptno) ed,emp e
WHERE d.deptno=ed.deptno AND e.sal=ed.min ;
如果在开发中每次都写如此之长的SQL语句,则肯定很不方便,所以此时就应该将其
建立成视图,以方便用户查询操作。
eg:
CREATE OR REPLACE VIEW myemp AS
SELECT d.dname,ed.c,ed.a,e.ename
FROM dept d,(
SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min
FROM emp
GROUP BY deptno) ed,emp e
WHERE d.deptno=ed.deptno AND e.sal=ed.min ;
以后直接查询视图,就可以得到之前的查询结果
SELECT * FROM myemp ;
eg:创建一个只包含20部门的雇员的视图
CREATE OR REPLACE VIEW empv20 AS
SELECT * FROM emp WHERE deptno=20 ;
下面进行更新视图的操作,在视图中是不应该包含真实数据的,而且在此程序中,创建
的视图实际上是存在创建条件的,此条件是deptno=20。
如果现在将视图中的部门编号为7369改为30
UPDATE empv20 SET deptno=30 WHERE empno=7369 ;
此时,已经提示视图正常的进行了更新,重新查询视图之后,会发现在视图中
已经没有了7369这个雇员了。那么emp表中呢?
此时emp表中的7369雇员的部门编号已经修改为30了,这样做明显不合适,因为
创建视图的时候是有条件的,你一旦修改之后,则此条件就破坏了,
所以在创建视图的时候SQL中提供了两个重要的参数:
WITH CHECK OPTION : 不能更新视图的创建条件
eg:在视图创建中使用此参数
CREATE OR DEPLACE VIEW empv20
AS
SELECT * FROM emp WHERE deptno=20
WIDTH CHECK OPTION ;
此时,再对现在的视图进行更新操作,
UPDATE empv20 SET deptno=30 WHERE empno=7369 ;
ORA-01402:视图WIDTH CHECK OPTION where 子句违规
创建条件不能更新,那么其他字段呢,例如:现在将7469的雇员姓名修改为“呵呵”
eg:修改视图中7369的雇员编号
UPDATE empv20 SET ename='hehe' WHERE empno=7369 ;
但是,视图的本身作用还是用来查询的,所以不应该允许更改,所以此时可以使用
第二个参数:
WITH READ ONLY : 创建的视图只读
eg:创建只读视图
CREATE OR REPLACE VIEW empv20
AS
SELECT * FROM emp WHERE deptno=20
WITH READ ONLY ;
再次执行更新操作,更新雇员姓名:
UPDATE empv20 SET ename='史密斯' WHERE empno=7369 ;
ORA-01733:此处不允许虚拟列
此时,提示,视图无法更改,是只读的操作。
相关文章推荐
- 精妙SQL语句(转帖)
- SQL语句实现分割字符串
- Oracle SQL语句查询例子
- 常用sql语句
- Sql Server2005 Transact-SQL 新兵器学习总结之-排名函数 转
- 给数据库字段添加注释,并且可以通过sql语句查询
- SQL、Linux 脚本与 Ruby 之比较
- [zz]十种开源的sql客户端
- SQL 基础--> 子查询
- 安装vs2010后 向sql2008添加SQL Server Management Studio图形化管理工具
- 关于sql管理二三事
- 数据库常用sql
- SQLite的SQL语法
- 数据开发-经典sql语句
- MyBatis学习 之 二、SQL语句映射文件(1)resultMap
- Sql语句中的 select @@identity 转载自@为了马自达6而努力
- 'SQLOLEDB' 报错
- 每日学习总结:DataTable中去除重复的项、SQL中的各种Join连接讲解
- 使用MySQL中的EXPLAIN解释命令来检查SQL
- 用SQL语句更改数据库名,表名,列名