当前位置: 数据库>其它
本页文章导读:
▪通过Mysql语句得到mysql安装路径 通过Mysql语句得到mysql安装路径:
select @@basedir as basePath from dual
作者:tbkken 发表于2013-2-26 13:56:58 原文链接
阅读:0 评论:0 查看评论
......
▪Normal Form Normal Form是我们在设计数据库结构过程中所要遵循的规则和指导方法
◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。简而言之,第一范式就是无重复的列。
.........
▪视图 一、什么是视图:
在ORACLE中,称视图为逻辑表。逻辑二字还是说明了视图不是真正的表。因为视图内根本就没有数据。视图的全部家当,也就是你创建视图时的SELECT语句。
二、创建视.........
[1]通过Mysql语句得到mysql安装路径
来源: 互联网 发布时间: 2013-11-07
通过Mysql语句得到mysql安装路径:
select @@basedir as basePath from dual
select @@basedir as basePath from dual
作者:tbkken 发表于2013-2-26 13:56:58 原文链接
阅读:0 评论:0 查看评论
[2]Normal Form
来源: 互联网 发布时间: 2013-11-07
Normal Form是我们在设计数据库结构过程中所要遵循的规则和指导方法
◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。简而言之,第一范式就是无重复的列。
◆ 第二范式(2NF):首先要满足它是1NF,另外还需要包含两部分内容:一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。简而言之,第二范式就是非主属性非部分依赖于主关键字。
◆ 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
优点:范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦。
缺点:按照范式的规范设计出来的表,等级越高的范式设计出来的表越多。表的数量越多,查询的时间要高很多。也就是说我们所用的范式越高,对数据操作的性能越低。
所以我们在利用范式设计表的时候,要根据具体的需求再去权衡是否使用更高范式去设计表。
在一般的项目中,我们用的最多也就是第三范式,第三范式也就可以满足我们的项目需求,性能好而且方便管理数据;
当数据量巨大时候我们就要考虑使用“反范式”,也就是添加数据冗余,使查询减少或者避免表之间的关联
作者:LZL102801 发表于2013-2-26 14:08:14 原文链接
阅读:43 评论:0 查看评论
[3]视图
来源: 互联网 发布时间: 2013-11-07
一、什么是视图:
在ORACLE中,称视图为逻辑表。逻辑二字还是说明了视图不是真正的表。因为视图内根本就没有数据。视图的全部家当,也就是你创建视图时的SELECT语句。
二、创建视图:
1、创建视图的主法是:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
2、例如,如下语句就创建了一个视图:
hr@OCM> CREATE VIEW empvu30
2 AS SELECT employee_id, last_name, salary
3 FROM employees
4 WHERE department_id = 30;
View created.
视图的名字是empvu30。那它有什么用呢?很简单,如果以后你再想查看department_id(部门编号)为30的雇员信息,不必再使用“ SELECT employee_id, last_name, salary FROM employees WHERE department_id = 30 ”,直接SELECT 视图即可:
hr@OCM> select * from empvu30;
EMPLOYEE_ID LAST_NAME SALARY
----------- ------------------------- ----------
145 Russell 14000
146 Partners 13500
147 Errazuriz 12000
148 Cambrault 11000
149 Zlotkey 10500
150 Tucker 10000
这样比你每次输入department_id = 30简单一些。我们可以将常用的比较复杂的查询操作像上面这样,建立为视图。这样每次查询视图就可看到结果,比输入复杂查询语句更省事。
3、创建视图命令中的[OR REPLACE]的意义,REPLACE有替换的意思。它的主要作用是修改视图的定义,也就是修改视图内的SQL语句。比如说上面的empvu30,我想为empvu30中增加一个列first_name,命令如下:
hr@OCM> CREATE OR REPLACE VIEW empvu30
2 AS SELECT employee_id, first_name,last_name, salary
3 FROM employees
4 WHERE department_id = 30;
View created.
4、在创建视图时,对这种使用各种函数,或运算表达式的列,一定要起别名,如没有别名视图创建就会失败,例如:
hr@OCM> CREATE OR REPLACE VIEW empvu30
2 AS SELECT department_id,count(*)
3 FROM employees
4 GROUP BY department_id;
AS SELECT department_id,count(*)
*
ERROR at line 2:
ORA-00998: must name this expression with a column alias
根据Oracle的报错,给count(*)取个别名为count,例如:
hr@OCM> CREATE OR REPLACE VIEW empvu30
2 AS SELECT department_id,count(*) count
3 FROM employees
4 GROUP BY department_id;
View created.
用desc查看视图empvu30的结构
hr@OCM> desc empvu30
Name Null? Type
-----------------------------
DEPARTMENT_ID NUMBER(4) COUNT NUMBER 如果你没有指定别名的话,ORACLE将无法确定在视图中,它的列名是什么。因此,在创建视图时,对于这种复杂的表达式,一定要为它起别名。
5、当使用SELECT查询一个视图时,和查询表是一某一样的,我们就可以把视图当表一样去查询。SELECT语句中,所有适用于表特性,都同样适用性视图。比如我们可以增长条件:
hr@OCM> select * from empvu30 where department_id=30;
DEPARTMENT_ID COUNT
------------- ----------
30 6
显示empvu30视图中,部门编号(department_id)等于30的行。在使用这个命令时,我们完全可以把empvu30当作一个表,它有1行,两列,列名分别是DEPARTMENT_ID和COUNT。视图数据的来源,被称为视图的“基表”。视图的基表可以有多个。如果我根据连接命令创建一个视图,那么这个视图中的数据可能来自于多个表,这样它就有了多个基表。
基表中的数据变化时,视图也会跟着发生变化。例如,在EMPLOYEES表中我再向插入一行部门编号(department_id)等于30的部门新员工:
hr@OCM> insert into employees values(888,'Joe','guo','Joe@oracle.com',1388888888,sysdate,'AD_PRES',50000,null,200,30);
1 row created.
hr@OCM> commit;
Commit complete.
加了一行后,下面我再显示一下视图:
hr@OCM> select * from empvu30 where department_id=30;
DEPARTMENT_ID COUNT
------------- ----------
30 7
部门号为30号的现在有7个人了。也就是说,基表发生了什么变化,不需要任何操作,视图马上就可以反应出来。
这就是视图,我们先不深入的讨论它,仅从外观看,是看不出它和表有什么区别的。在SELECT时,你根据看不出来你SELECT的是一个表,还是一个视图。其实很多时候,我们都在SELECT视图,但是我们都以为在SELECT表。
我们还可以以视图为基表,再创建视图,比如上面的例子,我想把显示结果中的部门号和人数和DEPARTMETS表等值连接起来显示部门名称:
hr@OCM> select a.DEPARTMENT_ID,DEPARTMENT_NAME,COUNT from empvu30 a,departments b where a.DEPARTMENT_ID=b.DEPARTMENT_ID and a.department_id=30;
DEPARTMENT_ID DEPARTMENT_NAME COUNT
------------- ------------------------------ ----------
30 Purchasing 7
连接的命令还是稍有点长的,下面我根据此命令,再创建一个视图:
hr@OCM> CREATE OR REPLACE VIEW v_emp30 as
2 select a.DEPARTMENT_ID,DEPARTMENT_NAME,COUNT
3 from empvu30 a,departments b
4 where a.DEPARTMENT_ID=b.DEPARTMENT_ID and a.department_id=30;
View created.
视图的名字是v_emp30,名字是根据需要随变定的,如果觉得我这个复杂,可以换成简单的,主要是我想当我看到这个名字时,就能知道这个视图涉及两个表EMPLOYEES和DEPARTMETNS。
好了,下面我们显示一下这个视图,它的输出结果,将和上面的那条连接SELECT语句一样:
hr@OCM> SELECT * FROM v_emp30;
DEPARTMENT_ID DEPARTMENT_NAME COUNT
------------- ------------------------------ ----------
30 Purchasing 7
这样,以后我想查看30号部门的总人数。直接查看这个视图就行了。
这个视图的基表有DEPARTMETNS表和empvu30视图,而empvu30的基表是EMPLOYEES表。也就是说一个视图可以作为其它视图的基表。再强调一下,在进行SELECT操作时,我们可以把视图当作表一样去用,我们干脆暂时称视图为视图表。我们可以认为视图表的数据,来自于基表。那么,既然视图是表了,我基于这个表再创建其它视图当然是没有问题的。
在ORACLE中,称视图为逻辑表。逻辑二字还是说明了视图不是真正的表。因为视图内根本就没有数据。视图的全部家当,也就是你创建视图时的SELECT语句。
二、创建视图:
1、创建视图的主法是:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
2、例如,如下语句就创建了一个视图:
hr@OCM> CREATE VIEW empvu30
2 AS SELECT employee_id, last_name, salary
3 FROM employees
4 WHERE department_id = 30;
View created.
视图的名字是empvu30。那它有什么用呢?很简单,如果以后你再想查看department_id(部门编号)为30的雇员信息,不必再使用“ SELECT employee_id, last_name, salary FROM employees WHERE department_id = 30 ”,直接SELECT 视图即可:
hr@OCM> select * from empvu30;
EMPLOYEE_ID LAST_NAME SALARY
----------- ------------------------- ----------
145 Russell 14000
146 Partners 13500
147 Errazuriz 12000
148 Cambrault 11000
149 Zlotkey 10500
150 Tucker 10000
这样比你每次输入department_id = 30简单一些。我们可以将常用的比较复杂的查询操作像上面这样,建立为视图。这样每次查询视图就可看到结果,比输入复杂查询语句更省事。
3、创建视图命令中的[OR REPLACE]的意义,REPLACE有替换的意思。它的主要作用是修改视图的定义,也就是修改视图内的SQL语句。比如说上面的empvu30,我想为empvu30中增加一个列first_name,命令如下:
hr@OCM> CREATE OR REPLACE VIEW empvu30
2 AS SELECT employee_id, first_name,last_name, salary
3 FROM employees
4 WHERE department_id = 30;
View created.
4、在创建视图时,对这种使用各种函数,或运算表达式的列,一定要起别名,如没有别名视图创建就会失败,例如:
hr@OCM> CREATE OR REPLACE VIEW empvu30
2 AS SELECT department_id,count(*)
3 FROM employees
4 GROUP BY department_id;
AS SELECT department_id,count(*)
*
ERROR at line 2:
ORA-00998: must name this expression with a column alias
根据Oracle的报错,给count(*)取个别名为count,例如:
hr@OCM> CREATE OR REPLACE VIEW empvu30
2 AS SELECT department_id,count(*) count
3 FROM employees
4 GROUP BY department_id;
View created.
用desc查看视图empvu30的结构
hr@OCM> desc empvu30
Name Null? Type
-----------------------------
DEPARTMENT_ID NUMBER(4) COUNT NUMBER 如果你没有指定别名的话,ORACLE将无法确定在视图中,它的列名是什么。因此,在创建视图时,对于这种复杂的表达式,一定要为它起别名。
5、当使用SELECT查询一个视图时,和查询表是一某一样的,我们就可以把视图当表一样去查询。SELECT语句中,所有适用于表特性,都同样适用性视图。比如我们可以增长条件:
hr@OCM> select * from empvu30 where department_id=30;
DEPARTMENT_ID COUNT
------------- ----------
30 6
显示empvu30视图中,部门编号(department_id)等于30的行。在使用这个命令时,我们完全可以把empvu30当作一个表,它有1行,两列,列名分别是DEPARTMENT_ID和COUNT。视图数据的来源,被称为视图的“基表”。视图的基表可以有多个。如果我根据连接命令创建一个视图,那么这个视图中的数据可能来自于多个表,这样它就有了多个基表。
基表中的数据变化时,视图也会跟着发生变化。例如,在EMPLOYEES表中我再向插入一行部门编号(department_id)等于30的部门新员工:
hr@OCM> insert into employees values(888,'Joe','guo','Joe@oracle.com',1388888888,sysdate,'AD_PRES',50000,null,200,30);
1 row created.
hr@OCM> commit;
Commit complete.
加了一行后,下面我再显示一下视图:
hr@OCM> select * from empvu30 where department_id=30;
DEPARTMENT_ID COUNT
------------- ----------
30 7
部门号为30号的现在有7个人了。也就是说,基表发生了什么变化,不需要任何操作,视图马上就可以反应出来。
这就是视图,我们先不深入的讨论它,仅从外观看,是看不出它和表有什么区别的。在SELECT时,你根据看不出来你SELECT的是一个表,还是一个视图。其实很多时候,我们都在SELECT视图,但是我们都以为在SELECT表。
我们还可以以视图为基表,再创建视图,比如上面的例子,我想把显示结果中的部门号和人数和DEPARTMETS表等值连接起来显示部门名称:
hr@OCM> select a.DEPARTMENT_ID,DEPARTMENT_NAME,COUNT from empvu30 a,departments b where a.DEPARTMENT_ID=b.DEPARTMENT_ID and a.department_id=30;
DEPARTMENT_ID DEPARTMENT_NAME COUNT
------------- ------------------------------ ----------
30 Purchasing 7
连接的命令还是稍有点长的,下面我根据此命令,再创建一个视图:
hr@OCM> CREATE OR REPLACE VIEW v_emp30 as
2 select a.DEPARTMENT_ID,DEPARTMENT_NAME,COUNT
3 from empvu30 a,departments b
4 where a.DEPARTMENT_ID=b.DEPARTMENT_ID and a.department_id=30;
View created.
视图的名字是v_emp30,名字是根据需要随变定的,如果觉得我这个复杂,可以换成简单的,主要是我想当我看到这个名字时,就能知道这个视图涉及两个表EMPLOYEES和DEPARTMETNS。
好了,下面我们显示一下这个视图,它的输出结果,将和上面的那条连接SELECT语句一样:
hr@OCM> SELECT * FROM v_emp30;
DEPARTMENT_ID DEPARTMENT_NAME COUNT
------------- ------------------------------ ----------
30 Purchasing 7
这样,以后我想查看30号部门的总人数。直接查看这个视图就行了。
这个视图的基表有DEPARTMETNS表和empvu30视图,而empvu30的基表是EMPLOYEES表。也就是说一个视图可以作为其它视图的基表。再强调一下,在进行SELECT操作时,我们可以把视图当作表一样去用,我们干脆暂时称视图为视图表。我们可以认为视图表的数据,来自于基表。那么,既然视图是表了,我基于这个表再创建其它视图当然是没有问题的。
最新技术文章: