代码改变世界

Oracle 学习第四篇

2017-11-07 11:42  你若安好!  阅读(227)  评论(0编辑  收藏  举报

Day04-Oracle查询基础

学习目标:
 修改数据
 删除数据
 简单查询
 条件查询
 分组查询

oracle修改数据
使用update语句修改表中数据。
Update 语句基本语法:

update 表名 set 列名=表达式 [,列名2=表达式 2,...][where 条件];

注意事项:
1、update语法可以用新值更新原有表行中的各列;
2、set子句指示要修改哪些列和要给予哪些值;
3、where子句指定应更新哪些行。如没有 where子句,则更新所有的行。(特别小心)

对 students 中的数据进行修改
将张三的性别改成女
SQL>update students set sex='女' where name='张三';
把张三的奖学金改为 10
SQL>update students set fellowship=10 where name='张三';
把所有人的奖金都指高 10%
SQL>update students set fellowship=fellowship*1.1;
将没有奖学金同学的奖学金改成 10 元
SQL>update students set fellowship=10 where fellowship is null;
特别注意:当修改空记录时应用 is null 而不能使用=null 或=''

oracle表的管理--删除数据
基本语法:
delete from TABLENAME [where where_definition];
delete from 表名 [where 条件表达式];
注意事项:
1、如果不使用 where 子句,将删除表中所有的数据。(特别注意)
2、delete语句不能删除某一列的值(可使用 update)。
3、使用 delete语句仅删除记录,不删除表本身。如要删除表,使用 drop table 语句。
4、同 insert 和 update 一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据
时,头脑中应始终不要忘记这个潜在的问题。

删除的几种方法比较:
delete from 表名;
删除所有记录,表结构还在,写日志,可以恢复的,速度慢
drop table 表名;
删除表的结构和数据
delete from student where xh='A001';
删除一条记录
truncate table 表名;
删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。

设置保存点
savepoint 保存点名称;
回滚
rollback to 保存点名称;
特别注意:设置保存点及回滚操作是配合 delete语句使用,用来找回使用 delete删除的数据。而通过
truncate 删除的表数据是无法通过此方法找回的。
建议:
在使用 delete删除表数据前使用 savepoint 设置保存点,防止数据误删除。

oracle表基本查询基础
scott用户存在的几张表(emp,dept,salgrade)为大家演示如何使用 select语句,select语
句在软件编程中非常的有用,希望大家好好的掌握。
1).EMP员工表

2)DEPT部门表

3)SALGRADE 工资级别表

基本 select语句
基本语法:
select [是否剔除重复数据] *|{字段名(列名),字段名 2(列名 2),字段名 3(列名 3)..} from 表名 [where {条
件}];

注意事项:
1、select 指定查询哪些列的数据;
2、column 指定列名;
3、*代表查询所有列;
4、from指定查询哪张表;
5、distinct 可选,指显示结果时,是否剔除重复数据;
6、where条件。

简单的查询语句
1)查询所有列
SQL>select * from 表名;

2)查询指定列
SQL>select 列 1,列 2,列 3,.. from 表名;

3)如何取消重复行
SQL>select distinct deptno,job from emp;

4)查询 SMITH 的薪水,工作,所在部门
SQL>select sal,job,deptno from emp where ename='SMITH';

特别注意:
oracle 对 sql 语句不区分大小写,但对查询内容区分大小写。这与 sqlserver 是有区别的,sqlserver
对查询内容不区分大小写。

使用算数表达式
1)显示每个雇员的年工资
SQL>select ename,sal*13+nvl(comm,0)*13 from emp;

2)使用列的别名
SQL>select ename "姓名",sal*13+nvl(comm,0)*13 "年收入" from emp;
SQL>select ename 姓名,sal*13+nvl(comm,0)*13 年收入 from emp;
SQL>select ename as "姓名",sal*13+nvl(comm,0)*13 as "年收入" from emp;
特别注意:
oracle 在使用别名时,可以用双引号或不使用或使用 as 来表明别名。但不能使用单引号。sqlserver
是可以使用双引号、单引号。

如何处理 null值
nvl函数:oracle 提供的函数,是用于处理 null 值使用的。
例子:查询年薪
SQL>select ename,sal*13+nvl(comm,0)*13 from emp;
nvl(值 1,值 2) 解释:nvl 值 1为 null 时则取值 2,值 1 不为 null 时则取值 1 原值。

如何连接字符串(||)
在查询的时候,希望把多列内容做为一列内容返回可以使用||连接符。
例子:查询年薪
SQL>select ename ||'年收入'||(sal*13+nvl(comm,0)*13) "雇员的年收入" from emp;


使用 where子句
1)如何显示工资高于 3000的员工
SQL>select ename,sal from emp where sal>3000;

2)如何查找 1982.1.1 后入职的员工
SQL>select ename,hiredate from emp where hiredate>'1-1 月-82';
也可以使用 to_char 函数转换日期类型后再进行日期比较,如下:
SQL>select ename,hiredate from emp where to_char(hiredate,'yyyy-mm-dd')>'1982-1-1';
字符对比还是有一定出入的。不推荐使用。

3)如何显示工资在 2000 到 2500的员工情况
SQL>select * from emp where sal>=2000 and sal<=2500;
SQL>select * from emp where sal between 2000 and 2500;
说明: between 是指定区间内取值,如:between 2000 and 2500,取 2000 至 2500 内的值,同时包含
2000 和 2500

如何使用 like操作符
%:表示任意 0 到多个字符
_:表示任意单个字符

1)如何显示首字符为 S的员工姓名和工资
SQL>select ename,sal from emp where ename like 'S%';

2)如何显示第三个字符为大写 O的所有员工的姓名和工资
SQL>select ename,sal from emp where ename link '__O%';

在 where条件中使用 in
如何显示 empno为 123,345,800...的雇员情况
SQL>select * from emp where empno=123 or empno=345 or emp=800;
SQL>select * from emp where empno in(123,345,800);

使用 is null的操作符
如何显示没有上级的雇员的情况
SQL>select * from emp where mgr is null;

使用逻辑操作符号
查询工资高于 500或是岗位为 manager 的雇员,同时还要满足他们的姓名首写字母为大写的 J
SQL>select * from emp where (sal>500 or job='MANAGER') and (ename like 'J%');

使用 order by子句
1)如何按照工资的从低到高的顺序显示雇员的信息
SQL>select * from emp order by sal asc;
注意:asc写或不写都是升序排序即从小到大排序,desc则是降序排序从大到小排序。

2)按照部门号升序而雇员的入职时间降序排列
SQL>select * from emp order by deptno,hiredate desc;

3)使用列的别名排序
SQL>select ename,sal*12 "年薪" from emp order by "年薪" asc;
别名需要使用“”号圈中。

Oracle 分组查询
在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据;要用到分
组函数max,min,avg,sum,count。

Max(),min()最大最小
如何显示所有员工中最高工资和最低工资
SQL>select max(sal) "最高工资",min(sal) "最低工资" from emp;

请查询最高年工资
SQL>select max(sal*13+nvl(comm,0)*13) "最高年工资",min(sal*13+nvl(comm,0)*13) "最低年工资" from
emp;

Avg()求平均
显示所有员工的平均工资和工资总和
SQL>select avg(sal) "平均工资",sum(sal) "工资总和" from emp;
特别注意:
avg(sal)不会把 sal 为 null 的行进行统计,因此我们要注意,如果,你希望为空值也考虑,则我们可以
这样做
SQL>selec sum(sal)/count(*) from emp;

count(*)求总数
计算共有多少员工
SQL>select count(*) "共有员工" from emp;


练习题:
请显示工资最高的员工的名字,工作岗位
SQL>select ename,job from emp where sal=(select max(sal) from emp);
特别注意:select 语句执行的顺序是从右向左执行,正好和书写的方式相反。
SQL>select ename,job from emp where sal=(select max(sal) from emp);
oracle 会先执行 select max(sal) from emp 这个语句,得出最大工资后。再执行 where 条件前的语句。

请显示工资高于平均工资的员工信息
SQL>select * from emp where sal>(select avg(sal) from emp);
SQL>select * from emp where sal>(select sum(sal)/count(*) from emp);

group by和 having子句
group by:用于对查询的结果分组统计;
having 子句:用于限制(过滤)分组显示结果。

1)如何显示每个部门的平均工资和最高工资
SQL>select avg(sal) "平均工资",max(sal) "最高工资",deptno "部门编号" from emp group by deptno;

2)显示每个部门的每种岗位的平均工资和最低工资
SQL>select avg(sal) "平均工资",min(sal) "最低工资",job "职位",deptno "部门编号" from emp group by
deptno,job order by deptno;

3)显示部门平均工资低于 2000 的部门号和它的平均工资
SQL>select avg(sal) "平均工资",deptno "部门编号" from emp group by deptno having avg(sal)<2000;

对数据分组的总结:
1、分组函数(avg...)只能出现在选择列表、having、order by子句中;
2、如果在 select 语句中同时包含有 group by/having/order by 那么他们的顺序是 group by/having/order
by;
3、在选择列中如果有列、表达式和分组函数,那么这些列和表达式必需有一个出现在 group by 子句
中,否则会出错。
如 select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000;
这里 deptno 就一定要出现在 group by 中。