--数据字典
select *from all_tab_columns where table_name = 'EMP' --查出某个表的所有字段
select table_name from all_tables where owner = 'SCOTT' --查出某用户所有创建的表
select *from sys.all_ind_columns where table_name = 'EMP' --查出某表的所有索引
select *from all_constraints where table_name = 'EMP' --查出某表所有约束
select table_name ,comments from dictionary where table_name like '%TABLE%'; --查出模糊表名的备注
--约束:
指对数据库插入数据的各种限制,可以在创建表的时候直接声明,也可以在表创建好以后进行添加。
1.约束的类型:1.1 not null 不能为空;1.2 unique 不能重复 ;1.3 primary key 主键约束(不能重复,不能为空);1.4 foreign key 外键约束;1.5 on delete cascade 级联删除;1.6 check(条件) 插入数据必须满足某种条件
2.约束操作:2.1 删除约束;alter table EMP drop constraint DEPT_EMP_pid_fk ; --dept表与emp表的pid字段
2.2 禁用约束;alter table EMP disable constraint DEPT_EMP_pid_fk
2.3 启用约束;alter table EMP enable constraint DEPT_EMP_pid_fk
--视图:
指封装了各种复杂查询的语句,避免写更多的sql片段,以及可以按照需求展示所需要的字段。适用于多表多字段的创建
1.视图的创建:CREATE VIEW 视图名字(字段) AS 子查询
create or replace view v_wgs(stuId,stuName)
as
(select stuId,stuName from wgs where stuName = 'wgs'
with read only;
2.查看视图的创建语句:select text from v_wgs;
--索引:一种提升数据库查询效率的对象;减少对数据库的io操作;与表对象分开存放;数据库自动维护
分类:唯一索引;非唯一索引
创建方式:自动创建:创建主键约束以及唯一性约束,数据库会自动在相应字段上创建唯一性索引
手动创建:在其它列上创建非唯一性索引
优点:加快了查询速度
缺点:不便于表数据的修改,表数据修改需要重新创建索引,而且索引也会占据磁盘空间
索引的使用原则:
1.select操作占据大部分表操作
2.where后使用频繁的列字段
3.小于5M的表最好不要使用索引,表越小,越应该使用全盘扫描
4.在该查询条件下,查询结果行数小于5%的,最好使用索引
where 子句中的这个字段,必须是复合索引的第一个字段;
复合索引的创建:
create index i_wgs on wgs(stuName,stuRemark);
create index i_wgs1 on wgs(stuRemark,stuName);
这两个索引的效果不一样,有针对性
索引 i_wgs 对 Select * from wgs where stuName='wgs'; 这样的查询语句更有效
索引 i_wgs1 对 Select * from wgs where stuRemark='这是谁'; 这样的查询语句更有效
索引的删除:drop index i_wgs;
索引的类型:1.B树索引,采用平衡B树算法,即二叉树,左节点的键值要小于等于父节点的键值,右节点的键值要大于等于父节点的键值
2.位图索引:当字段的范围很小,如为男女两个选择,或ABC三个选择,字段只有几个值时B树索引没有意义,改用位图索引
create BItMap indsex i_wgs2 on wgs(stuSex);
注意:要在插入大量数据以后创建索引;限制表索引的数量;删除没有必要的索引
select * from user_indexes --查看使用的索引
select *from user_ind_columns --查看使用字段的索引
--SQL的优化原则:oracle数据库有两种CBO,RBO,其中CBO按照表及索引的状态进行计划;RBO按照自己的内部计划
1.尽量使用exists不用in,in主要用于内表(子查询数据表小)的时候,比较快,in语句会先查询子查询,然后将内表与外表结合起来一个卡迪尔集,然后在按条件进行查询,故内表数据量小时,查询快
2.尽量使用not exists和外连接,而不是not in ,not in 不会使用索引
3.尽量不使用!=和<>,用a>0 or a<0,原因前两者不会使用索引
4.索引字段应设置为not null,因为二叉树不能有空的
5.尽量不要使用"%"和"_"作为通配符的第一个字母,会导致无法使用索引
6.where字句中避免在索引字段使用计算
7.使用">="来代替">"符号,因为 A>2 时 ORACLE 会先找出为 2 的记录索引再
进行比较,而 A>=3 时 ORACLE 则直接找到=3 的记录索引
8.where后面条件要求,能过滤最多数据量的条件放到最后
9.使用显示或者隐示计算的字段不能使用索引
10.尽量使用别名,这样便于sql语句的解析
11.用 UNION ALL 代替 UNION,union all不会去重,速度快
12.通过改变 oracle 的 SGA 的大小,SGA 主要由三部分构成:共享池、数据缓冲区、日志缓冲区.
--序列
1.序列的创建语句:create sequere s_wgs
start with 1 --初值
increament by 2 --增长值,步长
order(需要不需要最大值) --
cache 20 --是否需要缓冲
Nocycle --是否需要循环
2.先有nextVal后有currVal,
3.用 cycle 时,用法如下:
3.1 create sequence s_wgs start with 1 increment by 1 cycle maxvalue 3 nocache ;
这样到 3 之后,要会重新从 1 开始
3.2 使用nocycle,就可以保证多表序列ID的唯一性
--注意:
不能改变当前值,但是可以改变增量
Alter sequence myseq increment by 3;
nocache可以防止数据库down的情况
--触发器
1.语句触发器:before语句以及after语句,针对语句
2.行触发器:before行触发器以及after行触发器,针对每一行记录,每修改一行都会进行触发
3.限制行触发器,略
4.系统事件触发器,略
注意事项:编写 DML 触发器的时,触发器代码不能从触发器所对应的基表中读取数据,编写时不会报错,但执行时会报错
触发器的应用场景:1.控制数据安全,如在非工作时间不能对特殊表进行操作
2.统计数据,如可以统计对某个表在一定时间内的操作次数
3.实现数据的完整性,如实现员工工资增长不能超过原来工资的20%
4.实现参照完整性,约束只能实现级联删除,但触发器可以实现级联更新
个人理解:这个就像Java代码中的监听器
CSP系统:ResourceUtil.getMessage("esales.userDefine.label.day")获取properity的配置文件对应字段内容
SysParamUtils.getSystemParamValue("138942","138");获取系统参数的值,数据库表为t_ucp_systemparam
定时任务:
1.spring集成quartz做后台定时任务:如定时的刷新表数据,或定时的调用dt接口或webservice客户端
https://www.cnblogs.com/obullxl/archive/2011/07/10/spring-quartz-cron-integration.html
2.spring自身集成定时任务更简单,更容易书写
CSP系统在页面添加菜单或按钮时,C10版本与C21版本应该注意,可能需要刷数据库五张表,实现菜单权限导航,不然会报权限错误,此时C10后台可能不报错,但前段一定会报权限错误。
CSP系统从SVN中检出来跑时,要注意/conf/serverInfo.properities中个字段的修改,报错要重点看eclipse根目录下local中的error.log日志,按照错误提示解决问题(重要),避免走弯路。