Oracle的简介
1;Oracle10G不支持win7操作系统,而11G支持所有操作系统(安装完毕后自带Oracle sql Developer);
Oracle的登陆:sqlplus scott/tiger(sqlplus
用户名/密码)
Oracle客户机作用:使用jdbc:oracle:ori:@localhost:1521:orcl连接数据库时,需要安装客户机(集群,性能)
而使用jdbc:oracle:thin:@localhost:1521:orcl连接数据库时,只需要Oracle的jar包就可以了;
2;tomcat6以后已经支持集群(fail over 失败迁移 load balance 负载均衡);
-------------linux安装Oracle数据库;
3;Oracle数据库自动开启事物,提交事物时需要commit操作,如果想回滚数据,使用rollback命令即可;
Oracle的基本查询
sql优化:1,尽量使用列名代替*;
2,Oracle数据库where条件解析顺序从右向左;
3,当where和having都可以,优先使用where;
4,理论上,当子查询和多表查询都可以,一般要使用多表查询;
5,尽量不要使用集合运算;
sql语句的空值:1,包含null的算数表达式值都为null;
2,在sql语句中,null != null(is null 或者 is not null);
3,如果集合中含有null,不是使用not in,但可以使用in;
4,再有null值得排序时,升序没有问题,降序时有问题,需要加 nulls last;
5,多行函数对于null值会自动虑空;
6,
命令行中sql语句写错了:
使用c命令,和ed命令,推荐使用ed命令;
命令行的块注释:
行注释:--
清屏:host clear 设置行宽:set linesize 120 设置列宽 :col 列名 for a8(字符数);设置数字: col sal for 9999;
查看当前用户下的表:select * from tab
在Oracle的sql语句中支持算数表达式的, 也支持括号:select ename ,sal*12 from emp;
如何处理sql语句中的空值:使用Oracle的虑空函数nvl(a,b),nvl2()
distinct消除重复:作用于所有的列;
连接符的使用||:就是拼接成自己想要的字符串 如:select ename||'的薪水是'||sal
别名 from emp;
Oracle的过滤及排序
过滤的where条件注意:字符串大小写敏感(MySQL对字符串大小写不敏感),日期对格式敏感;where是紧跟在from后面;
在sql的条件表达式中可以使用比较运算符及操作符比较运算符(between.....and...,in,not in,like,is null);在使用like模糊查询时注意两个符号_和%(对于有特殊字符的字段:使用转移字符escape '\');
排序order by + 列名,表达式,别名,序号;
多个列的排序:先按第一个列排序,然后在按照第二列排序;
Oracle的单行函数
字符函数:LOWER,UPPER,INITCAP,CONCAT,SUBSTR,LENGTH/LENGTHB,INSTR,LPAD/RPAD,TRIM,REPLACE;
数字函数:round(四舍五入),trunc(截断),mod(求宇)
日期函数:计算员工的工龄(sysdate-hiredate)天,日期可以相减,不可以相加;
months_between,add_months,next_day(每个星期一自动备份数据===27,分布式数据库),last_day,round,trunc;
转换函数:显示类型转换:字符串,日期,数字之间的转换;
通用函数:NVL(expr1,expr2),NVL2(expr1,expr2,expr3)当值为null值时,返回expr3的值,否则返回expr2的值;
条件表达式:给不同员工涨工资,作用在sql语句中使用if-then-else,实现方式case和decode
Oracle的多行函数
count ,sum,avg,max,min;
分组数据:求各部门的平均工资;
注意:在select列表中所有未包含在组函数中的列都应该包含在group by子句中,而包含在group by子句中的列不必要包含在select列表中;
过滤分组信息使用having,如求各部门平均工资大于2000的信息;
where与having的区别:where的子句中不能使用组函数,而having可以使用
;
Oracle的多表查询
多表查询要消除笛卡尔积;
连接类型:等值连接,不等值连接,
外连接:左外连接,右外连接,
自连接:通过标的别名,将一张表视为多张表;(自连接不适用于操作大数据的表,因为其笛卡尔积很大。就使用层次查询)
层次查询: from emp e connect by prior e.empno = e.mgr start with e.empo=任意一个值或者 mgr is null 并提供一个伪列 level;
Oracle的子查询
子查询:解决一步不能解决的问题,如查询比谁的工资高的信息;就是查询语句的嵌套;
注意:1,子查询语句的括号不要丢了;
2,采用合理的书写风格;
3,可以主查询的where,select,from,having后面放置子查询,不能再group by放置子查询;
4,单独强调from后面的子查询;
5,主查询和子查询可以不是同一张表;
6,一般不再子查询中使用order by ;但在top-n分析问题时,必须使用order by;
7,一般先执行子查询,在执行主查询;但相关子查询除外;
8,单行子查询只能使用单行操作符,多行子查询只能使用多行操作符(in,any,all);
9,子查询的null值;
解决sql错误的最好的方法:谷歌;
Oracle的集合运算
操作的对象是集合:并集 union,union all ,交集 intersect ,差集 minus;
使用集合运算注意的问题:1,参与运算的各个集合必须列数相同,类型相同;
2,采用第一个集合的表头作为最后的表头;
3,如果排序,必须在每个集合后使用相同的order by;
在命令框中打印sql执行的时间命令: set timing on;
在使用rownum注意两点:rownum永远按照默认的顺序生成;并且rownum只能使用<,<=,不能使用>,>=(如何实现分页,首先将rownum查出来,作为一张表的一列,让其不是行列属性,就可以使用>和>=);
Oracle的相关子查询
将主查询的某个值作为一个参数传给子查询,如查询薪水大于本部门的平均薪水的员工信息;