每个知识点的掌握程度:
1,重点:表示需要掌握,会写出来
2,理解:改代码
3,了解:不需要掌握
一个好的技术只能决定你的开始,而不能决定你的以后。
一个好的职场人员:技术,项目管理,CMM,心理学,会计,金融。
对于现在的软件开发,最重要的是构建商用体系,无纸化办公,OA,ERP,CRM
ruby
编程习惯:一定要有良好的编程习惯
1,oracle简介
oracle是现在全世界最大的数据库提供商,编程语言提供商,应用软件提供商
oracle由Ellison创办
oracle 8i/9i/10i i:internet以为着oracle开始向网络发展
oracle 10g/11g g代表网络计算
2,oracle安装(重点)
1,关闭防火墙,断开网络
2,启动安装程序
3,选择企业版
4,修改全局数据库名:soukenan
5,选中 创建带数据库样本的数据库
如果没有选中,就不会有大数据用户出现
6,设置口令 oracle oracle
7,启动安装程序,自行安装,不要进行任何操作
8,用户介绍:oracle常用一下四个用户:
在安装完成之后设置
1,超级管理员 sys/change_on_install
2,普通管理员 system/manager
3,普通用户 scott/tiger 默认是被锁定的
4,大数据用户 sh/sh
9,退出
注意:
10,把所有的oracle服务修改为手动启动
11,重要的服务
监听服务: 。。。Listener : 如果有程序要操作数据库,或者是一些远程的客户端要连接数据库
数据库的实例服务 OracleServiceSID 全局数据库名
3,oracle卸载步骤
1,直接运行卸载程序
2,删除硬盘上的残留文件
3,删除注册表中所有与oracle有关的配置项
4,监听问题:
1,注册表项被删除(注册表优化)
2,计算机名改变( 10g 和它以前的版本)
5,sqlplus
1,dos风格: sqlplus.exe
2,windows风格:sqlplusw.exe(可以进行数据显示的调整)
6,sqlplusw
select * from emp;
1.set linesize 300 设置没行的字符数
2.set pagesize 30 设置每页显示的数据个数
select * from emp;
3,在sqlplusw中 方向键只能控制屏幕的移动,没有办法控制光标
4, ed a 创建a.sql来编辑sql
@a 执行a.sql
@d:\demo.txt 如果这个文件是demo.sql可以这样写
@d:\demo === @d:demo
7,select * from tab ; 查看所有的表
8,show user 查看当前的登录用户
9,切换用户
conn 用户名/密码 [as sysdba]
10,每一张表都与其属于的用户,所以表明完整是
用户名 表名
11,select * from scott.emp ;
12,使用超级管理员可以关闭数据库
shutdown immediate;
这个时候,用户无法连接sqlplusw
此时可以先用/nolog登陆,之后用管理员登陆,启动数据库
执行下列语句
C:>SQLPLUS /nolog
startup
13, 在sqlplusw中使用windows系统命令,需要在前面加上 host
host notepad;
14. 在scott用户下四个表,查看表结构
desc emp;
1,部门表 dept
deptno number(2) 两位数字
dname varchar2(14)
loc varchar2(13)
2,雇员表 emp
empno number(4)
ename
job
mgr
hirdate
sal number(7,2) 基本工资
comm 奖金
deptno number(2)
3,工资等级表 salgrade
grade
losal
hisal
4,工资表bonus
ename
job
sal
comm
15,简单查询
select * from emp;
16,sql分类
dml 数据操作语言 用于检索或者修改数据
ddl 数据定义语言 用户修改数据的结构
dcl 数据控制语言 用户定义数据库用户的权限
17.简单查询
select [distinct] * from emp [别名]
1,select emp.ename from emp;
2,select job from emp;
3.select distinct job from emp;
4,select ename,job,sal*12 from emp; (四则运算
5,select ename,job,sal*12 income from emp; 起别名
6,select ename,job,(sal+300)*12 income from emp; 使用()改变运算等级
7,字符连接
select eno || ename from emp;
select eno || ':' || ename from emp;
8,一定要记住:
别名上的内容不能用' 括起来,而只有select子句之后的内容才用 '括起来
18,限定查询
1, select * from emp where sal>1500;
2, 在oracle中是区分大小写的
select * from emp where job='clerk';
==>
select * from emp where job='CLERK';
3,
select * from emp where sal between 1500 and 3000;
==>
select * from emp where sal>=1500 and sal<=3000;
4,
select * from emp where (job='CLERK' or job='SALESMAN') and sal > 2000;
5, between and 还可以限制日期范围
6,查询出所有领取奖金的员工
select * from emp where not comm is null
7,in操作
select * from emp where empno = 7369 or empno = 7766;
select * from emp where empno in (7369,7766);
8,关于 not in 和 in 问题
in 的范围中有 null 没有问题
not in 的范围有null 不会返回任何结果 , not in 的范围里存在了 null 则表示就是查询全部数据
9. like _匹配单个字符 % 匹配多个字符
select * from emp where ename like 'A%';
select * from emp where ename like '_A%';
select * from emp where ename like '%A%';
select * from emp where ename not like '%A%';
like不一定只能用在字符串上
select * from emp where hiredate like '%9%' or sal like '5%';
关于like子句的使用注意
like '%%' 查询全部
19,数据的排序
数据默认按照编号排序: asc 正序:默认,不写就是升序 desc 降序
1,select * from emp order by sal desc;
2,select * from emp order by sal asc;
3,select * from emp
order by sal , hirdate ;
单行函数
20,字符函数
1,
upper
lower
initcap 首字母大写
length
replace
substr
2,
1,select upper('hello') from dual;
2,select lower('hello') from dual;
3,select initcap(ename) from emp;
4,select * from emp
where length(ename) = 5;
5,select replace(ename,'A','*') from emp;
6.select ename,substr(ename,3) from emp;
select ename,substr(ename,3,7) from emp;
设置负数,表示从后面截取
select ename,substr(ename,-3) from emp;
面试题:
请问substr函数截取的时候下标是从0还是从1开始?
在oracle数据库中,substr函数从0还是1开始都是一样的
21,数字函数
1,round (数字|列,[保留小数的位数]) 四舍五入
2,trunc (数字|列,[保留小数的位数]) 舍弃指定位置的内容
3,mod(数字1,数字2) 取余数
例子:
1,select round(903.54) from dual;
2,select round(-903.54) from dual;
3,select round(903.54,-1) from dual;
4,select round(903.54,1) from dual;
5,select trunc(903.54) from dual;
6,select trunc(-903.54) from dual;
7,select trunc(903.54,-1) from dual;
8,select trunc(903.54,1) from dual;
9,select mod(10,3) from dual;
22,日期函数
1,如何取得当前日期
select sysdate from dual;
2, 日期+ 数字 表示多少天之后的日期
select sysdate+300 from emp;
日期-数字表示多少天之前的日期
select sysdate - 300 from emp;
日期-日期 表示两个日期之间的天数 肯定是大日期-小日期
select sysdate-hirdate from emp;
3, last_day (日期) 日期的月份的最后一天
select last_day(sysdate) from dual;
next_day(日期,星期数) 求出下一个指定星期X的日期
select next_day(sysdate,'星期一') from dual;
add_months(日期,数字) 求出若干月之后的日期
select add_months(sysdate,4) from dual;
months_between(日期1,日期2) 两个日期经历的月份
select months_between(sysdate,hirdate) from emp;
select trunc( months_between(sysdate,hirdate)) from emp;
23,转换函数 核心
to_char to_date to_number
to_char
标记: yyyy年 mm月 dd日 hh时 hh24 24小时 mi分 ss秒
1,select to_char (sysdate,'yyyy mm dd') from dual;
2, select to_char(sysdate , 'yyyy') from dual;
3, select to_char(sysdate,'fmyyyy mm dd') from dual; fm用来去除o
4, select to_char(sysdate,'yyyy mm dd hh24:mi:ss');
s, select to_char(23424234234234,'L999,999,999,999,999') from dual;
L表示运行环境所在的地的货币单位
6,select to_date('2012-3-4','yyyy-mm-dd') from dual;
7, select to_number('1') from dual;
select to _number('1') + to_number('2') from dual;
select '1'+'2' from dual;
24,通用函数 核心
nvl
1,select (sal+comm) *12 from emp;
select (sal+nvl(comm))*12 from emp;
decode 多值判断
1, select ename,
decode(job, 'CLERK','办事员' ,'SALESMAN','销售人员 ')
from emp;
25.大数据用户主要是为了做讲解中的测试使用
26,多表查询
1,查询记录数
select count(*) from emp;
2,select * from emp,dept;
3,select * from emp,dept where
emp.deptno = dept.deptno
select * from emp e,dept d where
e.deptno = d.deptno ;
这个查询从根本上还没有消除笛卡儿积
这个会进行逐条进行比较
在大数据的时候这个效率会非常低
4,
select e.ename,e.job,l.empno
from emp e,emp l
where e.mgr = l.empno;
5, select e.empno,e.ename,e.sal,d.dname,s.grade
from emp e,dept d,sal s
where e.deptno = d.deptno and
e.sal >= s.losal and
e.sal <= s.hisal;
27,左右连接
1,select * from emp e,dept d
where e.deptno = d.deptno ;
+放在左边表示是左连接
+放在右边表示是右连接
28, SQL:1999语法
1,交叉连接(cross join) 用于产生笛卡儿积
select * from emp cross join dept;
2,自然连接 natural join 自动找到匹配的关联字段,消除笛卡儿积
select * from emp natural join dept;
3,join -- using
select * from emp join dept using (deptno);
4,join -- on
select * from emp join dept on (emp.deptno = dept.deptno);
5, left outer join -- on 左连接
right outer join -- on 右连接
full outer join -- on 全连接 ,把两张表中没有的数据全部显示
29,统计函数和分组查询
1,count
2,avg
3,sum
4,max
5,min
select count(empno),sum(sal),avg(sal) from emp;
select max(sal),min(sal) from emp;
如果一个空表:count返回0
其他分组函数返回null,没有记录
分组查询
当有数据有重复的时候分组才有意义
1,
select max(sal),deptno from emp group by deptno;
各个语句的顺序
select
from
where
group by
order by
2,平均工资最高的工资
select max(avg(sal)) from emp group by job;
3,多字段分组
select d.deptno,d.dname,count(e.empno),nvl(avg(e.sal))
from dept d,emp e
where d.deptno = e.deptno(+)
group by d.dname,d.deptno;
4,having 放在group by之后 和where不同的是 having子句中可以使用分组函数
select d.deptno,d.dname,count(e.empno),nvl(avg(e.sal),0)
from dept d,emp e
where d.deptno = e.deptno(+)
group by d.dname,d.deptno
having avg (e.sal) > 2000;
30,子查询 可以替代多表查询
一般出现在where和from子句中
1,select * from emp where sal >
( select sal from emp where ename = 'SMITH' ) ;
2,where 返回单行多列的情况
select * from emp
where ( job,sal ) = (
select job,sal from emp where ename = 'ALLEN'
);
3,where 中 子查询返回多行单列的情况 in ( not in 在子查询中,如果有一个null 不会返回任何结果)
select * from emp
where sal in(
select sal from emp where job = 'MANAGER'
);
any操作 任意一个匹配上即可
select * from emp
where sal = any(
select sal from emp where job = 'MANAGER'
);
select * from emp
where sal > any(
select sal from emp where job = 'MANAGER'
); 比子查询中返回的最小的大
select * from emp
where sal < any(
select sal from emp where job = 'MANAGER'
); 比子查询中返回记录的最大的小
select * from emp
where sal > all(
select sal from emp where job = 'MANAGER'
);
select * from emp
where sal < all(
select sal from emp where job = 'MANAGER'
);
4,出现在from中:
多表查询
select d.deptno,d.dname,count(e.empno),avg(e.sal)
from emp e,dept d
where e.deptno(+) = d.deptno
group by d.deptno,d.dname;
子查询:效率更高
select d.deptno,d.dname,cempno,asal from(
select deptno,count(e.empno) cempno,avg(e.sal) asal
from emp e group by e.deptno
) temp,dept d where temp.deptno(+) = d.deptno;
31,数据的更新操作 update insert delete
复制数据库表
create table myemp as select * from emp;
1,.insert into myemp
(empno,ename,hiredate)
values (2323,'kenan',sysdate);
2, update myemp set ename = 'lele' where empno = 2323;
3,数据删除
delete from myemp where empno = 2323 ;
32,事务处理
所有的事务处理操作对应一个session
rollback 事务回滚
commit 提交事务
某一个session在更新数据库表的时候,这个表处于锁定状态
其他session是无法更新的,必须等待之前的session提交后才可以。
写完sql 必须要提交 ,否则不会提交到数据库
33,数据伪列
数据伪列指的是不需要用户处理,oracle自定维护的数据列
rownum,rowid
1,select rownum,empno,ename from emp;
rownum:行号
2, 查询 6-10条数据 来用来子查询
select * from
(
select rownum rn,empno,ename from emp where rownum <=10
)where rn>=6;
以来上面可以实现分页
34,rowid 了解:表示每一行数据保存的物理地址的编号
select rowid,empno,ename from emp;
rowid不会重复
35,面试题:删除数据库表中重复的记录 dept
select min(rowid)
from dept group by dname,loc
以上数据是不能删除的
delete from dept
where rowid not in (
select min(rowid)
from dept group by dname,loc);
36,练习题
列出至少有一个员工的所有部门的编号,名称
并统计出这些部门的平均工资,最低工资和最高工资
select d.deptno,d.dname,temp.avgsal,temp.maxsal,temp.minsal
from dept d,(
select deptno,avg(sal) avgsal,max(sal) maxsal,min(sal) minsal
from emp group by deptno) temp
where d.deptno = temp.deptno;
列出薪金比SMITH 或 ALLEN多的员工的编号姓名,部门名称,其领导姓名
select e.empno,e.ename,d.dname,m.ename
from emp e ,dept d,emp m
where e.sal > all (
select sal
from emp
where ename in ('SMITH','ALLEN'))
and e.deptno = d.deptno
and e.mgr = m.empno;
select e.empno,e.ename,d.dname,m.ename
from emp e join dept d on (e.deptno = d.deptno) join emp m on( e.mgr = m.empno )
where e.sal > all (
select sal
from emp
where ename in ('SMITH','ALLEN'));
列出所有员工的编号,姓名及其直接上级的编号姓名,显示结果按照领导的年工资的降序排列
select e.empno,e.ename,m.empno,m.ename,(m.sal+nvl(m.comm,0))*12
from emp e,emp m
where e.mgr = m.empno
order by (m.sal+nvl(m.comm,0))*12 desc;
37,
常用的数据字段
字符串 varchar2(n)
数字 number(n)
小数 number(n,m)
日期 date
大文本 CLOB 可以存储海量文字(4G)
大对象 BLOB 存放二进制数据
38,创建表
create table table_name(
column type default_value,
column type default_value,
column type default_value
);
create table member(
name varchar2(50),
age number(3),
birthday date default sysdate,
content clob
);
insert into member values('kenan',3,sysdate,'kekekekekek');
39表的复制:仅oracle支持以下语法 了解
create table copy_table_name as child_select;
create table emp20 as select * from emp where deptno = 20;
create table emp20 as select * from emp where 1 = 2 ;
40,表的重命名:oracle支持以下语法 了解
rename emp20 to emp30;
41,删除表数据可以进行数据的回滚
如果希望彻底清空表示表数据,无法回滚
truncate table emp30;
42,表的删除
drop table emp30;
表删除后,会进入一个回收站中(闪回技术)
查看回收站
show recyclebin;
恢复表
flashback table emp30 to before drop;
删除回收站中的数据
purge table emp30;
purge recyclebin; 清空回收站
如果希望删除不进入回收站
deop table table_name purge;
43,修改表结构
create table member(
mid number,
name varchar(45)
);
alter table member add(
age number default 0); //有默认值的话会为所有的已有列设置默认
alter table member modify(
name varchar2(2));
世界上性能最高的数据库是 IMB DB2 有一个平台的限制
跨平台的数据库 oracle性能最高
在 IMB DB2数据库之中时不允许修改表结构的
44,约束:保证表中的数据的合法性
非空约束 not null
检查约束
外键约束
1, create table temp(
id number not null);
2,唯一约束
create table temp(
email varchar(34) unique;
);
3,主键约束
create table temp(
id number(3)primary key
);
4,检查约束check CK
create table temp(
name varchar2(43),
age number(3),
constraint ck_temp_age check(age between 1 and 20),
constraint ck_temp_name check(name in ('kenan','na'))
);
45,外键约束
drop table member purge ;
drop table book purge ;
create table member(
id number primary key,
name varchar2(34)
);
create table book(
id number primary key,
mid number,
title varchar2(20),
constraint fk_book_member foreign key (mid) references member(id)
on delete cascade
);
1,外键约束 级联删除 ondelete cascade
2,删除数据的时候,将相关的子记录设为null
on delete set null
3,不关心字表是否存在,直接强制删除父表
drop table member cascade constraint purge;
4,合理做法:
先删除字表,然后删除父表
5,修改约束 用 alter指令
alter table table_name add constraint 约束名 约束类型
alter table table_name drop constraint 约束名
46,查询约束
oracle所有的对象保存在数据字典中,
而约束也是一样保存在数据字典中。
1, select* from user_constraints;
ower: 所有者 查询约束
2,查询约束对应的字段
select * from user_cons_columns;
3,格式化显示的列的长度 col ower(列) for A14;
47,集合操作
union 相同的部分不显示
create table emp20 as select * from emp where deptno = 20;
select * from emp
union
select * from emp20;
union all 相同的部分显示
select * from emp
union all
select * from emp20;
intersect 返回相同的部分
select * from emp
intersect
select * from emp20;
minus 返回不同部分 减去
select * from emp
minus
select * from emp20;
48,序列:自动增长列
1,创建序列
create sequence myseq;
2,select myseq.nextval from dual;
select myseq.currval from dual;
3,使用序列
insert into temp values(myseq.nextval);
49,视图
1,创建视图
create[ or replace ] view view_name
as 子查询;
2,查询视图
select * from view_name;
3, 创建视图的其他选项
1,with check option
限制修改视图条件
2,with read only
限制修改视图
50,同义词 了解
select sysdate from dual;
经过查询dual表格属于 sys
为什么在 scott中可以直接访问 dual
这个是因为同义词
create synonym myemp for scott.emp;
conn sys/change_on_install as sysdba;
create public synonym myemp for scott.emp;
51, 索引 理解 dba
select * from emp where sal > 1500 ;
这里采用的是逐行判断的方式
在oracle创建索引有以下两种方式:
1,主键约束
2,手工创建
create index emp_sal on emp(sal);
如果这个字段需要经常更新的话,那么这个索引也要全部更改,反而降低的性能
所以索引一般建立在不经常修改的列中
52,用户管理 了解 dba的工作 dcl
grant 授权 revoke 回收
1,创建用户
conn sys/change_on_install as sysdba;
create user dog identified by wangwang;
这个用户并不能登陆,没有登陆权限,没有创建session的权限
2,授权
grant create session to dog;
3,登陆 dog/wangwang
4,没有创建表和序列的权限
在oracle中 表空间保存在硬盘上,表数据保存在表空间上
5, grant create table to dog;
//这里给了创建表的权限,并没有操作表空间的权限,所以依然无法创建表
为了解决用户的授权操作,在oracle之中提供了许多的角色,每一个角色包含多个权限,而角色主要有两个: connect resource
6,授权
grant connect,resource to dog;
7,修改用户的密码
conn sys/change_on_install;
alter user dog identified by miaomiao;
管理员可以是密码失效,让用户登陆的时候,修改密码:
alter user dog password expire;
锁定用户
alter user dog account lock;
解锁
alter user dog account unlock;
8,select * from scott.emp;
这个新人无法访问别人的表
9, 授权其他用户表的操作权限
grant select on scott.emp to dog;
10,回收权限
revoke select on scott.emp from dog;
invoke connect,resource,create table,create session from dog;
11,删除用户
drop user dog cascade;
53,数据库的备份
数据库的导入和导出
1,数据的导出
1,exp
2,输入用户名和密码
3,回车
2,数据的导入
1,进入备份文件所在文件夹
2,imp
3,输入用户名和密码
4,回车
但是以上的情况适合于数据小的情况
54,数据的冷备份
在数据操作之中,有可能用户不会进行事务的提交,
那么这种情况下无法进行完整的备份操作,而所谓的冷备份
指的就是在关闭数据库实例的情况下进行的数据备份操作的实现
如果要进行冷备份,则需要备份数据库中的一些几个核心内容:
1,控制文件:数据库的实例服务的核心文件,通过 v$controlfile 找到
2,重做日志文件,可以进行数据的灾难性回复,通过 v$logfile 找到
3,数据文件,表空间文件 通过 v$datafile 和 v$tablespace 找到
4,核心操作的配置文件 pfile 通过 show parameter pfile 找到
从实际的oracle的部署来讲,所有的文件为了达到io的平衡操作,要分别保存在不同的硬盘上
查找文件
1,使用sys登陆
2, 查找所有的控制文件目录
select * from v$controlfile;
3,备份重做日志文件
select * from v$logfile;
4,查找表空间文件
select * from v$tablespace;
select * from v$datafile;
5,找到pfile文件
show parameter pfile;
6, 关闭数据库实例
shutdown immediate;
7,将所有查找到的数据库备份到磁盘上
8, 启动数据实例
startup
55,数据库设计范式:可以让数据表更好的进行数据的保存,指的是数据库的设计原则。
56,第一范式:
数据库表中的数据列不可再分:
所谓的不可分割就是所有的数据类型都使用数据库提供的数据类型
57,第二范式:
数据表的非关键字段对任一候选关键字段的部分函数依赖
两种方式理解:
1,列之间不存在函数关系
sal number,yearsal number
2,多对多关系设计,避免列重复,使用中间表实现
58,第三范式:
用的是一对多的实现,避免列重复
59,power Designer
1,建立数据库表结构
使用物理数据模型
2,生成数据库的创建脚本
Ctrl+G Database-->Database Generation
3,如何从数据库中倒入表结构
配置数据源
1, 管理工具--〉数据源
2,系统dsn
3,添加oracle
倒入数据库数据
4,power designer
-->File
-->Reverse Engineer
-->Database