本次试验依然在windows 2016下进行。
一、以默认普通用户scott/tiger连接数据库
安装Oracle时,若没有为下列用户重设密码,则其默认密码如下:
![b32fbd0427fb024101d7c6f10be9b838.png](https://i-blog.csdnimg.cn/blog_migrate/52baf65dfe440796874c13ade363615c.jpeg)
以普通用户scott连接,默认密码为tiger
格式:conn 用户名/密码(conn scott/tiger)
口令更改为cat
![53798097cc19183ccb0aa2739d2b2335.png](https://i-blog.csdnimg.cn/blog_migrate/fd6a2e477ba1b479db86ad537b98d879.jpeg)
二、检查Oracle的服务
点击开始---运行,输入services.msc ,打开windows的服务选项,
![ee693b67a32d460bdb4b53ff602fb171.png](https://i-blog.csdnimg.cn/blog_migrate/7a6b8505f0957405c506ed9b65f21836.jpeg)
回车
![7fb6e8ac4948dc2b0da5c98ef6a9608c.png](https://i-blog.csdnimg.cn/blog_migrate/a380134b462be8394a0758c953e27924.jpeg)
找到Oracle数据库服务是否启动的两个服务,一个是Oracle服务,一个是Oracle监听服务。
其中ORCL为数据库的名称
![6e862d0192e8f68082ac5e438b997dc1.png](https://i-blog.csdnimg.cn/blog_migrate/36864578c4ac1f363f2b802b89dc517f.jpeg)
下面是oracle的监听程序,专门用来负责数据库用户远程访问数据库。
![ccbd2527528842d82bc40be02fcdebcb.png](https://i-blog.csdnimg.cn/blog_migrate/15486e0aede3bf14fae204d97f40a9d9.jpeg)
三、最简单的增删改查
3.1查询(select)
3.1.1查询用户SCOTT状态
SQL> select username,account_status from dba_users where username='SCOTT';
![0d75a80b330f3b4f4cc9c367fcbe855d.png](https://i-blog.csdnimg.cn/blog_migrate/fbc5288e20c4a1be1629aa87a777a89d.jpeg)
EXPIRED表示数据库用户处于到期状态,不能正常连接上数据库。
&是并且的意思
LOCKED表示用户处于锁住状态,不能使用该数据库用户。
解锁数据库用户语法
alter user 数据库用户名 account unlock;
解锁SCOTT用户
SQL> alter user scott account unlock;
![dc82274786e85f6b9ad126a1fcc27c0c.png](https://i-blog.csdnimg.cn/blog_migrate/433412425b46e7a3bf39e47f13b46d30.jpeg)
验证SCOTT用户的状态
SQL> select username,account_status from dba_users where username='SCOTT';
![1a541d6f7d28b76cb1850781fdf98cb2.png](https://i-blog.csdnimg.cn/blog_migrate/7cbf5f20148b17e7253608cbc849c238.jpeg)
上图显示SCOTT用户已经解锁,但是目前处于到期状态。在EXPIRED状态下,Oracle数据库默认SCOTT用户需要使用原来的密码重新登录,并设置新密码,即可解除到期状态。
SQL> conn scott/tiger
conn是connect的缩写,scott为oracle数据库的用户,tiger为scott用户的初始密码。
![5ec0791cd3a5a95a24a5e730d0927177.png](https://i-blog.csdnimg.cn/blog_migrate/9dc4a29c395a63942350adaab9acbd86.jpeg)
图中显示:"the password has expired",说明scott用户密码到期,输入新口令cat
验证查询soctt用户是open状态
SQL> select username,account_status from dba_users where username='SCOTT';
![4c2830fa0aecf088edadcf1bb4bb9ab6.png](https://i-blog.csdnimg.cn/blog_migrate/9e6f7ee084d8a5d81a4ac0a0d269ec64.jpeg)
用scott/cat的用户名和密码连接数据库
C:甥敳獲Administrator>sqlplus scott/cat
![bcb0df5a060ca18f3d02a1109652b322.png](https://i-blog.csdnimg.cn/blog_migrate/dc27aea7f35d6a101f1847bdbfc40a27.jpeg)
验证连接用户
SQL> show user
![1e933cbe5ba337445dc5f98184f8f547.png](https://i-blog.csdnimg.cn/blog_migrate/b9d18ab2a111e69c570e5d8f66ea4c3c.jpeg)
3.1.2查询SCOTT用户拥有那些表
SQL> select table_name from user_tables;
![3ea264a00488a09c3425177f4d7ace93.png](https://i-blog.csdnimg.cn/blog_migrate/01421c6b84e41881aa3a92f7246b7471.jpeg)
上图中可以看到有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;
![d00d12aa0c98dcd02d48a44d9b223f4d.png](https://i-blog.csdnimg.cn/blog_migrate/e4c6dd3b85dd6d8df1edd370eaa316d6.jpeg)
上图知,虚线上面有三个英文单词,这表示dept表有三列,
DEPTNO(部门号)
DNAME(部门名称)
LOC(工作地点)
可见该公司有4个部门,部门分别为10,20,30,40
可以看到部门为10的部门名称为ACCOUNTING(财务部),工作地点在NEW YORK(纽约)。
*表示所有字段
3.1.4查询dept表有哪些列
SQL> desc dept
![bf0e19d4bb7d483307f8e0f920122e9f.png](https://i-blog.csdnimg.cn/blog_migrate/81915ee50b3238912bc90e235b15df53.jpeg)
由上图可知该表有三列
DEPTNO(部门号)
DNAME(部门名)
LOG(部门工作地点)。
3.2增加(insert into)
3.2.1增加一个Development(开发)部门
SQL> insert into dept(deptno,dname,loc) values (50,'Development','Beijing');
![67120de41dd9d40d21d5db92c39cc191.png](https://i-blog.csdnimg.cn/blog_migrate/5783a3b89a118afa9a8fc440684e9ac1.jpeg)
Insert into 插入SQL语句,而且必须是在开头,在其后跟随的是表名。
把刚才插入的数据提交到数据库中,如果没有commit,则插入的SQL语句在计算机的内存中。
SQL> commit;
![01641d85cfc203aaea895a02d856f47c.png](https://i-blog.csdnimg.cn/blog_migrate/3b2abfafdb5415d515c51c5b67a56168.jpeg)
3.2.2查看dept部门表中是否存在刚插入的数据,已经在dept部门表中增加了Development开发部门。
SQL> select * from dept;
![e335cbcdb39e3f014519a71c2accfc4a.png](https://i-blog.csdnimg.cn/blog_migrate/0db12b44730337cb3d84fe9849a82004.jpeg)
3.3修改(update)
把开发部门的办公地点更改为上海。
SQL> update dept set loc='Shanghai' where deptno=50;
![8cd48dfb442698f4b74a6a2f4f388d08.png](https://i-blog.csdnimg.cn/blog_migrate/b8ff3a4df0c8fe2bdcb689dd669bef14.jpeg)
查询结果
SQL> select * from dept;
![c03928b51de188d1e873e65490038104.png](https://i-blog.csdnimg.cn/blog_migrate/5240a31c2018232008545e5db6898d4c.jpeg)
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;
![51174a190e0a2be13a824b4893084c2c.png](https://i-blog.csdnimg.cn/blog_migrate/cd9b88220f41504b0e9da551647df67d.jpeg)
delete from 是SQL语句中删除数据必不可少的关键字,并且位于SQL语句的开始位置。后面跟随的是要删除的dept表,表名后面则是where条件限制语句。
四、综合运用
4.1 查询出公司每个员工的号码、名字、薪水。
SQL> select empno ,ename,sal, from emp;
![92e685d6b2fcc31e42f67ee0467bb279.png](https://i-blog.csdnimg.cn/blog_migrate/f3bcab9e9a58a08a34cc3534cfca1a24.jpeg)
select关键字后可以选择查询任意列,列与列之间用逗号隔开。后面跟随的empno、ename、sal均为emp表的列。
4.2调整查询结果表的列次序,可以把最关心的重点列放到最前面。
SQL> select ename,sal,empno from emp;
![d547d115201df61c1260da01b7e60d63.png](https://i-blog.csdnimg.cn/blog_migrate/157340a7a31ec447349d43525bc5304e.jpeg)
4.3在oracle的sqlplus中,英文字符默认是左对齐,而数字则默认是右对齐。
查看员工的姓名和入职时间,其中hiredate的时间格式与我国习惯不符,毕竟Oracle数据不是中国人开发的。
SQL> select ename,hiredate from emp;
![d963270bd907fea3226ea49b8017b3e0.png](https://i-blog.csdnimg.cn/blog_migrate/6ad3a604aa401fb3e20a854a6a6883bb.jpeg)
把时间设置为我们习惯的时间格式,仅仅是设置为当前会话场景。
SQL> alter session set nls_date_format='YYYY-MM-DD';
![13539ef5c03521cff648bd682575d3b0.png](https://i-blog.csdnimg.cn/blog_migrate/e9c4378b1a62132e18946bb0b91fa060.jpeg)
alter 更改数据库参数的SQL语句关键字。
session 只更改当前会话的时间格式
nls_date_format 数据库的日期参数,日期虽然一样,但可以有不一样的时间日期格式
4.4查询当前数据库时间
SQL> select sysdate from dual;
![f56459ba5610a2aebb5484758731c80b.png](https://i-blog.csdnimg.cn/blog_migrate/5bb56b1b48a1443b9b0684304860253d.jpeg)
dual是oracle数据库的一个虚表,即不是真实存在的表,在查询用到计算、常量、表达式等时可以使用的dual虚表。
4.5查询在公司服务时间的员工信息,使用当前时间减去员工的入职时间,就可以得到在公司服务时间,这里需要引入round函数。
SQL> select ename,round((sysdate-hiredate)/365,0) from emp;
![c1f9bca0bf8d295862d12498a0d613e7.png](https://i-blog.csdnimg.cn/blog_migrate/852e32330beaac01004eac8f9d1996dd.jpeg)
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;
![50fc7a185393e954d01b496050ae43ae.png](https://i-blog.csdnimg.cn/blog_migrate/580f6b19879fa03f795f46e56cd73277.jpeg)
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;
![5930e6b6d1b1291ad354938a8fd6ee8d.png](https://i-blog.csdnimg.cn/blog_migrate/b7af339c3572e8680a8b36f2c3e29509.jpeg)
desc 表示排序使用降序来输出数据,即从大到小进行排序。
4.8 Oracle数据库查询入职时间。
SQL> select ename,round((sysdate-hiredate)/365,0) from emp order by hiredate;
![e00dae547b883b54580ff8dc05b48553.png](https://i-blog.csdnimg.cn/blog_migrate/af9d0756a5b08b326f75916ac6f11bfd.jpeg)
把查询出来的表列名变成中文,方便显示。
SQL> select ename as "姓名" ,round((sysdate-hiredate)/365,0) as "工作(年)" from emp order by "工作(年)" desc;
![3b8e87df4eb0eb0c2564cfadd8d4299e.png](https://i-blog.csdnimg.cn/blog_migrate/14e8dc6483f6554720f45a363d896e88.jpeg)
as 是列别名的关键字,可以用英文双引号""里面的字符来表示该列的别名。如"姓名"是ename列的别名,查询输出数据时以"姓名"代替了ename列名。
工作年数的列名则变成了"工作(年)",在Oracle数据库中,同时允许用列的别名进行排序。
4.9查询工资
SQL> select ename,sal from emp order by sal;
![9938b23af36830e63123a7f556f2702d.png](https://i-blog.csdnimg.cn/blog_migrate/d7a754b966f44136de2f9854a8d5d5ad.jpeg)
4.10 每个人增加1500元进行显示
SQL> select ename,sal+1500 from emp order by sal;
![403527c427b51bdd9f8f2c9152bd5c17.png](https://i-blog.csdnimg.cn/blog_migrate/9449362c6ddbe1b4c5528f3488c1b906.jpeg)
4.11对查询出来的员工薪水进行文字说明
SQL> select ename||'员工本月工资为:¥'|| (sal+1500) as "公司员工本月工资表" from emp order by sal;
![9f5b9b931870199bbd640f0c12de509a.png](https://i-blog.csdnimg.cn/blog_migrate/d57068d248a08f600c7b5e0c24a3ac67.jpeg)
|| 两个竖杠是oracle的连接符,可以把查询出来的数据和其他字符串连接起来,可以对多个字符串、多个表的列值相连接。
' ' 两个单引号''里面的字符串,可以把里面的字符串输出。即表的列数据和字符串连接在一起输出结果。
4.12查询到部门表中部门有重复的
SQL> select ename,deptno from emp;
![ecb7e8e1a6797646e189fbb80b744f97.png](https://i-blog.csdnimg.cn/blog_migrate/5743ef7184512a47d0fdf4dd5343b923.jpeg)
为了清晰显示有哪些部门,可以过滤掉重复的部门值
SQL> select distinct deptno from emp;
![7c65d5448ddf63fcf9a6ce14a112f69e.png](https://i-blog.csdnimg.cn/blog_migrate/1d7652b2aac4ee4a8419108aaa29a775.jpeg)
distinct是去掉重复数据的SQL关键字,这个去掉重复数据的关键字经常用到。
4.13查询工资少于2000元的员工,并按照薪水排序。
SQL> select ename,sal from emp where sal<=2000 order by sal;
![88aab22386f12df8addbc55b4e6541bd.png](https://i-blog.csdnimg.cn/blog_migrate/0facc5201b2af2465b7ec7d8cfaed356.jpeg)
Order by需要在where的后面,常用运算符如下
">"大于
">="大于等于
"
"<="小于等于
"<>"和"!="都是不等于
"="等于
4.14查看薪水在1500到2500元之间的员工信息并且按照薪水排序
SQL> select ename,sal from emp where sal between 1500 and 2500 order by sal;
![510494f8baac270d2e7806a44ed6a49c.png](https://i-blog.csdnimg.cn/blog_migrate/55631d575a7e3f583e7ebd281437401a.jpeg)
between…and…用于条件where之中,表示数值介于两个数值之间,这里表示是工资在1500-2500之间。
4.15查询拿保底工资的销售人员
SQL> select empno,ename,job,sal from emp where job='SALESMAN' and sal=1250;
![0acce408eaeed8db7c752981bd009206.png](https://i-blog.csdnimg.cn/blog_migrate/7a0539a2fa097dd6597a769b62523bf0.jpeg)
where条件中的and表示"而且"的意思,即条件既要是销售人员,而且工资也是1250元的员工。
4.16查看没有奖金及工资少于1500元的员工
SQL> select empno,ename,job,sal,comm from emp where comm is null or sal<=1500;
![165a3d4aa71c4228323f74df8b08a49d.png](https://i-blog.csdnimg.cn/blog_migrate/83b3662ab890f540fdbaaaadbae80469.jpeg)
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);
![33da8b968fef5cc7e86a678dcc40350f.png](https://i-blog.csdnimg.cn/blog_migrate/afd6620b1ae580364cd7acc6b94297a8.jpeg)
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%';
![ba2d0a81f3295d2bcbbb532cb5ee895c.png](https://i-blog.csdnimg.cn/blog_migrate/05d5a71753b1cca0f525d35ead0091c6.jpeg)
Like 是条件where中模糊查询的关键字,后面的字符串需用双单引号括起来,%在SQL语句中表示字符后面的所有字符,其中M%表示以M开头的所有字符。
4.21查询哪些员工属于销售人员、分析师、管理人员。
SQL> select ename,job from emp where job in ('SALESMAN','ANALYST','MANAGER');
![fc6c50a7bceb728fb5a23ef36bdf4f12.png](https://i-blog.csdnimg.cn/blog_migrate/218ff9687065b6819264bad44f1553d1.jpeg)
in 表示在某个列中存在多个值均符合,或者使用or代替也可。
下面用or来代替上面的SQL语句,同时看看有哪些不一样。在oracle数据库的命令窗口输入下面的SQL语句:
SQL> select ename,job from emp where job='SALESMAN' or job='ANALYST' or job='MANAGER';
![5c3d5cffe1980365e2d197cbe2e81c00.png](https://i-blog.csdnimg.cn/blog_migrate/6304c40ab546fc2209a847bafd8da4e4.jpeg)
4.22统计公司每个岗位都有多少个员工
SQL> select job,count(*) from emp group by job;
![a22060691b121522450b733bb8a63818.png](https://i-blog.csdnimg.cn/blog_migrate/8c8f959e8cf5d3f1e00c742ba253832c.jpeg)
group by 是oracle数据库中的分组函数,可以这样理解,按照工作职位进行分组,然后统计每个职位的人数。
Count(*)是统计数量的函数,这里统计公司每个岗位都有多少人。
4.23统计公司每个岗位都有多少个员工,并按数量进行排序。
SQL> select job,count(*) from emp group by job order by count(*);
![2e00d62da49c71100980262ea698875f.png](https://i-blog.csdnimg.cn/blog_migrate/62365c000d409a5fe8e504f5a5fa0a8e.jpeg)
4.24统计公司每个部门有哪些员工,并按照部门号进行排序。
SQL> select deptno,count(*) from emp group by deptno order by deptno;
![a82751bebc4aa4aa327239f5e5c7ba6c.png](https://i-blog.csdnimg.cn/blog_migrate/29417e8c195418cecd1fd56b93f14d23.jpeg)
从图中可以看到,10号部门有3人,20号部门有5人,而30号部门有6人。
4.25求公司总共支付员工的薪水
SQL> select sum(sal)+sum(nvl(comm,0)) from emp;
![f4795e3bc3a7c9615c0d97839f6c90c1.png](https://i-blog.csdnimg.cn/blog_migrate/7f65acad8479f5488fc8e914b38f3c9d.jpeg)
sum 是Oracle数据库内部的一个函数,即所有数值之和。
4.26求公司员工的平均工资
SQL> select round(avg(sal),2) from emp;
![68deb68c8abc7a5d45f7baa3d7ca4455.png](https://i-blog.csdnimg.cn/blog_migrate/6e0514631f8ec41795a9925fefa7946c.jpeg)
avg是oracle数据库的求平均值函数。
![f801bfd6cec586385a33a9b90deb2908.png](https://i-blog.csdnimg.cn/blog_migrate/99a128c9da070d8d78d3e0e78b906f1f.jpeg)
4.27统计公司所有员工中最高、最低、工资及相差多少
SQL> select max(sal),min(sal),max(sal)-min(sal) from emp;
![164ea97aef5d0537da53f3a4e9b468a3.png](https://i-blog.csdnimg.cn/blog_migrate/0c9a4968a38f1e01c8f5ec6699647369.jpeg)
max 是Oracle数据库内部的函数,专门统计最大的数值
min 是Oracle数据库的内部函数,专门统计最小的数值
4.28列出平均工资大于2500的岗位
SQL> select job,avg(sal) from emp having avg(sal)>2500 group by job;
![f26c5c9d88ebaaefbe9e3e03efd74ef8.png](https://i-blog.csdnimg.cn/blog_migrate/ce6cb3732931c73095d6e2c852eaffd6.jpeg)
having 在使用group by分组时,如有条件限制需要使用having,而不能使用where.即在group by中所对应的条件限制为having,上面的例子中数据库首先使用group by进行岗位分组,再使用avg(sal)求出每个岗位的平均工资,最后平均工资大于2500元由having进行限制。