Oracle基础知识(2)
来源:互联网 发布:股市黑马软件下载 编辑:程序博客网 时间:2024/06/06 17:18
五、表连接(关联查询)
自连接
把一个表的两个字段关系转换成两个表字段之间的关系.
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 e.deptno,d.deptno from emp e,dept d where e.deptno(+)=d.deptno and e.deptno is null;
六、组函数
group by把 select 查询的结果集分成几个小组,这个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、max、min可以使用任意类型做参数。
④ 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之后的字段或者是组函数。having子句可以过滤组函数结果或是分组的信息,并且写在group by子句后。
七、子查询
可以嵌在sql语句中的select语句。
在select语句中嵌套子查询时,会先执行子查询,返回结果再执行主查询。一般的会将子查询放在运算符的右边。
注意:在使用子查询时,要注意这个运算符是单行的(也就是只能是单值)比如=要确认返回的是单行;还是多行运算符(范围,多值.比如in)。配合使用子查询返回的结果必须符合运算符的用法。
例:
select first_name||' '||last_name name // 用 || 表示字符串拼接
from s_emp
where title in (select title from s_emp
where dept_id=42);
查询和42部门员工职位相同的所有员工的姓名.
在select后加子查询: 谁的工资比本部门的平均工资高?
select e.first_name, e.salary, a.avgsal
from s_emp e, (select dept_id,avg(salary) avgsal
from s_emp
group by dept_id) a
where e.dept_id = a.dept_id
and e.salary > a.avgsal
八、约束
针对表中的字段进行定义的。
1、primary key(主键约束 PK)保证实体的完整性,保证记录的唯一。
主键约束,唯一且非空,并且每一个表中只能有一个主键,有两个字段联合作为主键时,将两个字段组合在一起唯一标识记录,叫做联合主键。
主键约束的定义:
第一种定义形式:
create table test(c number primary key ); 列级约束
第二种定义形式:
create table test(c number , primary key(c) ) ; 表级约束
create table test(c1 number constraints pk_c1 primary key ); 此约束有名字: pk_c1
create table test(c number , c1 number , primary key (c ,c1) ) ; 用表级约束可以实现联合主键
2、foreign key(外键约束 FK)保证引用的完整性,外键约束,外键的取值是受另外一张表中的主键或唯一值的约束,不能够取其他值,只能够引用主键或唯一键的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表),要想创建子表,就要先创建父表;记录的插入也是如此,先父表后子表;删除记录,要先删除子表记录,后删除父表记录;要修改记录,如果要修改父表的记录要保证没有被子表引用。要删表时,要先删子表,后删除父表。(可以通过使用cascade constraints 选项来删除父表)
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));
3、not null(非空约束NN)这是一个列级约束,在建表时,在数据类型的后面加上 not null ,也就是在插入时不允许插入空值。
例:create table student(id number primary key,name varchar2(32) not null,address varchar2(32));
4、unique(唯一约束UK)
唯一约束,允许为空,要求插入的记录中的值是唯一的。
例:create table student(id number,name varchar2(32),address varchar2(32),primary key (id),unique (address));
check约束
检查约束,可以按照指定条件,检查记录的插入。check中不能使用伪列,不能使用函数,不能引用其他字段。
例:create table sal (a1 number , check(a1>1000));.
九、事务 Transaction
原子操作,也就是不可分割的操作,必须一起成功一起失败。
事务的结束动作就是commit; DDL, DCL语句执行会自动提交commit。
sqlplus正常退出是会做提交动作的commit;,当系统异常退出时,会执行回滚操作rollback;。
一个没有结束的事务,叫做活动的事务 (active transaction),活动的事务中修改的数据时,只有本会话(session)才能看见。
十、Oracle中的伪列
伪列就像Oracle中的一个表列,但实际上它并未存储在表中。伪列可以从表中查询,但是不能插入、更新或删除它们的值。常用的伪列:rowid和rownum。
rowid:数据库中的每一行都有一个行地址,rowid伪列返回该行地址。可以使用rowid值来定位表中的一行。通常情况下,rowid值可以唯一地标识数据库中的一行。
rowid伪列有以下重要用途:
1)能以最快的方式访问表中的一行;
2)能显示表的行是如何存储的。
3)可以作为表中行的唯一标识。
如:SQL> select rowid, name from s_dept;
rownum:对于一个查询返回的每一行,rownum伪列返回一个数值代表的次序。
rownum伪列特点:
1) 有个特点要么等于1 要么小于某个值或小于等于某个值,不能直接等于某个值, 不能大于某个值。
2)常用于分页显示。
返回的第一行的rownum值为1,第二行的rownum值为2,依此类推。通过使用rownum伪列,用户可以限制查询返回的行数。
如:SQL>select * from s_emp where rownum<11; 从s_emp表中提取10条记录。
如:select rn,c1
from(select rownum rn, c1
from test
where rownum <= 5)
where rn between 3 and 5; //提取第3条到第5条的记录
如:找出第二名
select * from (select rownum rn , a.* from (select max(s.name),sum(grade) sg
from stu s,grade g
where s.id=g.sid
group by s.id
order by sg desc ) a)
where rn=2
十一、序列(sequence):
create sequence 序列名;
(不带参数时默认为从1 开始每次递增 1,oracle中为了提高产生序列的效率一般一次性产生20个序列放入当前会话的序列池中备用以加快效率)
sequence 的参数:
increment by n 递增量
start with n 起始值
maxvalue n 最大值
minvalue n 最小值
cycle|no cycle 循环
cache n 缓存(第一次取时会一次取多少个id存起来)
查看sequence 视图:
desc user_sequences ;
select sequence_name , cache_size , last_number from user_sequences; currval 当前的序列数
nextval 下一个序列数,它会自动给当前的序列加一个步长值。
drop sequence 序列名; //删除序列sequence
- 【Oracle】Oracle基础知识2
- Oracle基础知识(2)
- oracle基础知识2
- Oracle基础知识_小结2
- oracle 存储过程基础知识2
- oracle PL/SQL基础知识2
- Oracle 基础知识
- oracle 基础知识
- Oracle 基础知识
- Oracle 基础知识
- oracle基础知识
- Oracle基础知识
- Oracle基础知识
- Oracle基础知识
- ORACLE 基础知识
- ORACLE基础知识
- Oracle基础知识
- ORACLE基础知识
- Oracle基础知识(1)
- JSON 支持库开发手记
- 指针和数组的效率对比
- 我理解的信息化
- 使用 shell 在多个文件中查找, 替换
- Oracle基础知识(2)
- MTK HISTORY 小结 5
- solaris 磁盘阵列
- 了解unix与unix基础命令(1)
- 了解Unix与Unix基础命令(2)
- 找人帮忙解决一个Java程序编译出现异常
- 咔咕 咔咕下载地址 咔咕图语 最新咔咕2.2版下载
- Bat判断进程是否运行状态中
- 域名如何申请与管理