一:Oracle的基本概念与安装
1:简介
ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行B/S体系结构的数据库之一。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它的所有知识,只要在一种机型上学习了ORACLE知识,便能在各种类型的机器上使用它。
2:服务端安装
1.解压。oracle数据库安装包,如果是win7或者win8系统右键点击setupexe选择兼容性,以XP方式,并且以管理员方式运行,以及其他所有用户都按着此规则如图
3:自带客户端工具的安装
4:PLSQL工具的安装
(1)设置tools->preferences->connection中sqlplus路径
(2)确认服务器上的tnsnames.ora和linstener中的host为虚拟机ip地址
(3)将服务器中tnsnames.ora文件拷贝到本地路径无需修改,如果是拷贝发的资料需要修改文件中远程orcl服务器的ip地址
(4)系统变量中设置TNS_ADMIN变量为tnsnames.ora文件目录
8.解决中文乱码问题
查询select userenv('language') from dual;--AMERICAN_AMERICA.ZHS16GBK
查询select * from V$NLS_PARAMETERS;
在系统变量中设置NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
重新启动PLSQL
5:基本使用
解锁scott用户设置密码为tiger
OracleDBConsoleorcl --可以不启动,用于管理Oracle的企业管理器的服务.
OracleJobSchedulerORCL --通常不启动,用于定期操作任务的服务
OracleOraDb10g_home1iSQL*Plus --可以不启动,isqlplus服务,用网页执行sql,11g已经取消这个功能
OracleOraDb10g_home1TNSListener --必须启动,这是临听,用于远程客户端连接你的Oracle
OracleServiceORCL --必须启动,这是Oracle数据库的服务
二:Oracle体系结构
1:基本概念
实例
2:使用DDL语句管理表
--创建表空间
create tablespace xqc
--删除表空间
drop tablespace xqc
--创建用户
create user xqc
identified by xqc
default tablespace xqc
--给用户授权
--oracle中常见角色
connect --连接角色,基本角色
Resource--开发者角色
Dba——超级管理员角色
--给xqc授予dba角色
grant dba to xqc
--切换到xqc用户下
--修改列类型
alter table person modify gender char(1)
--char为固定长度
--修改列名称
alter table person drop colum sex;
序列的使用
--默认重1开始,依次递增,主要给主键赋值使用
create sequence s_person
dual:虚表,只为了补全语法,没有任何意义
select s_person..currval from dual;
Scott用户,密码为tiger
--解锁scott用户
alter user scott account unlock;
--解锁scoott用户的密码(也可以用来重置密码)
alter user scott identified by tiger
--切换到scoott用户,默认有四张表
三:基本语法
sql的基本语法参考mysql的,这里着重写oracle与mysql不同的地方
1:Select
2:过滤与排序
1:多表查询
1:外连接
2:子查询
3:集合运算
四:函数
1:通用函数(Oracle独有)
1.1:NVL
NVL(列|默认的代替值)
如果oracle的列为空那么显示第二个参数的值,如果列的值不为空,则显示列本来的值。
--算出工资+奖金的总和,但是奖金有空值,如果null和任意数字做算术运算,结果都是null
lect e.sal * 12 +e.comm from emp e;
select e.sal * 12 + nvl(e.comm,0) from emp e;
1.2:DECODE多数值判断
DECODE(列,匹配内容1,显示内容1,匹配内容2,显示内容2,未匹配内容的默认值);
根据不同的结果在输出的时候进行一个数据的转换
call函数
2:单行函数
单行函数:作用于一行,返回一个值
多行函数:作用于多行,返回一个值
是放在SQL中还是放在Java中处理??
2.1:trunc直接截取小数
TRUNC(列|数字 [,保留小数位])
2.2:字符函数
--转大写
select upper('yes') from dual;--YES
--转小写
select lower('YES') from dual;--yes
length(),
replace(),
substr()
2.3:数值函数
--四舍五入,后边参数表示保留的位数
select round(26.16,1) from dual;
trunc(),
mod()
2.4:日期函数(不同于mysql)
--查询emp表中所有员工入职距离现在几天
select sysdate - e.hiredate from emp e;
--算出明天此刻
select sysdate+1 from dual;
add_months(),
--查询距离现在几月
select months_between(sysdate,e.hiredate) from emp e;
--查询距离现在几年
select moths_between(sysdate,e.hiredate)/12 from emp e;
--查询距离现在几周
select round((sysdate-e.hiredate)/7) from emp e;
--转换函数
select to_char(sysdate,'fm yyyy-mm-dd hh24:mi:ss') from dual;
--字符串转日期
select to_date('2018-6-7 16:39:50','fm yyyy-mm-dd hh24:mi:ss') from dual;
转换函数
通用函数
nvl(),
nvl2()
2:多行函数
2.1:分页
--表工资倒序排序后,每页五条记录,查询第二页
select * from (
select rownum rn ,e.* from(
select * from emp order by sal desc
)e where rownum<11
)where rn >5
Mybatis的PageHelper插件也是这个原理,在最外层过滤后添加语句
select * from(
……
)where rownum <=20
2.2:视图
索引
五:事务
Oracle默认不自动提交,用户需手动提交,写commit或点击commit按钮,而mysql默认自动提交。
五:PLSQL的使用
程序结构,变量,流程控制,游标
指在SQL命令语言中增加了过程处理语句(如分支,循环等)
PLSQL新建TestWindow
PLSQL不区分大小写
5.1:程序结构
declare
--声明本地变量,游标
begin
--执行语句
--异常处理
end;
1:输出helloWorld
declare
--声明本地变量,游标
begin
--java:System.out.println("Hello World");
DBMS_OUTPUT.PUT_LINE('hello world');
end;
cmd输入sqlplus以scott登录密码为tiger
默认输出关闭,设置打开,以/结束
5.2:变量
变量名 变量类型(变量长度) 例如:v_name varchar2(20)
1)普通变量
直接赋值语句:=
语句赋值,使用select ……into……赋值
例:
--打印人员信息
DECLARE
--姓名
V_NAME VARCHAR2(20) :='zhangsan';
--薪水
V_SAL NUMBER;
--地址
V_ADDR VARCHAR2(200);
BEGIN
--直接赋值
V_SAL:=1580;
--语句赋值
SELECT '上海' INTO V_ADDR FROM DUAL;
--打印输出
DBMS_OUTPUT.PUT_LINE('姓名:'||V_NAME||',薪水'||V_SAL||',地址:'||V_ADDR);
END;
2)引用型变量
--查询emp表中员工信息
DECLARE
--姓名,不再直接使用类型,而是根据emp表中字段的变化而变化
V_NAME EMP.ENAME%TYPE :='zhangsan';
--薪水,同理
V_SAL EMP.SAL%TYPE;
BEGIN
--查询表中的姓名和薪水并赋值给变量
SELECT ENAME SAL INTO V_NAME,V_SAL FROM EMP WHERE EMPNO = 7839;
--打印输出
DBMS_OUTPUT.PUT_LINE('姓名:'||V_NAME||',薪水'||V_SAL);
END;
3)记录型变量
接收表中一整行记录,相当于Java中的一个对象
语法:变量名称 表名%ROWTYPE 例如V_EMP EMP%ROWTYPE
--查询emp表中员工信息
DECLARE
--记录型变量
v_emp emp%ROWTYPE;
BEGIN
--查询表中的姓名和薪水并赋值给变量
SELECT * INTO EMP FROM EMP WHERE EMPNO = 7839;
--打印输出
DBMS_OUTPUT.PUT_LINE('姓名:'||EMP.ENAME||',薪水'||EMP.SAL);
END;
5.3:流程控制
1)条件分支
语法:
2)循环
语法:
例:
5.4:游标
用于存储一个查询返回的多行数据(结果集,类似于Java的jdbc连接返回的ResultSet集合)通过遍历游标,可以逐行访问处理该结果集的数据
使用
声明——>打开——>读取——>关闭
1)语法
2)游标的属性
3)例
4)带参数的游标
--声明时修改
CURSOR c_emp(v_deptno emp.deptno%TYPE) IS ENAME,SAL FROM EMP WHERE deptno = v_deptno;
--打开时修改,传入参数
OPEN c_emp(10);
七:存储过程procedure
为了特定的业务功能,会向数据库进行多次连接关闭(连接关闭最耗费资源)需要对数据库进行多次IO读写,性能很低,
官方建议:能放在数据库中的就不要放到程序中,可能出错,而且数据库可以日志恢复
但是(维护可就难了)
语法
7.1:不带参数的
1:创建存储过程
CREATE OR REPLACE PROCEDURE p_hello IS
BEGIN
DBMS_OUTPUT.PUT_LINE('hello world');
END P_HELLO;
2:使用
BEGIN
--直接输入调用存储过程的名称
p_hello;
END P_HELLO;
在sqlplus中
注意:
is和as是可以互用的
过程中没有declare关键字,declare用在语句块中
7.2:带参数的存储过程
有输入参数和输出参数之分
使用
7.3:带输出参数的
7.4:Java执行存储过程
Connection对象
1)传统方式
//1,加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2,获取连接对象
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "scott";
String password = "tiger";
Connection conn = DriverManager.getConnection(url,user,password);
//3:获取语句对象
String sql = "{call p_querysal_out(?,?)}";
CallableStatement call = conn.prepareCall(sql);
//4:设置输出参数
call.setInt(1,7839);
//5:注册输出参数
call.registerOutParameter(2,OracleTypes.DOUBLE);
//6:执行存储过程
call.execute();
//7:获取输出参数
double sal =call.getDouble(2);
System.out.println(sal);
//8.释放资源
call.close();
conn.close();
七:触发器
六:常用SQL语句
与mysql的区别
1:
mysql以表级锁为主,对资源锁定的粒度很大,虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。
oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以oracle对并发性的支持要好很多。
八:优化
执行过程:
执行计划
执行计划是一条查询语句在Oracle中执行过程或者访问路径的描述.
查看执行计划:PLSQL中按F5
基数:返回的结果集行数
字节:执行该步骤后返回的字节数
耗费(cust),CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好.
执行顺序:根据缩进来判断,缩进最多的最先执行(缩进相同时,最上面的最先执行)
表的访问方式
- TABLE ACCESS FULL(全表扫描)
Oracle会读取表中的所有行,并检查是否满足where语句中条件;
使用建议:数据量太大的表不建议全表扫描
- TABLE ACCESS BY ROWID(通过rowid的表存取)
ROWID的解释:oracle会自动加在表的每一行的最后一列伪列,表中并不会物理存储ROWID的值,一旦一行数据插入后,则其对应的ROWID在该行的生命周期内是唯一的,即使发生行迁移,该行的ROWID值也不变。
- TABLE ACCESS BY INDEX SCAN(索引扫描)
在索引块中即存储每个索引的键值,也存储具有该键值所对的ROWID.
索引的扫描分两步:首先是找到索引所对的ROWID,其次通过ROWID读取改行数据
索引扫描又分五种:
INDEX UNIQUE SCAN(索引唯一扫描)
INDEX RANGE SCAN(索引范围扫描)
INDEX FULL SCAN(索引全扫描)
INDEX FAST FULL SCAN(索引快速扫描)
INDEX SKIP SCAN(索引跳跃扫描)
SQL语句处理过程
1.在共享池中查找SQL语句
2.检查语法
3.检查语义和相关的权限
4.合并(MERGE)视图定义和子查询
5.确定执行计划
优化
优化法则——漏斗法则
优化规则:
选择记录少的作为基表
用where替换Having
用in代替or