什么是关系型数据库?
关系型数据库是指我们基于关系模型创立的数据库
关系模型是指用一个二维表(行和列)的方式来保存数据.
集群的优点:
1.Load Balance 负载均衡
2.Fail Over 失败迁移
ORACLE的体系结构
sql的优化原则:
1.查具体列而不用*号;
2.where解析的顺序是从右往左,在and语句中,把假的条件尽量放在右边,可以提高效率;在or语句中,把真的条件尽量放在左边;
3.where子句和having子句都可以使用的情况下,尽量使用where语句.
where是先过滤在分组,having是先分组再过滤.
4.尽量使用多表查询,多表查询好于子查询
5.尽量不要使用集合运算,随着参与集合运算的数据越多,sql语句效率越低
修改sql的命令
change
查询员工信息:员工号 姓名 月薪 年薪 奖金 年收入
select empno,ename,sal,sal12,comm,sal12+comm
from emp
sql语句的空值问题:
1.包含空值的表达式都为null
2.null永远!=null
oracl的滤空函数 --nvl nvl2;
select empno,ename,sal,sal12,comm,sal12+nvl(comm,0)
from emp
判断奖金为null的员工
select * from emp where comm is null;
select empno as “员工号”,ename"姓名",sal 月薪,sal12,comm,sal12+nvl(comm,0) from emp;
关于别名 :员工号和姓名是一样的,但姓名和月薪是不一样的
别名影响关键字的话要加双引号
去掉重复的值 distinct
select distinct deptno from emp;
concat函数:
Mysql: select concat (‘Hello’,‘world’);
oracle:报错
oracle:select concat (‘Hello’,‘world’) from dual; dual为伪表
select ‘Hello’||‘World’ 字符串 from dual;
查询员工信息:的薪水是*
select ename||‘的薪水’||sal 信息 from emp;
字符串:
日期和字符只能在单引号中出现,双引号是列的别名.
对字符串来说格式敏感,对字符串来说大小写敏感.
过滤和排序:
使用where条件对结果进行过滤
select * from emp where deptno = 10;
mysql不区分字符串大小写,oracle区分大小写
select * from emp where hiredate=‘17-11月-81’;
select * from v$nls-parameters;
查询数据库参数
设置日期格式
如果集合中含有null,不能使用not in,但是可以使用in
模糊查询
insert into emp(empnp,ename,sal,deptno) values (1001,‘Tom_AB’,3000,10);
转义字符
select* from emp where ename like ‘%_%’ escape ‘’
mysql要手动开启事务,oracle自动开启事务,
where condition1 and condition2
where condition2 and condition1
在oracle是两条完全不一样的语句,但结果一样.
where解析的顺序是从右往左,在and语句中
SQL执行计划:
排序默认升序:order by后面加+列 表达式 别名 序号
多列排序
总结:order by 作用于后面的所有列,先按照第一个列排序,再后面的列
desc只作用于离他最近的列
思考:排序后的结果,是否还是原来的表?
查询员工信息,按照奖金排序
null的排序
原因:默认降序空值排在前面,oracle中空值最大.
单行函数:
目的:简化操作
6种单行函数:
大小写控制函数:
select lower(‘Hello World’) 转小写,upper(‘Hello World’) 转大写,initcap(‘hello world’) 首字母大写 from dual;
substr(a,b) 从a中,第b位开始取
select substr(‘Hello World’,4) 字串 from dual;
length 字符数 lengthb字节数 —对英文来说一样
select length(‘Hello World’) 字符,lengthb (‘Hello World’) 字节 from dual;
select length(‘北京’) 字符,lengthb (‘北京’) 字节 from dual;
instr(a,b) 在a中,查找b
select instr (‘Hello World’,‘ll’) 位置 from dual;
lpad左填充 rpad右填充
select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右 from dual;
trim 去掉前后指定的字符
select trim(‘H’ from ‘Hello WorldH’) from dual;
replace 替换掉指定的字符
select replace(‘Hello World’,‘ll’,’*’) from dual;
数值函数:
round :四舍五入
trunc:截断
mod:求余
四舍五入:
截断:
日期:
mysq:
date年月日
datetime年月日小时分钟秒
oracle:
date=年月日小时分钟秒
昨天 今天 明天
select (sysdate-1) 昨天,sysdate 今天,(sysdate+1) 明天 from dual;
**计算员工的工龄:**天 星期 月 年
select ename,hiredate,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期,(sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年 from dual;
注意:日期不能相加没有意义;
日期函数:
精确计算工龄:months_between(sysdate,hiredate)
select ename,hiredate,(sysdate-hiredate)/30 一,months_between(sysdate,hiredate) from emp;
53个月后:
select add_months(sysdate,53) from dual;
日期所在月份的最后一天:
select to_char(last_day(sysdate),‘yyyy-mm-dd’) from dual;
指定日期的下一个日期: 从今天算起 下周四是几号
select to_char(next_day(sysdate,‘星期四’),‘yyyy-mm-dd’) 下星期四 from dual;
next_day函数的应用:每个星期一自动备份表中的数据
需要具备的知识:1.分布式数据库.
2.快照.触发器