Oracle 学习第四篇

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 中。

时间: 2024-10-17 06:07:27

Oracle 学习第四篇的相关文章

Oracle学习(十四):管理用户安全

--用户(user) SQL> --创建名叫 grace 密码是password 的用户,新用户没有任何权限 SQL> create user grace identified by password; 验证用户: 密码验证方式(用户名/密码) 外部验证方式(主机认证,即通过登陆的用户名) 全局验证方式(其他方式:生物认证方式.token方式) 优先级顺序:外部验证>密码验证 --权限(privilege) 用户权限有两种: System:允许用户执行对于数据库的特定行为,例如:创建表.

Oracle学习(四)_SQL函数

--第一部分:SQL基础 --ch1 简单查询 --ch2 查询基本概念 --ch3 数据过滤 --第二部分:多表操作 --ch4 集合理论 --ch5 内连接 --ch6 外连接 --ch7 子查询 --第三部分:数据分组 --ch8 简单统计 --ch9 数据分组 --ch10 分组数据过滤 --第四部分:SQL函数 --ch11 内置函数 --ch12 case表达式 --第五部分:DML语句 --ch13 插入数据 --ch14 修改数据 --ch15 删除数据 ------------

从.Net到Java学习第四篇——spring boot+redis

从.Net到Java学习第一篇——开篇 从.Net到Java学习第二篇——IDEA and start spring boot 从.Net到Java学习第三篇——spring boot+mybatis+mysql 接上一篇,本篇使用到的框架redis.FastJSON. 环境准备 安装redis,下图是我本机的redis绿色版,你可以网上自行下载安装,如果不知道如何怎么操作,可以移步到我的另一篇文章:ASP.NET Redis 开发 以管理员身份打开CMD窗口: C:\Users\zouqj>e

Oracle学习(四)之用户、权限、角色管理

Oracle 权限设置一.权限分类:系统权限:系统规定用户使用数据库的权限.(系统权限是对用户而言).实体权限:某种权限用户对其它用户的表或视图的存取权限.(是针对表或视图等数据库对象而言的). 二.系统权限管理:1.系统权限分类: DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构. RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构. CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构

玩转oracle学习第四天

1.上节回顾 2.数据库管理员 3.数据库的逻辑备份与恢复 4.数据字典和动态性能视图 5.管理表空间和数据文件 1.了解oracle管理员的基本职责 2.掌握备份和恢复数据库/表的方法 3.理解表空间,数据字典,性能视图数据库管理员dba,对于一个小的数据库,一个dba就够了,但是对于一个大的数据库可能需要多个dba分别担负不同的管理职责,一个dba的主要工作: 职责: (1)安装和升级oracle数据库 (2)建库,表空间,表,视图,索引 (3)制定并实施备份与恢复计划 (4)数据库权限管理

Oracle学习第三篇—多行函数

0 order by asc/desc 默认升序 order by 列的名字|表达式|别名|序号 把空放在后边:order by desc nulls last 1分组函数--会自动滤空值 count(*|distinct|clumn) max min sum avg select sum(comm)/count(*) 一, sum(comm)/count(comm) 二,avg(comm) 三from emp 2 过滤解决,空值替换函数,NVL(comm,0) 1 select count(*

Oracle 学习笔记(四)

一.高效 SQL 语句原则 在where 中用 = 关系运算时 避免用函数在关系运算中,除非你使用函数建立索引 尽量不要隐式转化数据类型,数据类型一定要匹配 尽量将一句SQL分成多个语句完成 不能差分的请用UNION ALL 来组合 条件确定的子查询  Exist 适合于外表小,内表大    in  适合于外表大,内表小 使用视图的注意事项 复杂视图的连接要小心,尤其有外键的时候 当查询的是视图中引用的部分表的时候,请不要使用视图,或者建立新的更小的表 存储中间结果 对查询中可能多次调用的结果集

MongoDB学习第四篇 --- Query操作

一.shell执行mongodb查询(简单json数据结构) 查询所有:db.inventory.find() 按条件查询:db.inventory.find( { status: "D" } ) in条件查询:db.inventory.find( { status: { $in: [ "A", "D" ] } } ) and和范围条件查询:db.inventory.find( { status: "A", qty: { $l

oracle 学习(四)游标

显式游标 隐式游标:如果在PL/SQL程序段中使用SELECT语句进行操作,PL/SQL 会隐含的处理游标定义,即为隐式游标.这种游标不需要像显式那样声明,也不必打开关闭. 1 CREATE OR REPLACE PROCEDURE CX_XM 2 (in_xh IN char,out_xm OUT varchar2) 3 AS 4 BEGIN 5 SELECT 姓名 INTO out_xm 6 FROM XSB 7 WHERE 学号=in_xh AND ROWNUM=1; 8 DBMS_OUT