oracle知识大全。复习oracle知识点01.。。。。基本语句。。。。。存储函数

oracle

修改列的类型

alter table person modify gender char(1);

修改列的名称

alter table person rename column gender to sex;

删除列

alter table person drop column sex;

查询表中记录

select * from person;

插入数据

insert into person (pid,pname) values (1,‘xiaoming’);

commit提交事务

删除表中的全部的记录

delete from persom;

删除表结构

drop table person;

删除表,后去创建表,。等同删除表结构。如果数据量大,特别是有索引,效率高。

truncate talbe person;

序列不属于任何一张表,但是可以逻辑和表做绑定。

默认从1开始,依次递增,主要用来给主键赋值使用。

dual;虚表,为了补全语法,没有任何意义。

create sequence s_person

select s_person.currval from dual.

scott 用户,密码tiger。

初学使用,解锁用户

解锁用户

alter user scott account unlock;

解锁密码,也可以改密码

alter user scott identified by tiger;

-查询:

–单行函数:作用于一行,返回一个值
–字符函数

select upper(“yes”) from dual;–YES,小写变大写

select lower(“YES”) from dual;–yes大写变小写

–数值函数
–四舍五入,后面的参数表示保留的位数,

select round (26.16,1) from dual;–26.2

select round (26.14,1 ) from dual:–26.1

select round (26.14,-1 ) from dual:30

select round (26.14,-2 ) from dual:0

select round (56.14,1-2) from dual:100

–直接截取,不在看后面的位数是否大于5

select trunc(56.16,-1)from dual;56.1

–求余数

select mod(10,3)from daul;1

–日期函数
–算出明天此刻

select sysdate+1 from dual;

–查询出emp表中所有员工入职距离现在几天。

select sysdate-e.hiredate from emp e;

–查询出emp表中所有员工入职距离现在几月。

select months_between(sysdate,e.hiredate) from emp e;

----查询出emp表中所有员工入职距离现在几年

select months_between(sysdate,e.hiredate)/12 from emp e;

查询出emp表中所有员工入职距离现在几周

select round()(sysdate-e.hiredate )/7) from emp e;

–转换函数
–日期转字符串

select to_char(sysdate,‘fm yyyy-mm-dd hh24-mi-ss’) from dual;fm把02改为2,24表示24小时。mi区别mm

–字符串转日期

select to-date(‘2019-6-7 16:39:52’,‘fm yyyy-mm-dd hh24:mi:ss’) from dual;

–通用函数
–算出emp表中所有员工的年薪:工作+年薪
–奖金里面有null,如果null值和任意数字做算术运算,结果都是null,如果nvl把null改为0

select e.sal*12+nvl(e.comm ,0)from emp e;

–条件表达式
–用通用的表达式,oracle和mysql。
–给emp表中员工起中文名,等值判断不用e.ename=‘guojun’
–把要的值取名字。else去掉,其他值不要

select e.ename ,

​ case e.ename

​ when ‘SMiTH’ then ‘小米’

​ when ’ guojun’ then ‘小姐姐’

​ else ‘无名’

​ end

from emp e;

–判断工资等级

select e.sal,

​ case e.sal

​ when e.sal>8000 then ‘高收入’

​ when e.sal>3000 then ‘中收入’

​ else ‘低收入’

​ end

from emp e;

–oracle中除了起别名,都用单引号
–oracle专用条件表达式

select e.ename,

​ decode(e.ename,

​ ‘SMITH’,’ 小米’,

​ ‘ALLEN’, ‘大耳机’,

​ ‘WARN‘, ’诸葛西欧阿尔‘,

​ ’无名‘

​ )“中文名”

from emp e;

多行函数[聚合函数]:作用于多行,返回一个值
–查询总数量

select count (1) from emp:1第1列

–工资总和

select sum(sal) from emp;

–最大工资

select max(sal) from emp;

–最低工资

select min(sal) from emp;

–平均工资

select avg(sal) from emp;

–分组查询
—查询出每一个部门的平均工资
–分组查询中,出现在group by后面的原始列,才能出现在select后面
–没有出现在group by后面的列,想在select后面。必须加上聚合函数
–所有的条件都不能使用别名来判断:select ename ,sal s from emp where s>1500(错误不能s>1500.)

select e.deptno,avg(e.sal),e.ename

from emp e

group by e.deptno;

—查询平均工资高于2000的部门信息

select e.deptno, avg(e.sal) asal

from emp e

group by e.deptno

having asal>2000;

–查询出每一个部门高于888的员工的平均工资
–where是过滤分组前的数据,having是过滤分组后的数据。
–表现形式:where必须在group by之前,having 是在group by之后。
–然后在查询出平均工资高>2000的部门

select e.deptno ,avg(e.sal) asal

from emp e

where e.sal>888

group by e.deptno;

–多表查询中的一些概念
–笛卡尔积(没有值多,一般不常用)

select *

from emp e,dept d;

–等值连接( 隐性连接 )

select *

from emp e,dept d

where e.deptno=d.deptno;

–内连接(等效于等值连接,后面出现等值连接。而常用等值连接)连接中的条件是找连接对象。where条件是找查询后的符合条件的数据。

select *

from emp inner join dept d

on e.deptnoe=d.deptnoe;

–查询出所有的部门,以及部门下的员工信息。【外连接】
–右连接(右边数据保存)

select *

from emp e right join dept d

on e.deptno =d.deptno;

–左连接(左边数据保存)

select *

from emp e left join dept d

on e.deptno=d.deptno;

–oracle中的专用外连接(和上面的外连接一样,一般选通用的)

select *

from emp e,dept d

where e.deptno(+)=d.deptno;

–查询出员工姓名,员工领导姓名
–自连接。

select e1.ename.e2,ename

from emp el,emp e2

where e1.mgr=em.empno;

–查询出员工姓名,员工部门名称,员工领导姓名,员工领导部门名称

select e1.ename,d.dname,e2.ename,d.dname

from emp e1,emp e2 ,dept d1,dept d2

where e1,mgr=e2.empno

and el.deptno=d1.deptno

and e2.deptno=d2.deptno;

–子查询
–子查询返回一个值
–查询出工资和SCOTT一个的员工的

用=有隐患,如果ename不唯一,则返回是一个集合,就有问题。用in保险。

select * from emp where sal=

(select sal from emp where ename=‘SCOTT’)

–子查询返回一个集合
–查询出工资和10号部门任意一个一样的员工信息

select * from emp where sal in

(select sal from emp where deptno=10;

–子查询返回一张表
–查询出每一个部门最低工资,和最低工资一个工资,和该员工所在部门名称

–1,先查询出每一个部门最低工资

select deptno,min(sal)

from emp

group by deptno;

–2,三表联查,得到最终结果

select t.deptno,t.msal.e.ename,d.dname

from (select deptno,min(sal)

from emp

group by deptno)t,emp e,dept d

where t,deptno=e,deptno

and t.msal=e.sal

and e.deptno=d.deptno;

–oracle中的分页
–rownum行号,当我们做select操作的时候,每查询出一行记录,就会在该行上加上一个行号,
–行号从1开始,依次递增,不能跳着走。
–emp表工资倒叙排序后。每页五条记录,查询第二页。rownum>5这个条件不可以
–排序操作会影响rownum的顺序,因为先查询后排序,rownum乱了。
–如果涉及到排序,但是还要增加rownum的话,我们可以再次嵌套查询。

select rownum,t.* from(

select rownum,e.* from emp e by e.sal desc) t;

–emp表工资倒叙排序后,每页五条记录,查询第二页。
–rownum行号不能写上大于一个正数(0可以,没有意义)

select * from(

select rownum,e.* from(

​ select * from emp order by sal desc

​ )e where rownum<11

)where rn>5

–视图
–视图的概念:视图就是提供一个查询的窗口,所有数据来自于原表。
–查询语句创建表

create table emp as select * from scott.emp;

select * from emp;

–创建视图【必须有dba权限】

create view v_emp as select enmae,job from emp;

–查询视图

select * from v_emp;

–修改视图[不推荐]

update v_emp set job=‘CLERK’ where ename=‘ALLEN’;

commit;

–创建之读视图

create view v_emp1 as select ,job from emp with read only;

–视图的作用?
–第一:视图可以屏蔽掉一些敏感字段。
–第二:保证总部和分部数据及时统一。
–索引
–索引的概念:索引就是在表的列上构建一个二叉树
–达到大幅度提高查询效率的目的,但是索引会影响增删改的效率。
–单列索引

–创建单列索引

create index idx_ename on emp(ename);

–单列索引触发规则,条件必须是索引列中的原始值。

–单列索引,模糊查询,都会影响索引的触发。

select * from emp where ename=‘scott’

–复合索引
–创建复合索引

create index idx_enamejob on emp(ename,job);

–复合索引中第一列为优先检索列
–通过要触发复合索引,必须包含有优先检索列中的原始值。

select * from emp where ename=‘scott’ and job=‘xx’;触发复合索引

select * from emp where ename=‘scott’ or job=’xx‘;不触发索引,因为or实际上是两个查询语句,一个是单列索引触发,一个没有索引。结果就没有索引。

select * from emp where ename=‘soctt’ ;触发单列索引

–pl/sql编程语言
–pl/sql编程语言是对sql语言的扩展,使得sql语言具有过程化编程的特性。
–pl/sql编程语言比一般的过程化编程语言,更加有灵活高效。
–pl/sql编程语言主要用来编写存储过程和存储函数等。
–声明方法
定义变量

赋值操作可以使用:=也可以使用into查询语句赋值

一般情况用number,int不可以表示小数

declare

​ i number(2) :=10;

​ s varchar2(10):=‘xiaoming’;

​ ena emp.ename%type;引用型变量

​ emprow emp%rowtype;记录型变量

begin

​ dbms_output.put_line(i);

​ dbms_output.put_line(s);

​ select ename into ena from emp where empo=7788;

​ dbms_output.put_line(ena);

​ select * into emprow from emp where empo=7788;

​ dbms_output.put_line(emprow.ename || ‘的工作为:’||empro.job)

end;

控制台打印:

19

xiaoming

scott

scott的工作为:sht

–pl/sql中的if判断
–输入小于18的数字,输出未成年
–输入大于18小于40的数字,输出中年人
–输入大于40的数字,输出老年人

declare

​ i number(3):=&iu;用户输入一个值

begin

​ if i<18 then

​ dbms_output.put_line(‘未成年’)

​ elsif i<40 then

​ dbms_output.put_line(‘中成年’)

​ else

​ dbms_output.put_line(‘老成年’)

​ end if;

end;

–pl/sql中的循环
—用三中方式输出1到10是一个数字
—while循环

declare

​ i number(2):=1;

begin

​ while i<11 loop

​ dbms_output.put_line(i);

​ i:=i+1;

​ end loop;

end;

—exit循环(一般用的多)

declare

​ i number(2):=1;

begin

​ loop

​ exit when i>10;

​ dbms_output.put_line(i);

​ i:=i+1;

end loop;

end;

—for循环

declare

begin

​ for i in 1…10 loop

​ dbms_output.put_line(i);

​ end loop;

end;

–游标

可以存放多个对象,多行记录。

—输出emp表中使所有员工的姓名

declare

​ cursor c1 is select * from emp;表中值给游标

​ emprow emp%rowtype;

begin

​ open c1;

​ loop

​ fetch c1 into emprow;

​ exit when c1%notfound;

​ dbms_output.put_line(emprow.ename);

​ end loop;

end;

—给指定部门员工涨工资

declare

​ cursor c2(eno emp.depton%type)

​ is select empno from where deptno=eno;带参数游标,给值

​ en emp.empno%type;

begin

​ open c2(10);

​ loop

​ fetch c2 into en;

​ exit when c2%notfound;

​ update emp set sal=sal+100 where empno=en;

​ commit;

​ end loop;

​ close c2;

end;

—查询10号部门员工信息

select * form emp where deptno=10;

–存储过程

存储过程:存储过程就是提前已经编译好的一段pl/sql语言,放置在数据库端

可以直接被调用。这一段pl/sql一般都是固定步骤的业务。

or replace:不能保证一次写对,一般要写。

—给指定员工涨100元

create or replace procedure p1(eno in emp.empno%type)

is

​ begin

​ update emp set sal=sal+100 where empno=eno;

​ commit;

​ end;

—测试p1

declare

begin

​ p1(7788);

end;

–存储函数

存储过程和存储函数的参数都不能带长度

存储函数的返回类型不能带长度

区别:函数有返回值。过程没有返回值。

in和out:凡是涉及到into查询语句赋值或者:=赋值操作的参数,都必须使用out来修饰

相同点:都通过out指定一个或多个输出参数

—通过存储函数实现计算指定员工的年薪

create or replace function f_yearsal(eno emp.empno%type) return number

is

​ s number(10);

begin

​ select sal*12+nvl(comm,0) into s from emp where empno=eno;

​ return s;

end;

—测试f_yearsal

测试存储函数在调用的时候,返回值需要接收

declare

​ s number(10);

begin

​ s:=f_yearsal(7788);

​ dbms_output.put_line(s);

end;

–out类型参数如何使用
—使用存储过程来算年薪

create or replace procedure p_yearsal(eno emp.empno%type ,yearsal out number())

is

​ s number(10);

​ c emp.comm%type

begin

​ select sal*12 ,nvl(comm,0) into s,c from emp where empno=eno;

​ yearsal:=s+c;

end;

—测试p_yearsal

declare

​ yearsal number(10);

begin

​ p_yearsal(7788,yearsal);

​ dbms_putout.put_line(yearsal);

end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值