1、oracle表和字段是有大小写的区别。oracle默认是大写,如果我们用双引号括起来的就区分大小写,如果没有,系统会自动转成大写。
2、我们在使用navicat使用可视化创建数据库时候,navicat自动给我们加上了“”。这样我们在创建数据库时实际的代码是这样的:(通过到处sql语句的文件,这样就不难理解我们为什么找不到表了。)
rownum
截断表:truncate table 会直接把表删除了而不会回滚,一般这个操作要谨慎
ROWNUM:表示行号,实际上此是一个列,但是这个列是一个伪列,此列可以在每张表中出现。
- 范例:查询emp表带有rownum列
select ROWNUM,e.* from emp e;
- 我们可以根据rownum来取结果集的前几行,比如前5行
select ROWNUM,e.* from emp e where ROWNUM<6;
但是我们不能取到中间几行,因为rownum不支持大于号,只支持小于号,如果想 实现我们的需求怎么办呢?答案是使用子查询,也正是oracle分页的做法。
- 不使用with as 语法
select *
from (select rownum rm, a.* from (select * from emp) a where rownum < 11) b where b.rm > 5;
- 使用with as 语法
with su as (
select ROWNUM rm,e.* from (select * from emp) e where ROWNUM<11
)
select *
from su where su.rm>5;
视图
oracle创建视图权限不足解决
sysy用户登录后执行下面的语句进行赋权
grant connect,resource,dba to scott;
视图就是封装了一条复杂查询的语句。
语法1.:CREATE VIEW 视图名称 AS 子查询
创建视图的时候 查询的sql不能有重复的列名
- 范例:建立一个视图,此视图包括了20部门的全部员工信息
create view emp20 as
select *From EMP e where e.DEPTNO=20;
- 删除视图
drop view EMP20;
- 实例操作
create view threetable as
(
select e.EMPNO,e.ENAME,d.DEPTNO,d.DNAME,
decode(s.GRADE,
1,'一级',
2,'二级',
3,'三级',
4,'四级',
5,'五级'
) grade,
e1.EMPNO e1_empno,e1.ENAME e1_ename,
decode(s1.GRADE,
1,'一级',
2,'二级',
3,'三级',
4,'四级',
5,'五级'
) grade1
from emp e,emp e1,DEPT d,SALGRADE s,SALGRADE s1
where e.MGR=e1.EMPNO and
e.DEPTNO=d.DEPTNO and
e.SAL between s.LOSAL and s.HISAL and
e1.SAL between s1.LOSAL and s1.HISAL
);
序列
在很多数据库中都存在一个自动增长的列,如果现在要想在oracle 中完成自动增长的功能, 则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。
序列虽然是给某个表使用,但是序列并没有绑定在某个表上,任何一张表使用这个序列都可以。
创建语法:
语法:CREATE SEQUENCE 序列名
[INCREMENT BY n] //自增
[START WITH n] //从几开始
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] //最大值 最小值 无最大值
[{CYCLE|NOCYCLE}] // 循环序列 /非循环序列
[{CACHE n|NOCACHE}];//序列对缓存的使用 /不使用缓存
这些参数是可选的
- 创建一个序列
create sequence seqpersonid start with 1 nomaxvalue ;
序列创建完成之后,所有的自动增长应该由用户自己处理,所以在序列中提供了以下的两种操作:
NextVal :取得序列的下一个内容
CurrVal :取得序列的当前内容
select seqpersonid.nextval from dual;
select seqpersonid.currval from dual;
- 在插入数据时需要自增的主键中可以这样使用
insert into "person"("person_id", "name", "age", "gender", "address")
values (SEQPERSONID.nextval,'张三',23,'1','gfadga');
索引
索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低I/O次数,从而提高数据访问性能。(主键默认就是索引),索引不需要主动使用,根据索引列查询时就自动的使用了索引
- 索引建立的原则是如果一个字段不经常查询,就不要建索引。
- 索引分类
- 单例索引
单例索引是基于单个列建立的索引,比如:
CREATE index 索引名 on 表名(列名)- 复合索引
复合索引是基于两个列或者多个列的索引。在同一张表上可以有多个索引,但是要求列的组合必须不同,比如:
create index 索引名 on 表(列名1,列名2);
复合索引在where条件后的顺序必须和建立索引的顺序一致- 索引的使用原则:
在大表上建立索引才有意义
在where字句后面或者是连续条件上建立索引
索引的层次不要超过四层