oracle笔记2

来源:互联网 发布:现在做淘宝客怎么样 编辑:程序博客网 时间:2024/05/25 05:35

表连接(关联查寻)

 

如果多表查询时不加where子句,也就是过滤条件或者是使用了无效的条件,就会产生两表之间记录的相互逐条匹配(组合),产生很多无效的结果(笛卡尔积)。

 

注意:在使用表连接时,要注意查询的表间的关系信息,表之间的字段所表示的信息的关系

 

等值连接

 

  select [表别名1.字段名1][表别名2.字段名2],...

  from 1 表别名1 ,表2 表别名2

  where 表别名1.字段名3=表别名2.字段名4;

  表连接时,当表与表之间有同名字段时,可以加上表名或表的别名,加以区分,使用时要用

表名.字段名或表别名.字段名(列名)。当表的字段名是唯一时,可以不用加上表名或表的别名。

 

注意:当为表起了别名,就不能再使用表名.字段名。

 

例:select a.first_name,a.last_name,b.name from s_emp a,s_dept b where a.dept_id=b.id;

 

非等值连接

 

  select [表别名1.字段名1][表别名2.字段名2],...

  from 1 表别名1 ,表2 表别名2

  where 表别名1.字段名3 ..... 表别名2.字段名4

 

  ....可以使比较运算符,也可以使其他的除了'='的运算符

 

例:select e.ename, d.grade,e.sal from emp e,salgrade d where e.sal between d.losal and d.hisal;

 

自连接 用别名把一张表中的数据分成两部分,然后在使用条件过滤。

 select [表别名1.字段名1][表别名2.字段名2],...

  from 1 表别名1 ,表1 表别名2

  where 表别名1.字段名3=表别名2.字段名4;

 

例:select a.first_name ename,b.first_name cname from s_emp a,s_emp b where a.manager_id=b.id;

 

以上所提到的表连接,都叫做内连接,严格匹配两表的记录。

 

外连接 会使用一方表中的所有记录去和另一格表中的记录按条件匹配,空值也会匹配,这个表中的所有记录都会显示,数据库会模拟出记录去和那些不匹配的记录匹配。

 

例:select a.first_name enamei,a.id,b.first_name cname,b.id from s_emp a,s_emp b where a.manager_id=b.id(+);

 

注意:要把那一方的记录全部都显示出来,还有注意条件(+)跟在要全部显示的那个表的字段后。

 

组函数

 

group

group by 分组子句,按指定的分组规则分组 ,这个group by 子句可以跟在 select 语句后或是 having后面。group by子句也会出发排序操作,会按分组字段排序。

 

select [组函数或分组的字段名] ... from 表名 group by [字段名1],[字段名2],.....

 

例:select avg(salary) from s_emp group by dept_id;

 

注意:组函数可以处理一组数据,返回一个值。组函数会忽略空值。count()除外,他会把空记录也记录在内。

 

avg(..),求平均值,sum(..),求和 这两个函数的参数只能是number型的。

 

以下所提到的函数可以使用任意类型做参数。

count(..),用来统计记录数,可以使用排重命令。count(...)默认使用的是all

max(..),min(..)求最大值和最小值,

count(*),统计表中记录数。

 

例:select max(b.name),avg(a.salary), max(c.name) from s_emp a,s_dept b,s_region c where a.dept_id=b.id and b.region_id=c.id group by b.id;

 

注意:只要写了group by子句,select后就只能用group by后的字段或者是组函数。

      where子句只能够过滤记录。

 

having子句可以过滤组函数结果或是分组的信息,且写在group by子句后。

 

:

 select max(b.name),avg(a.salary), max(c.name) from s_emp a,s_dept b,s_region c where a.dept_id=b.id and b.region_id=c.id group by b.id having sum(a.salary)>4000;

 

column 也可以定义有别名的列的格式。

column "别名" 格式定义

 

注意:要先过滤掉不需要的记录,然后再进行分组操作,提高效率。

 

子查询

 

子查询,就是可以嵌在任何的sql语句中的select语句。

 

select语句中嵌套子查询时,会先执行子查询。一般的会将子查询放在运算符的右边。

 

注意:在使用子查询时,要注意这个运算符是单行的(也就是只能是单值),还是多行运算符(范围,多值)。配合使用子查询返回的结果必须符合运算符的用法。

 

:

select first_name,title from s_emp where title=any(select title from s_emp where last_name='Smith') and upper(last_name)!='SMITH';

 

select first_name,title from s_emp where title in (select title from s_emp where last_name='Smith') and upper(last_name)!='SMITH';

 

数据库设计

 

数据库表设计,把业务需求转换成可操作的表。

1,需求分析,了解客户的业务需求(业务技能)。

2,设计,通过ER图(实体关系图)

3,建表

4,测试

5,形成产品

 

E-R

将一类事物的共性抽象处来成为一个实体,并且表现出来实体间的关系。

 

unique identifier 唯一的值

primary with     '#*' 唯一且非空

indispensable 必要的(也就是要求必须非空)

 

实体关系

one to one 一对一关联,one to many 一对多关联,many to many 多对多关联

反射关联,自身的属性之间的关联

 

ER图转换成表

 

第一范式,所有的属性都必须是单值,也就是属性只表示单一的意义。(记录可以重复,没有任何限制)

第二范式,属性要求唯一且非空,(记录不可重复,但是数据可能会出现冗余)。

 

第三范式,非主属性只能依赖于主属性,不能依赖于其他非主属性。(解决数据冗余问题)

 

约束

 

约束是针对表中的字段进行定义的。

 

primary key (主键约束 PK)保证实体的完整性,保证记录的唯一

主键约束,唯一且非空,并且每一个表中只能有一个主键,有两个字段联合作为主键,只有两个字段放在一起唯一标识记录,叫做联合主键。

 

foreign key (外建约束 FK)保证引用的完整性,

外键约束,外键的取值是受另外一张表中的主键或唯一值得约束,不能够取其他值,只能够引用主键会唯一键的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表),要想创建子表,就要先创建父表,后创建子表,记录的插入也是如此,先父表后子表,删除记录,要先删除子表记录,后删除父表记录,要修改记录,如果要修改父表的记录要保证没有被子表引用。要删表时,要先删子表,后删除父表。

 

unuque key(唯一键),值为唯一

 

index(索引)是数据库特有的一类对象,view(示图)

典型的一对多 class 对应多个学生。

student table                      class table

 ______________________________     _________________________

| id | name | address| class_id|   | id |class_desc|class_num|

|(PK)|______|________|___(FK)__|   |(pk)|__________|_________|

|    |      |        |         |   |    |          |         |

 

 

一对一

 

student tabel             shenfenzheng table

 ____________________     _________________________________

| id | name | address|   |  s_id  |shenfen_desc|shenfen_num|

|(PK)|______|________|   |(PKFK)|____________|___________|

|    |      |        |   |        |            |           |

 

多对多

 

student tabel             zhongjian table                      kecheng table

 ____________________     _________________________________    __________________

| id | name | address|   |  s_id  |shenfen_desc|shenfen_num|  | kid | kechengname|

|(PK)|______|________|   |(FKFK)|____________|___________|  | (PK)|____________|

|    |      |        |   |联合主键|            |           |  |     |            |

 

引用对方表的主键,当作本身的主键,所以这个表的主键,既是主键又是外建

 

建表和其他相关操作

 

DDL语句

 

创建表:

   create    table  表名   (    字段名1    类型(数据长度)(default ...)   约束条件,   字段名2    类型(数据长度)    约束条件 );

 

Oracle数据库中的数据类型

 

varchar(长度),可变长字符串,char(长度) 定长

number(..,..),number 表示浮点数,或者是整数

long 大对象,clog 字符的大对象,相当于文本文件在表中只存放一个相当于只针对值

             blog 二进制的大对象,也是以相当于指针的形式存放的。

primary key约束:

主键约束的定义:

第一种定义形式:

create table   test(c  number  primary key  );     列级约束

第二种定义形式:

create table  test(c  number , primary key(c) )  ; 表级约束

create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1

create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表级约束可以实现联合主键

 

foregin  key   (fk)   外键约束:

(先定义父表,再定义子表)

carete   table     parent(c1 number  primary key );

create   table    child  (c  number primary key ,   c2 number  references parent(c1));

或表级约束定义:

create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));