Oracle数据库学习笔记

第二部分 数据库
注:若是PLSQL登陆时出现"无监听",打开"服务",启动
“OracleServerXE”,“OracleXETNSListener”,就能够了;
——————————————————————————————
Oracle:
where子句和having子句均可以使用普通字段直接进行筛选,可是where效率高于having;
where执行顺序:from——>where——>group by——>select——>order by
having执行顺序:from——>group by——>select——>having——>order byweb

group by:分组
count(*):代指数据表中的全部数据,若是括号中不是“*”,那做用就是判断当前字段中是否为NULL;可让其余字段与其进行四则运算,若是没有通过count(字段),其余字段的值万一与空值进行运算则也会变为空值;

———————————————————————————————————————
转换函数:
to_number():将字符数据转换为数值,可是字符数值自己值为数值;
to_char():将数值数据或者日期数据转换为字符数据;
to_date():将字符数据转换为日期数据,可是字符为日期格式;
———————————————————————————————————————
增:
insert into 表名 (字段名1,字段名2…) values (值1,值2…);
若是是全字段输入(表中有多少字段就输入多少值),就能够省略 (字段名1,字段名2…),例:
insert into emp values(1,“张三”,2000);
———————————————————————————————————————
删:
delete from 表名 where 条件;
truncate table 表名; 删除表内全部信息,可是比"delete from 表名;"效率高;
———————————————————————————————————————
改:
update 表名 set 字段1=值1,字段2=值2; (会将字段名改成对应的值)
update 表名 set 字段1=值1,字段2=值2 where 条件; (将符合条件的数据改成新的值)
———————————————————————————————————————
查:
select * from where 条件;
———————————————————————————————————————
数据的备份:
表级别备份:
所有备份: create table 新表名 as select * from 备份表名;数据库

例: create table deptBack01 as select * from dept;
注:只是备份表的数据和结构,约束不会备份,好比主键;
部分备份: create table 新表名 as select 字段名1,字段名2…from 备份表名;
例: create table deptBack02 as select deptno,dname from dept;
数据总体插入:
insert into 插入表名 select * from 表名;
insert into deptBack02 select deptno,dname from dept;
注:查询语句结果的字段数据必须和插入表名的字段数量相同;
———————————————————————————————————————
多表联合查询:
SQL92方式;
1.笛卡尔积
将多个表的数据进行一一对应,所获得的结果为多表的笛卡尔积;
select * from emp,dept;
2.等值链接
先作表的笛卡尔积,而后筛选,筛选条件为等值筛选;接下来的判断处理就和单表查询同样;最好每一个字段前加上它所属的表名, 好比:
emp.ename;为了省事,能够把表名简化:from emp e,dept d,用等号做为判断符,字段的名字能够不一样;
3.不等值链接
查询员工姓名,工做,工资,工资等级
select * from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal;
4.自链接
查询员工姓名,工做,薪资,及上级领导姓名;
select e1.ename,e1.job,e1.sal,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno;
5.外链接
左外链接:
两张表作笛卡尔积,可是不是全部的两张表都是有相同行数的,这样的话,万一查那条信息在另外一张表也有相应不相同的信息可是不全,正常查询会把那条漏掉,因此须要代表,咱们一样须要没有信息的那条。
select * from emp e,dept d where e.deptno = d.deptno(+);
右外链接:
两张表作笛卡尔积,左部分的表若是有空白,可是右部分的须要,以下:
select * from emp e,dept d where e.deptno(+) = d.deptno;
———————————————————————————————————————
SQL99方式;
注意1:依然能够给表添加别名;
注意2:若是使用on或者 using 关键字对结果进行筛选,必须使用inner join做为表与表的链接,其中inner能够不写;
注意3:外链接的outer关键字能够省略不写;
注意4,:依然能够继续使用分组,having排序等;
———————————————————————————————————————
笛卡尔积:使用cross join 关键字
select * from 表名1 cross join 表名2;
筛选:
天然链接:使用关键字 natural join
select 内容 from 表名 natural join 表名
特色:底层先笛卡尔积,而后按照全部的同名同值字段自动进行等值筛选;
问题1:若是只想按照部分字段结果筛选怎么办?
问题2:若是想按照字段名不一样,可是值相同进行等值筛选怎么办?
select * from emp natural join dept;
解决1:使用using关键字
做用1:指明使用指定的字段对联合查询的结果进行等值筛选
注意:指明的字段必须是两表的同名同值字段
select 内容 from 表名 inner join 表名 using (字段名1,字段名2…)
例:select * from emp inner join dept using (deptno);
解决2:使用on关键字进行自定义链接条件筛选(等值筛选,不等值筛选)
注意:普通筛选条件使用where进行筛选,不要使用on进行。好处是语句的可读性变强;
select 内容 from 表名 inner join 表名 on 链接条件 where 普通筛选条件
select * from emp inner join dept on emp.ename = dept.deptno;
———————————————————————————————————————
注:多表联合查询用关键字“on”,普通查询用“where”;能够放在一个句子里;
———————————————————————————————————————
外链接:
左外链接:select 内容 from 表名 left outer join 表名 on 链接条件
例:查询员工姓名,工做,薪资,部门名称及没有部门的员工信息
select * from emp e left outer join dept d on e.deptno = d.deptno
右外链接:select 内容 from 表名 right outer join 表名 on 链接条件
例:查询员工姓名,工做,薪资,部门名称及没有员工的部门信息
select * from emp e right outer join dept d on e.deptno = d.deptno
全外链接:select 内容 from 表名 full outer join 表名 on 链接条件
select * from emp e full outer join dept d on e.deptno = d.deptno
自链接(本身连本身):
例:查询员工及其上级领导姓名:
select e1.*,e2.ename from emp e1 inner join emp e2 on e1.mgr = e2.empno;
———————————————————————————————————————
SQL92&SQL99实现三表联合查询:
SQL99使用: SQL92使用:
select 内容 from 表名1 | select 内容(别名,链接符,去重复,函数, inner join 表名2 | 逻辑运算)
on 链接条件 | from 表名1,表名2…
inner join表名3 | where 条件(链接条件,筛选条件,where)
on 链接条件 | group by 分组字段
where 普通筛选条件 | having 多行函数筛选
group by 分组 | order by 排序
having 多行函数筛选 |
order by 排序 |
———————————————————————————————————————
子查询:
注:当查询的筛选条件不明确时,考虑使用子查询;
单行子查询:
注:筛选条件不明确,须要执行一次查询,而且查询结果只有一个数据;
where子句中容许出现查询语句,该查询语句称为子查询;
例:查询全部比雇员(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);
例:查询和soctt属于同一部门且工资比他低的员工资料
select * from emp where deptno = (select deptno from emp where ename = ‘SCOTT’)and sal <(select sal from emp where ename=‘SCOTT’);
例:查询工资最高的员工资料
select * from emp where deptno = (select deptno from emp where ename = ‘SCOTT’)and sal <(select sal from emp where ename=‘SCOTT’);
多行子查询:
注:子查询的结果只有一个字段可是字段有n个值,考虑使用多行子查询,其实就是使用关键字
关键字1:any 任意
select 内容 from 表名 where 字段名 比较运算符 any 子查询语句
例:查询工资高于任意一个CLERK的全部员工信息
select * from emp where sal> any(select sal from emp where job = ‘CLERK’);
关键字2:all 全部
select 内容 from 表名 where 字段名 比较运算符 all 子查询语句
例:查询工资高于全部SALESMAN的员工信息
select * from emp where sal> all (select sal from emp where job = ‘SALESMAN’);
关键字3:in 表示任意存在,至关于any
select 内容 from 表名 where 字段名 in 子查询语句
select 内容 from 表名 where 字段名 not in 子查询语句
例:查询部门20中和部门10的雇员工做同样的雇员信息
select * from emp where job in (select job from emp where deptno = 10)and dept = 20;
———————————————————————————————————————
帐户管理学习
权限:具有某类事物的操做的能力,此能力称为权限;
角色:一系列权限的集合;
Oracle自带帐户:
system 管理帐户 密码:123456
特色:具有大部分Oracle的操做权限,主要用来管理普通帐户及Oracle的数据
使用者:Oracle数据维护工做人员ide

sys超级管理员帐户 密码:123456
特色:具有全部system的全部权限,同时又具有其余的权限
使用者:Oracle工程师svg

建立帐户:
使用system帐户,并使用dba身份,登陆Oracle管理系统
建立用户:
create user 用户名 identified by 密码;
运行这行代码,其实当前已经建立好用户,不过没法登陆,由于没有受权;
维护帐户:
赋予权限:
grant connect to 用户名;——————给用户赋予登陆权限;
grant resource to 用户名;——————给用户赋予资源操做权限;
通常的用户建立到这个就能够了,不过能够赋予更高级别的权限,让它能够建立别 的用户;
grant dba to 用户名;————————给用户赋予dba权限;
select * from 用户名.表名;—————————查看其它用户的表;
删除权限:
revoke 权限或角色名 from 用户名;
删除帐户:
drop user 用户名;
Oracle的二维表管理
数据类型:
number类型:
整型:number(a): 总长度为a;
浮点型:number(a,b): 总长度为a,小数位数长度为b;
varchar2类型:
varchar2(long):long表示字符的最大长度,实际存储内存长度是根据字符大小来分配的,可是最大不能超过long;
特色:动态分配存储空间,节省空间;
char类型:
字符类型char(long):无论字符数据长度是多大,直接开辟long大小的空间存储数据;
特色:存储效率高于varchar2();
date类型:
建立表:
格式:create table 表名(字段名 类型,字段名,类型);
例:create table 表名(
id number(10),
name varchar2(100),
age number(3),
sex char(4),
job varchar2(500),
birth date
)
添加测试数据
insert into 表名 values (1,’张三’,18,’男’,’职员,’01-01月-2000’);
insert into 表名 values (2,’李四’,20,’男’,’组长,to_date(‘19948-01-01’,’yyyy-mm-dd’));
二维表建立约束:
如上建立二维表的话,会有不少问题,好比能够输入多个相同id的信息,其余的字段亦是如此;这时候就须要约束条件来限制数据输入;
添加主键:primary key
特色:函数

———————————————————————————————————————
视图:
建立视图:
create view 视图名 as select 对外提供的内容 from 真实表名;
删除视图:
drop view 视图名;
视图特色:
1.保护真实表,隐藏重要字段的数据,保护数据;
2.在视图中的操做会映射执行到真实表中;
3.能够手动开启只读模式(1),使用关键字 with read only;
注:视图的建立必须拥有dba权限,咱们能够在system帐号(2)上对普通帐号的数据表进行权限赋予;
(1)create view stu2 as select sno,sname,sage from student with read only;
(2)create view stu as select sno,sname,sage from bjsxt.student学习