https://www.520longzhigu.com

oracle从入门到精通视频教程(oracle存储过程详解)

本次试验依然在windows 2016下进行。

一、以默认普通用户scott/tiger连接数据库

安装Oracle时,若没有为下列用户重设密码,则其默认密码如下:

以普通用户scott连接,默认密码为tiger

格式:conn 用户名/密码(conn scott/tiger)

口令更改为cat

二、检查Oracle的服务

点击开始—运行,输入services.msc ,打开windows的服务选项,

回车

找到Oracle数据库服务是否启动的两个服务,一个是Oracle服务,一个是Oracle监听服务。

其中ORCL为数据库的名称

下面是oracle的监听程序,专门用来负责数据库用户远程访问数据库。

三、最简单的增删改查

3.1查询(select)

3.1.1查询用户SCOTT状态

SQL> select username,account_status from dba_users where username=’SCOTT’;

EXPIRED表示数据库用户处于到期状态,不能正常连接上数据库。

&是并且的意思

LOCKED表示用户处于锁住状态,不能使用该数据库用户。

解锁数据库用户语法

alter user 数据库用户名 account unlock;

解锁SCOTT用户

SQL> alter user scott account unlock;

验证SCOTT用户的状态

SQL> select username,account_status from dba_users where username=’SCOTT’;

上图显示SCOTT用户已经解锁,但是目前处于到期状态。在EXPIRED状态下,Oracle数据库默认SCOTT用户需要使用原来的密码重新登录,并设置新密码,即可解除到期状态。

SQL> conn scott/tiger

conn是connect的缩写,scott为oracle数据库的用户,tiger为scott用户的初始密码。

图中显示:”the password has expired”,说明scott用户密码到期,输入新口令cat

验证查询soctt用户是open状态

SQL> select username,account_status from dba_users where username=’SCOTT’;

用scott/cat的用户名和密码连接数据库

C:UsersAdministrator>sqlplus scott/cat

验证连接用户

SQL> show user

3.1.2查询SCOTT用户拥有那些表

SQL> select table_name from user_tables;

上图中可以看到有4个表,

DEPT(Department 部门)

EMP(Employee 雇员)

BONUS(奖金)

SALGRADE(Salary Grade薪水等级)

上图中SQL语句解释

select 是SQL语句查询表数据必须的关键字,并且在查询SQL语句的开头,后面跟的是表中的列,如果查询多个列值,可以使用逗号隔开。

table_name 是user_tables表的一个用来存储表名的字段;而(*)则表示表中的所有字段。

from 是SQL语句查询表中必需的关键字,表示这些列数据”来自”那个表中,后面必须是表名。

user_tables,这是指表名,即把该表的列数据全部查询出来,它是Oracle数据库内部的表(也是)数据字典,专门用来查询用户自己拥有那些表。

分号(;)这是英文字符的符号,是表示这条查询SQL语句结束的符号。

3.1.3查看有哪些部门

SQL> select * from dept;

上图知,虚线上面有三个英文单词,这表示dept表有三列,

DEPTNO(部门号)

DNAME(部门名称)

LOC(工作地点)

可见该公司有4个部门,部门分别为10,20,30,40

可以看到部门为10的部门名称为ACCOUNTING(财务部),工作地点在NEW YORK(纽约)。

*表示所有字段

3.1.4查询dept表有哪些列

SQL> desc dept

由上图可知该表有三列

DEPTNO(部门号)

DNAME(部门名)

LOG(部门工作地点)。

3.2增加(insert into)

3.2.1增加一个Development(开发)部门

SQL> insert into dept(deptno,dname,loc) values (50,’Development’,’Beijing’);

Insert into 插入SQL语句,而且必须是在开头,在其后跟随的是表名。

把刚才插入的数据提交到数据库中,如果没有commit,则插入的SQL语句在计算机的内存中。

SQL> commit;

3.2.2查看dept部门表中是否存在刚插入的数据,已经在dept部门表中增加了Development开发部门。

SQL> select * from dept;

3.3修改(update)

把开发部门的办公地点更改为上海。

SQL> update dept set loc=’Shanghai’ where deptno=50;

查询结果

SQL> select * from dept;

update 是SQL更新语句的关键字,并且在语句的开头,后面跟随的是需要更新的dept表。

set 是SQL更新语句的关键字,该关键字跟随在表名的后面,是”设置”的意思。在后面跟随所要更新的列值。比如这里loc为dept表的字段,把该值更改为”Shanghai”。

where 是SQL语句中的条件限制关键字,即操作的数据需要满足的条件,这个关键字可以在增删改查SQL语句中使用,一般用在SQL语句的后面来表示条件。条件可由列名、字符串、算数表达式等组成。

deptno=50 是SQL条件语句的一部分,表示在dept表中把部门号等于50的数据查询出来。

3.4删除(delete)

删除Development开发部门

SQL> delete from dept where deptno=50;

delete from 是SQL语句中删除数据必不可少的关键字,并且位于SQL语句的开始位置。后面跟随的是要删除的dept表,表名后面则是where条件限制语句。

四、综合运用

4.1 查询出公司每个员工的号码、名字、薪水。

SQL> select empno ,ename,sal, from emp;

select关键字后可以选择查询任意列,列与列之间用逗号隔开。后面跟随的empno、ename、sal均为emp表的列。

4.2调整查询结果表的列次序,可以把最关心的重点列放到最前面。

SQL> select ename,sal,empno from emp;

4.3在oracle的sqlplus中,英文字符默认是左对齐,而数字则默认是右对齐。

查看员工的姓名和入职时间,其中hiredate的时间格式与我国习惯不符,毕竟Oracle数据不是中国人开发的。

SQL> select ename,hiredate from emp;

把时间设置为我们习惯的时间格式,仅仅是设置为当前会话场景。

SQL> alter session set nls_date_format=’YYYY-MM-DD’;

alter 更改数据库参数的SQL语句关键字。

session 只更改当前会话的时间格式

nls_date_format 数据库的日期参数,日期虽然一样,但可以有不一样的时间日期格式

4.4查询当前数据库时间

SQL> select sysdate from dual;

dual是oracle数据库的一个虚表,即不是真实存在的表,在查询用到计算、常量、表达式等时可以使用的dual虚表。

4.5查询在公司服务时间的员工信息,使用当前时间减去员工的入职时间,就可以得到在公司服务时间,这里需要引入round函数。

SQL> select ename,round((sysdate-hiredate)/365,0) from emp;

round(x,y) 是Oracle数据库的一个四舍五入的函数

x 表示这个数字需要进行四舍五入

y 则表示在哪位数进行四舍五入,如果y=0,表示在个位进行四舍五入,y=2表示在小数点后两位进行四舍五入。

4.6根据入职时间求出工作年限并且按照年限(第二列)升序排列

SQL> select ename,round((sysdate – hiredate)/365,0) from emp order by 2;

Order by 2中,order by 是排序的关键字,2表示按照第二列排序,默认排序是升序。

4.7按照工作年限倒序查询出每个员工的年数

SQL> select ename,round((sysdate-hiredate)/365,0) from emp order by round((sysdate-hiredate)/365,0) desc;

desc 表示排序使用降序来输出数据,即从大到小进行排序。

4.8 Oracle数据库查询入职时间。

SQL> select ename,round((sysdate-hiredate)/365,0) from emp order by hiredate;

把查询出来的表列名变成中文,方便显示。

SQL> select ename as “姓名” ,round((sysdate-hiredate)/365,0) as “工作(年)” from emp order by “工作(年)” desc;

as 是列别名的关键字,可以用英文双引号””里面的字符来表示该列的别名。如”姓名”是ename列的别名,查询输出数据时以”姓名”代替了ename列名。

工作年数的列名则变成了”工作(年)”,在Oracle数据库中,同时允许用列的别名进行排序。

4.9查询工资

SQL> select ename,sal from emp order by sal;

4.10 每个人增加1500元进行显示

SQL> select ename,sal+1500 from emp order by sal;

4.11对查询出来的员工薪水进行文字说明

SQL> select ename||’员工本月工资为:¥’|| (sal+1500) as “公司员工本月工资表” from emp order by sal;

|| 两个竖杠是oracle的连接符,可以把查询出来的数据和其他字符串连接起来,可以对多个字符串、多个表的列值相连接。

‘ ‘ 两个单引号”里面的字符串,可以把里面的字符串输出。即表的列数据和字符串连接在一起输出结果。

4.12查询到部门表中部门有重复的

SQL> select ename,deptno from emp;

为了清晰显示有哪些部门,可以过滤掉重复的部门值

SQL> select distinct deptno from emp;

distinct是去掉重复数据的SQL关键字,这个去掉重复数据的关键字经常用到。

4.13查询工资少于2000元的员工,并按照薪水排序。

SQL> select ename,sal from emp where sal<=2000 order by sal;

Order by需要在where的后面,常用运算符如下

“>”大于

“>=”大于等于

“<“小于

“<=”小于等于

“<>”和”!=”都是不等于

“=”等于

4.14查看薪水在1500到2500元之间的员工信息并且按照薪水排序

SQL> select ename,sal from emp where sal between 1500 and 2500 order by sal;

between…and…用于条件where之中,表示数值介于两个数值之间,这里表示是工资在1500-2500之间。

4.15查询拿保底工资的销售人员

SQL> select empno,ename,job,sal from emp where job=’SALESMAN’ and sal=1250;

where条件中的and表示”而且”的意思,即条件既要是销售人员,而且工资也是1250元的员工。

4.16查看没有奖金及工资少于1500元的员工

SQL> select empno,ename,job,sal,comm from emp where comm is null or sal<=1500;

or 是或者的意思,这里表示没有奖金或者工资少于等于1500元的员工;

null 在oracle数据库中是一个很特殊的值,它即不表示0,也不表示空,是一个不能确定的未知数。

4.17员工的工资加上提成,那个员工的工资是最少的

SQL> select empno,ename,job,sal,comm,sal+nvl(comm,0) from emp where comm is null or sal<=1500 order by sal+nvl(comm,0);

Nvl(X,Y)是数据库的一个内部函数,表示如果X有值,则返回X的值,如果X的值为null,则默认为Y。

这里则是用comm(提成)替代X,”0″代表Y,如果有提成,则工资加上提成;如果没有提成,则表示提成是”0″,只有工资。把员工的薪水加上提成作为排序,可以明显看出来员工的收入多少。

4.20查看姓名中”M”开头的员工

SQL> select ename,job,sal from emp where ename like ‘M%’;

Like 是条件where中模糊查询的关键字,后面的字符串需用双单引号括起来,%在SQL语句中表示字符后面的所有字符,其中M%表示以M开头的所有字符。

4.21查询哪些员工属于销售人员、分析师、管理人员。

SQL> select ename,job from emp where job in (‘SALESMAN’,’ANALYST’,’MANAGER’);

in 表示在某个列中存在多个值均符合,或者使用or代替也可。

下面用or来代替上面的SQL语句,同时看看有哪些不一样。在oracle数据库的命令窗口输入下面的SQL语句:

SQL> select ename,job from emp where job=’SALESMAN’ or job=’ANALYST’ or job=’MANAGER’;

4.22统计公司每个岗位都有多少个员工

SQL> select job,count(*) from emp group by job;

group by 是oracle数据库中的分组函数,可以这样理解,按照工作职位进行分组,然后统计每个职位的人数。

Count(*)是统计数量的函数,这里统计公司每个岗位都有多少人。

4.23统计公司每个岗位都有多少个员工,并按数量进行排序。

SQL> select job,count(*) from emp group by job order by count(*);

4.24统计公司每个部门有哪些员工,并按照部门号进行排序。

SQL> select deptno,count(*) from emp group by deptno order by deptno;

从图中可以看到,10号部门有3人,20号部门有5人,而30号部门有6人。

4.25求公司总共支付员工的薪水

SQL> select sum(sal)+sum(nvl(comm,0)) from emp;

sum 是Oracle数据库内部的一个函数,即所有数值之和。

4.26求公司员工的平均工资

SQL> select round(avg(sal),2) from emp;

avg是oracle数据库的求平均值函数。

4.27统计公司所有员工中最高、最低、工资及相差多少

SQL> select max(sal),min(sal),max(sal)-min(sal) from emp;

max 是Oracle数据库内部的函数,专门统计最大的数值

min 是Oracle数据库的内部函数,专门统计最小的数值

4.28列出平均工资大于2500的岗位

SQL> select job,avg(sal) from emp having avg(sal)>2500 group by job;

having 在使用group by分组时,如有条件限制需要使用having,而不能使用where.即在group by中所对应的条件限制为having,上面的例子中数据库首先使用group by进行岗位分组,再使用avg(sal)求出每个岗位的平均工资,最后平均工资大于2500元由having进行限制。

本站接软文合作

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。