ORACLE学习笔记
登录命令: sqlplus soctt/tiger@......:1521/orcl
修改语句命令:change,ed,spoll,a(追加)
别名加引号的区别
性能优化:
(1):*;
(2):where的解析,从右到左,影响AND和OR判断.
(3) having与where,尽量使用where
(4)使用多表查询代替子查询
(5)尽量不要使用集合运算
(6)使用索引和视图,不要使用like查询
(7)不要用字符串代替所有类型
null特性:
(1)不能使用not IN( null)
(2)含有NULL的排序,升序排最后,降序默认最前,nulls last
(3) 不能使用XX=null
(4) null值参与的运算都等于null,虑空nvl(a,b),
LIKE: %和_
||连接符相当于JAVA的+符号
""表示别名,''表示字符串和日期,字符串大小写敏感,区分MYSQL,日期格式敏感.
区分SQL和SQLPLUS命令
赋值使用:=
between..and 包含边界,小值在前,大值在后
ORACLE默认开启事务,MYSQL手动开启事务.
order by 作用所有列,升降序只作用于最近的列
dual 伪表
日期的表示,ORACLE只有DATE,MYSQL由DATE和TIME,系统时间SYSDATE, SYSTIMESTAMP
next_day应用-备份
日期和数字与字符串的自动转换,前提是符合格式要求.
组函数自动虑空值,可嵌套虑空函数
GroupBy需与组函数语句结合使用,
where 后面不能跟组函数(having与where的区别)
GroupBy中的rollup增强
hibernate 使用SQL语句与HQL语句的
decode与case语句实现,条件判断功能
(+)设置左右外连接
表的四种连接:内连接,外连接,自连接,等值连接,不等值连接
自连接不适合操作大表(笛卡尔集),可使用层次查询
伪列Level的使用
order by 可写列序号
只要满足树的数据结构都可以使用层次查询
查看数字字典: select * from v$nls_parameters;
修改日期格式:alter session setNLS_DATE_FORMAT='yyyy-mm-dd';
清除:字典设置:host cls
设置页面记录数:set pagesize 20;
一些基本设置命令:
SQL> --设置行宽
SQL>show linesize
linesize 80
SQL>set linesize 150
SQL> --设置列宽
SQL>col ename for a8
SQL>col sal for 9999
SQL> /
层次查询语句:
SQL> selectlevel,empno,ename,mgr
2 from emp
3 connect by prior empno=mgr
4 start with mgr is null
5 order by 1;
在函数中插入字符串用" ";
几个与null值有关的函数:nullif(a,b),coalesce(a,b,c),nvl2(a,b,c)
round(sysdate,'month'),round(sysdate,'year')
Rollup关键字:
selectdeptno,job,sum(sal) from emp group by rollup(deptno,job);
子查询书写注意事项: 1,括号 2, 可以放在where, select, having, from 后面,不能在group by 后面.
放在select 后的子查询必须使用单行子查询,一个主查询可以使用多个子查询,可嵌套.
from 后面跟Select语句有建新表功能(重点)
相关子查询
wm_concat
空字符串 to_char(null)
一次插入多条数据: 地址符:& ,批处理
如何处理海量数据
DDL语句不能回滚,
delete和truncate的区别
alter table 表名 move; 整理碎片,导入,导出
set timing on/off 设置时间显示
SELECT * FROM TAB 查看表
子表的外键必须为父表的主键
constranit 定义约束
@操作符的作用
管理员没有回收站,视图没有回收站,从回收站查看表需加" "号.
flashback table 功能(1)将表恢复到某个时间点,(2)从回收站恢复表.
nvl()可以合并列
问题:如何解除外键关联
--------------------------------------------------------------------------
sqlplus 常用命令:
登录:用户名/密码@orcl
查看用户: show user
conn 用户名/密码@orcl
-----------------------------------------------
ip:5560/isqlplus 网页界面
游标循环:
declare
curosor XXX
is
select XXXXXXXX
for 变量 in 游标 loop
...........................
end loop
----------------------------------
存储过程:
create orreplace procedure XXX
is
...
---------------------------------------------
触发器
create orreplace triger XX
before/aftrer curd on 表 [for each row]
-------------------------------
oracle默认事务隔离级别为READ Commited
select ......for upadate 行/列 加锁,锁定查询的数据,大量并发修改的数据需要加锁
PL/SQL 使用在以下对象中
匿名块
函数
存储过程
包
触发器
对象类型
------------------------------------------------------------------
数据库和实例:
数据库:磁盘上的物理文件
实例:
触发器的作用:备份,日志,两表复制
--------PL/SQL-----------------------------------------------
游标的类型:隐式游标,显示游标,REF游标
游标使用完要关闭;
通过隐式游标的属性可以获得最近执行的DML语句结果的信息: %found ;%notfound;%rowcount;%isopen
select..... into ..... 如果没找到,抛出异常,不会执行隐式游标
作用: 处理返回多行的查询
使用过程:
1,定义 CURSOR .... IS .......SELECT.....[for update]
2,打开游标 open ....
3,结果集控制 fetch .... into ....;
update .... set ....... where currentof 游标名;
4,关闭游标:close
声明游标可以设定参数以提高灵活性,游标的参数类型可以不设定长度.
游标可以由于批量更新或删除记录
游标的操作通常都要在循环中进行
for 循环变量 in 游标名
loop
.........
end loop;
* 循环变量不需要提前定义
定义: (1)TYPE ..... isREF CURSOR [ return 数据类型];
(2)定义游标标量;
使用:
打开语法: open cursor_name for.......[using 变量列表]
好处:
可以从不同的select语句中提取结果集;
可以作为过程的参数传递;
可以引用游标的所有属性;
可以进行赋值运算;
缺点:
不能在程序包中声明变量;
forupdate 不能用游标变量一起使用
不能使用比较运算符
使用bulk提取结果集,代替游标的循环操作,
语句:fetch 游标名 bulk collect into ........
--------------------------------------------------------------
加锁后其他用户只能查询,不能修改删除,维护数据的一致性,完整性
典型应用: 卖车票
锁的类型:行级锁,表级锁
下列语句会自动调用行级锁: update,insert ,delete ,select for update;
锁的释放:commit,roolback
语法: select .... for update [of column ....] [wait n | nowait] [skip locked]
行级锁可以具体锁定到每行的字段.
可以使用skip locked 跳过锁定的行
显示定义锁语法:lock table ...... in .... mode;
共享锁(share) ,不允许其他用户插入,更新,删除数据.但允许其他用户插入共享锁 (创建索引会产生共享锁)
共享行排他(share rowexeclusive) :限制高于共享锁,不允许其他用户共享锁(主外键约束)
排他锁(execlusive) 最高限制,只允许其他用户查询.
行共享锁: 禁止其他用户添加排他锁
出现死锁,系统会提示,需提交一个事务解决死锁
事务特点(ACID):原子性,一致性,隔离性,持久性
事务操作的DDL语句的关系
--------------------------------------------------------------------------------------------
定义: 经过编译,命名的PL/SQL块
组成: 声明部分,处理部分,
分类: 带参数和不带参数
为什么使用存储过程:
模块化设计
可重用
可维护性
安全性
语法: create or replaceprocedure XXXX(参数列表)
is /as
变量定义;
begin
end;
调用:exec 存储过程名称
存储过程参数默认为输入参数
*注意:不能在代码块中给输入参数赋值,也不能将输出参数赋值给代码块中的变量.
代码块中select .. into ... 赋值失败会抛出异常.
存储过程可以封装各种DML语句.
存储过程通过授权给其他用户使用, grantexecute on my_proce to 用户;
(1)尽量避免大事务操作,提高系统并发能力
(2)尽量避免反复访问同一张或几张表,考虑使用临时表;
(3)尽量避免使用游标,因为游标效率较差.
l 函数只接受输入参数
l 形参不能是PL/sql类型
l 函数的返回值必须是数据库类型
l 访问函数的两种方式:使用PL/SQL语句块;使用SQL语句 select function from dual;
l 函数有且只有一个返回值,必须有return语句,存储过程没有return语句
<<tag>>标记
可以存放存储过程,函数,触发器,游标,公共变量,常量,异常
程序包由规范(声明,包头)和和主体组成