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进行限制。
发表评论