Oracle学习笔记
2019.6.12
1.数据库安装与卸载(百度)
2.Oracle自带账户&新建用户
(1)Oracle自带账户
账户名:
System:系统账户(管理员)
Sys: 超级用户(工程师)
区别:
Sys账户比system账户的权限要多
注意:
OracleXE版本安装好后,不自带普通用户
Oracle11g和Oracle10g自带一个普通用户scott,默认密码tiger,并给该用户自带了两张二维表数据。
(2)Oracle新建用户
必须使用System账户进行用户创建
打开plsql,使用System账户登陆,注意:登陆身份选择sysdba
新建Sql命令窗口(执行命令)
--创建用户 --create user 用户名 identified by 密码 create user scott identified by tiger --给用户赋予权限 --赋予数据库登陆连接权限 grant connect to scott; --赋予资源操作权限 grant resource to scott;
3.Oracle忘记用户密码
cmd打开window命令窗口
输入命令:sqlplus /nolog
输入命令:conn /as sysdba
输入命令:alter user 要修改密码的用户 identified by 新密码;
注意:
sqlplus不是内部命令的错误,是因为Oracle的环境变量配置有问题
4.SQL语言的分类
- DQL(数据查询语言)
select
- DML(数据操作语言)
insert、update、delete
- DDL(数据定义语言)
create、alter、drop
- DCL(数据控制语言)
grant、revoke
- TCL(事务控制语言)
SAVEPOINT、ROLLBACK、SET TRANSACTION、COMMIT
- 数据操作语言针对表中的数据,而数据定义语言针对数据库对象(表、索引、视图、触发器、存储过程、函数、表空间等)
5.SQL语句的单表查询
--单表的查询学习 --查询表的所有数据 select * from 表名; select * from emp; --查询表中指定字段的值select 字段名1,字段名2,...from表名 select empno from emp; select empno,ename from emp; --给查询结果中的字段使用别名 --在字段名后使用关键字 字段名 as "别名" --作用:方便查看查询结果 --注意:as关键字可以省略不写,别名中没有特殊字符双引号也可以省略不写 select empno 员工编号,ename"员工姓名",job as 工作,mgr as "领导编号" from emp;
2019.6.15
1.关系数据库的基本概念
关系:整个二维表
关系名:表格名称
元组:行数据(记录)
属性:列数据(字段)
属性名:列名称(字段名)
主键:唯一确定元祖的属性组(关键字)
域:属性的取值范围
2.连接符
|| 为sql语句的字符连接符,使用在select和from之间
格式:select 字段名 || '字符' || 字段名... from 表名
select empno || '的姓名' || ename from emp;
3.去除重复
使用distinct关键字:去除行重复
格式:select distinct 字段名,字段名,...from 表名
select distinct jdb,mgr from emp;
4.排序
(1)单字段排序
格式:select * from 表名 order by 字段名 asc;升序排列
select * from 表名 order by 字段名 desc;降序排列
select * from emp order by empno asc/desc
(2)多字段排序
先按照字段1排序,如果字段1的值相同,则按照字段2排序,。。。
格式:select * from 表名 order by 字段名 1,字段名2,...;
select * from emp order by empno ,ename;
5.字段的逻辑运算
select ename,sal+1000 from emp;
6.where子句
where子句查询:
使用where关键字进行结果筛选
--select 字段名, 字段名,。。。from 表名 where 筛选条件
单条件筛选:
多条件筛选:(where关键字:and,or,like,is null,is not null,in,between)
--查询工资在2000-3000之间的员工信息 select * from emp where sal >=2000 and sal <=3000; select * from emp where sal between 2000 and 3000; --查询工作为SALESMAN,ANALYST,MANAGER的员工信息 select * from emp where job='SALESMAN' or job='ANALYST' or job='MANAGER' order by job; select * from emp where job in('SALESMAN','ANALYST','MANAGER'); --查询姓名中包含s的,以s开头的,以s结尾的,第二个字符为A的(模糊查询) --%表示任意多个;_表示任意一个 --包含s的 select * from emp where ename like '%s%'; --以s开头的 select * from emp where ename like 's%'; --以s结尾 select * from emp where ename like '%s'; --第二个字符为A的 select * from emp where ename like '_A%'; --转义字符:escape把指定的字符变为转义字符,转义字符可以将特殊字符转为普通字符 select * from where ename like '%/_%' escape '/'; --查询有津贴的员工信息 --select * from 表名 where 字段名 is null; 字段值为null --select * from 表名 where 字段名 is not null; 字段值不为null --多个条件使用and关键字进行连接,筛选的是符合所有条件的数据 select * from emp where comm is not null and comm>0;
2019.6.16
1.Oracle函数
(1)单行函数
- 字符函数:
函数 | 功能 | 示例 | 结果 |
INITCAP(char) | 首字母大写 | initcap('hello') | Hello |
LOWER(char) | 转换为小写 | lower('FUN') | fun |
UPPER(char) | 转换为大写 | upper('sum') | SUM |
LTRIM(char,set) | 左剪裁 | ltrim('xyzadams','xyz') | adams |
RTRIM(char,set) | 右剪裁 | rtrim('xyzadams','ams') | xyzad |
TRANSLATE(char,from,to) | 按字符翻译 | translate('jack','abcd','1234') | j13k |
REPLACE(char,search_str,replace_str) | 字符串替换 | replace('jack and jue','j','bl') | black and blue |
INSTR(char,pos,len) | 查找字符串位置 | instr('worldvide','d') | 5 |
SUBSTR(cahr,pos,len) | 取字符串 | substr('abcdefg',3,2) | cd |
CONCAT(char1,char2) | 连接字符串 | concat('Hello','world') | Helloworld |
LENGTH(char) | 返回字段的字符长度 | length('aaa') | 3 |
- 数值函数:
函数 | 功能 | 示例 | 结果 |
ABS(n) | 取绝对值 | abs(-15) | 15 |
CEIL(n) | 向上取值 | ceil(44.778) | 45 |
SIN(n) | 正弦 | sin(1.571) | 0.9999999 |
COS(n) | 余弦 | cos(0) | 1 |
SIGN(n) | 取符号 | sign(-32) | -1 |
FLOOR(n) | 向下取整 | floor(100.2) | 100 |
POWER(m,n) | m的n次幂 | power(4,2) | 16 |
MOD(m,n) | 取余数 | mod(10,3) | 1 |
ROUND(m,n) | 四舍五入 | round(100.256,2) | 100.26 |
TRUNC(m,n) | 截断 | trunc(100.256,2) | 100.25 |
SQRT(n) | 平方根 | sqrt(4) | 2 |
- 日期函数
函数 | 功能 | 示例 | 结果 |
MONTHS_BETWEEN | 返回两个日期间的月份 | months_between('04-11月-05','11-1月-01') | 57.7741935 |
ADD_MONTHS | 返回把月份数加到日期上的新日期 |
add_months('06-2月-03',1) add_months('06-2月-03',-1) |
06-3月-03 06-1月-03 |
NEXT_DAY | 返回指定日期后的星期对应的新日期 | next_day('06-2月-03','星期一') | 10-2月-03 |
LAST_DAY | 返回指定日期所在的月的最后一天 | last_day('06-2月-03') | 28-2月-03 |
ROUND | 按指定格式对日期进行四舍五入 |
round(to_date('13-2月-03'),'YEAR') round(to_date('13-2月-03'),'MONTH') round(to_date('13-2月-03'),'DAY') |
01-1月-03 01-2月-03 16-2月-03 |
TRUNC | 对日期按指定方式进行截断 |
trunc(to_date('06-2月-03'),'YEAR') trunc(to_date('06-2月-03'),'MONTH') trunc(to_date('06-2月-03'),'DAY') |
01-1月-03 01-2月-03 02-2月-03 |
(2)多行函数
作用:对查询的数据进行统计
使用:select多行函数名(字段名),多行函数名(字段名)。。from表名
注意:多行函数不能和普通字段以及单行函数混用,除非分组
max(字段名) 返回该字段的最大值
min(字段名) 返回该字段的最小值
sum(字段名) 返回该字段的和
avg(字段名) 返回该字段的平均值
count:
count(*) 返回表的记录数
count(字段名) 返回非空值的数量
count(distinct 字段名)去除重复后的字段值的数量
(3)转换函数
to_number(数值类型的字符):将字符转换为数值
select to_number('123') from dual
to_char(数值或者日期):将数值或日期转换为字符
select to_char(123) from dual
to_date(日期格式的字符):将字符转换为日期
--字符转换为日期 char-->date select * from emp where hiredate > to_date('1982-01-01','yyyy-mm-dd') --日期转换为字符 date-->char select to_char(hiredate) from emp --默认日期格式 select to_char(hiredate,'yyyy-mm-dd') from emp --使用指定格式 select to_char(hiredate,'yyyy/mm/dd') from emp --使用指定格式
(4)其他函数
nvl():vl(字段名,值)
如果字段值不为null,则返回该字段的值。如果为null则返回新的值
nvl2():nvl2(字段名,处理1,处理2)
如果字段不为null,则执行处理1,为null执行处理2
decode():decode(字段名,值1,处理1,值2,处理2,值3,处理3,...,公共处理)
如果字段的值和decode中的条件值相同则执行对应的处理,如果都没有则执行公共处理
2019.6.17
1.Oracle的分组
关键字:group by 分组字段名,分组字段名。。。
- 注意1:使用了分组后,在select语句中只允许出现分组字段和多行函数
- 注意2:如果是多字段分组,则先按照第一字段分组,每个小组继续按照第二字段继续分组,依此类推
- 注意3:在where子句中不允许出现多行函数
分组筛选
关键字:having
作用:针对分组进行分组后的数据筛选,允许使用多行函数
注意:having关键字必须与分组结合,不允许单独使用
where和having的比较:
where子句不允许出现多行函数,having允许出现多行函数
where子句和having都可以使用普通字段直接进行筛选,但是where的效率高于having
where执行顺序:from-->where-->group by-->select-->order by
having执行顺序:from-->group by-->select-->having-->order by
结论:在分组语句中,使用where进行字段级别的筛选,使用having进行多行函数的筛选
--查询不同部门的最高工资 select deptno,max(sal) from emp group by deptno --查询不同工作岗位的员工数 select job,count(*) from emp group by job --查询不同部门的不同工作岗位的人数 select deptno,job,count(*) from emp group by deptno,job --查询不同部门的不同工作岗位的并且人数大于1的信息 select deptno,job,count(*) from emp group by deptno,job having count(*)>1 --查询部门号大于10的不同部门的不同工作岗位的人数 select deptno,job,count(*) from emp group by deptno,job having deptno > 10
2.数据库的增删改
--增加数据 --insert into 表名(字段名,字段名,。。。)values(值1,值2,值3。。。); --在部门中新增一个新的部门信息,信息内容为 编号:50,名称:LOL学院,地址:北京 insert into dept(deptno,dname,loc)values(50,'LOL学院','北京'); --在部门中新增一条数据,只有部门编号和名称,没有地址。 insert into dept(deptno,dname)values(70,'吃鸡学院'); --删除数据 --delete from 表名:删除表中的所有记录 --truncate table 表名:删除表中所有记录,但是效率高于delete --delete from 表名 where 条件 --修改数据 --update 表名 set 字段名=新值,字段名=新值。。。 --update 表名 set 字段名=新值,字段名=新值。。。where 条件 update dept set dname='java学院',loc='上海'; update dept set dname='java学院',loc='上海' where deptno=50;
3.数据的备份
注意:只会备份表结构和表的数据,约束不会备份
--表级别备份 --全部备份:create table 新的表名 as select * from 备份表名 create table deptBak as select * from dept; --部分备份:create table 新的表名 as select 字段名,字段名,。。。from 备份表名 create table deptBak2 as select deptno,dname from dept; --数据整体插入 --insert into 插入表名 select * from 表名 --注意:查询语句的结果的字段数据必须和插入表名的字段数量一致,类型一致
2019.6.18
1.获取系统当前时间,关键字sysdate
2.多表查询
(1)SQL92方式
- 笛卡尔积
概念:将多个表的数据进行一一对应,所得到结果为多表的笛卡尔积,结果的数量为所有表的数量的乘积
select * from emp,dept
- 等值连接
概念:先做表的笛卡尔积,然后筛选,筛选条件为等值筛选
注意:条件为字段的值相同来进行筛选,字段的名字可以不同
select * from emp,dept where emp.deptno=dept.deptno
- 不等值连接
select * from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal
- 自连接
select e1.ename,e1.job,e1.sal,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno
- 外连接
左外连接:加在右边,显示左边对应字段没有值的数据
select * from emp e,dept d where e.deptno=d.deptno(+)
右外连接:加在左边,显示右边对应字段没有值的数据
select * from emp e,dept d where e.deptno(+)=d.deptno
(2)SQL99方式
- 笛卡尔积
使用关键字:cross join
select * from emp cross join dept
- 自然连接
使用关键字:natural join
select 内容 from 表名 natural join 表名
特点:底层先笛卡尔积,然后按照同名同值字段自动进行等值筛选
缺点1:不能按照部分字段进行筛选
缺点2:不能按照字段名不同值相同进行筛选
select * from emp natural join dept
解决1:使用using关键字
作用:指明指定的字段对联合查询的结果进行等值筛选
注意:指明的字段必须是两表的同名同值字段
使用:select 内容 from 表名 inner join 表名 using(字段名1,字段名2,。。。)
select * from emp inner join dept using(deptno)
解决2:使用on关键字进行自定义连接条件筛选
注意:普通筛选条件使用where进行筛选,不要使用on进行。好处:SQL语句的阅读性变强
使用:select 内容 from 表名 inner join 表名 on 连接条件 where 普通筛选条件
select * from emp inner join dept on emp.deptno=dept.deptno
- 外连接
左外连接
--查询员工姓名,工作,薪资,部门,名称及没有部门的员工信息 select * from emp e left join dept d on e.deptno=d.deptno
右外连接
--查询员工姓名,工作,薪资,部门,名称及没有员工的部门信息 select * from emp e right join dept d on e.deptno=d.deptno
全外连接
select * from emp e full join dept d on e.deptno=d.deptno
- 自连接
--查询员工及其上级领导姓名 select e1.*,e2.ename from emp e1 inner join emp e2 on e1.mgr=e2.empno
3.子查询
(1)单行子查询
使用时机:筛选条件不明确需要执行一次查询,并且查询结果只有一个数据
--查询所有比雇员“CLARK”工资高的员工信息 select * from emp where sal > (select sal from emp where ename='CLARK') --查询工资高于平局工资的员工的名字和工资 select ename,sal from emp where sal > (select avg(sal) from emp) --查询职务和scott相同,雇佣时间早的员工信息 select * from emp where job=(select job from emp where ename='SCOTT') and hiredate < (select hiredate from emp where ename='SCOTT')
(2)多行子查询
关键字1:any 任意
select 内容 from 表名 where 字段名 比较运算符 any 子查询语句
关键字2:all 所有
select 内容 from 表名 where 字段名 比较运算符 all 子查询语句
关键字3:in 表示任意存在,相当于 =any
select 内容 from 表名 where 字段名 比较运算符 in 子查询语句
关键字4:not in 表示不存在,相当于 <>any
select 内容 from 表名 where 字段名 比较运算符 not in 子查询语句
--查询工资高于任意一个CLEAR的所有员工信息 select * from emp where sal > (select min(sal) from emp where job='CLEAR') select * from emp where sal > any (select sal from emp where job='CLEAR') --查询工资高于所有SALESMAN的员工信息 select * from emp where sal > (select max(sal) from emp where job='SALESMAN') select * from emp where sal > all (select sal from emp where job='SALESMAN') --查询部门20中同部门10的雇员的工作一样的雇员信息 select * from emp where job in (select job from emp where deptno=10) and deptno = 20 select * from emp where job = any (select job from emp where deptno=10) and deptno = 20
4.Oracle的账户管理
(1)Oracle自带账户
system 管理员账户
特点:具备大部分Oracle的操作权限,主要用来管理普通账户及Oralce的数据
使用人:Oracle的数据维护人员
sys 超级管理员账户
特点:具备system的所有权限,同时又具备其他的权限
使用人:Oracle工程师
(2)创建账户
使用system账户,并使用dba身份,登陆Oracle管理系统
创建用户
create user mxj identified by 123;
(3)维护账户
赋予权限 grant 权限名/角色名 to 用户名
grant connect to mxj; --给用户赋予登录权限
grant resource to mxj;--给用户赋予资源操作权限
grant dba to mxj; --给用户赋予dba权限
(4)删除账户
删除权限 revoke 权限名/角色名 from 用户名
revoke dba from mxj; --删除用户dba权限
删除用户 drop user 用户名
drop user mxj;
5.Oracle的二维表管理
(1)Oracle二维表创建
创建表
使用:create table 表名(字段名 类型,字段名 类型,。。。);
数据类型:
number类型
数值类型 number(a)
浮点数类型 number(a,b)总长度为a,小数位长度为b,小数位可以不写
varchar2类型
字符类型 varchar2(ln) ln表示字符的最大长度,实际存储内存长度是根据字符大小来分配,但是最大不能超过ln
特点:动态分配存储空间,节省空间
char类型
字符类型 char(ln) 不管字符长度多大,直接开辟ln大小的空间存储数据
特点:存储效率高于varchar2
date类型
create table student( sno number(10), sname varchar2(100), sage number(3), ssex char(4), sfav varchar2(500), sbirth date )
添加测试数据
insert into student values(1,'张三',18,'女','拍电影','01-1月-1985'); insert into student values(2,'李四',20,'女','拍电影',to_date('1990-01-01','yyyy-mm-dd');
6.二维表创建约束
- 添加主键
特点:非空唯一
使用:直接在创建表的字段后使用 primary key
在创建表的语句的最后使用 constraints pk_表名_字段名 primary key(表名)
在创建表后使用 alter table 表名 add constraints pk_表名_字段名 primary key(表名)
删除主键 alter table 表名 drop constraints 主键的约束名
- 非空约束
使用:直接在创建表的字段后使用not null 关键字
在创建表的语句的最后使用 constraints ck_表名_字段名 check(字段名 is not null)
在创建表后使用 alter table 表名 add constraints ck_表名_字段名 check(字段名 is not null)
删除非空约束 alter table 表名 drop constraints 非空的约束名
- 检查约束
使用:直接在创建表的字段后使用check(条件) 例如:sage number(3) check(sage<150 and sage>0)
在创建表的语句的最后面使用 constraints ck_表名_字段名 check(条件)
在创建表后使用 alter table 表名 add constraints ck_表名_字段名 check(条件)
删除检查约束 alter table 表名 drop constraints 非空的检查名
- 唯一约束
使用:直接在创建表的字段后使用 unique 关键字
在创建表的语句的最后使用 constraints un_表名_字段名 unique(字段名)
在创建表后使用 alter table 表名 add constraints un_表名_字段名 unique(字段名)
删除非空约束 alter table 表名 drop constraints 唯一约束名
- 外键约束
作用:当在子表中插入的数据在父表中不存在,则会自动报错
概念:当一张表的某个字段的值需要依赖另外一张表的某个字段的值,则使用外键约束,其中主动依赖的表称为子表,被依赖的表称为父表。外键加在子表中。
使用:在子表中的字段后直接使用 references 父表名(字段)例如: cid number(10) references clazz(cno)
在创建表语句的最后使用constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
在创建表后使用:alter table 表名 add constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
删除外键:alter table 表名 drop constraints 外键约束名
时机:一般选取父表的主键作为子表的外键
缺点:无法直接删除父表数据,除非级联删除
constraints fk_student_cid foreign key(cid) references clazz(cno) on delete cascade
级联删除:在添加外键约束时,使用关键字 on delete cascade
使用:当删除父表数据时,自动删除子表相关所有数据
缺点:无法保留子表历史数据
使用关键字 on delete set null
删除父表数据时,将子表中的依赖字段的值设置为null
注意:子表依赖字段不能添加非空约束
--创建学生表 create table student( sno number(10) primary key, sname varchar2(100) not null, sage number(3) check(sage>0 and sage<150), ssex cahr(4) check(ssex='男' or ssex='女'), sfav varchar2(500), sqq varchar2(30) unique, cid number(10) --references clazz(cno) --constraints fk_student_cid foreign key(cid) references clazz(cno) ) --添加外键 alter table student add constraints fk_student_cid foreign key(cid) references clazz(cno)
--添加测试数据 insert into student values(1,'张三001','男','唱歌','657889900',1); insert into student values(2,'张三002','男','唱歌','657889901',1); insert into student values(3,'张三003','男','唱歌','657889902',2); insert into student values(4,'张三004','男','唱歌','657889903',2);
--创建班级表 create table clazz( con number(10) primary key, cname varchar2(100) not null, cdesc varchar2(300) )
--添加测试数据 insert into clazz values(1,'java高级就业班','6666'); insert into clazz values(2,'python高级就业班','33333');
2019.6.19
1.二维表的维护
(1)添加新的字段
alter table 表名 add 字段名 类型
alter table student add sphone number(11) --在学生表中添加新的字段
(2)修改原有字段
修改字段类型
alter table 表名 modify 字段名 新的类型
alter table student modify sphone varchar2(11)
修改字段名
alter table 表名 rename column 字段名 to 新的字段名
alter table student rename column sphone to phone
删除字段
alter table 表名 drop column 字段名
alter table student drop column phone
(3)修改表名
rename 原表名 to 新的表名
rename student to student2
(4)删除表
drop table 表名
drop table student
2.Oracle的序列
(1)创建序列
作用:作为主键使用,动态获取主键的值,极大的避免主键冲突
使用序列名.nextval作为主键
insert teacher values(cc.nextval,'张三');
使用:create sequence 序列名
特点1:默认开始没有值,也就是指针指在没有值的位置
特点2:序列名.nextval每次执行都会自增一次,默认步长为1
特点3:序列名.currval查看当前序列的值,开始是没有的
--创建默认序列 create sequence cc; --创建序列cc select cc.currval from dual --查看序列当前值 select cc.nextval from dual --查看序列自增后的值 --创建自定义序列 create sequence aa --创建序列aa start with 5 --设置开始位置 increment by 2; --设置步长 max 1000 --最大值1000 cache 10; --缓存10个 select aa.currval from dual --查看序列当前值 select aa.nextval from dual --查看序列自增后的值
(2)删除序列
drop sequence 序列名
drop sequence cc;
3.索引
作用:提升查询效率
使用:
创建
create index 索引名 on 表名(字段名)
删除
drop index 索引名
特点:显示的创建,隐式的执行
注意:Oralce会自动给表的主键创建索引
4.视图
(1)使用视图
创建视图
create view 视图名 as select 对外提供的内容 from 真实表名
create view stu as select sno,sname,sage from mxj.student create view stu2 as select sno,sname,sage from student with read only drop view stu
删除视图
drop view 视图名
(2)视图的特点
特点:保护真实表,隐藏重要字段的数据,保护数据
在视图中的操作会映射执行到真实表中
可以手动开启只读模式
注意:视图的创建必须拥有dba权限
5.Oracle的分页查询
问题:当一个表中的数据量特别大的时候,如果一次性全部显示给用户,则造成页面过于庞大
解决:使用分页查询
使用:
rownum关键字:Oracle对外提供的自动给查询结果编号的关键字,与每行的数据没有关系
注意:rownum关键字只能做< <=的判断,不能进行> >=的判断
select rownum,e.* from emp e
--查询员工信息的前5条数据 select rownum,e.* from emp e where rownum <= 5 --查询员工信息的6-10数据 select rownum,t.* from(select rownum r,e.* from emp e where rownum <=10) t where r>5 --查询员工信息的11-15数据 select rownum,t.* from(select rownum r,e.* from emp e where rownum <=15) t where r>10