用例

drop table stuInfo;
drop table course;
drop table score;drop sequence seq_stuid;
drop sequence seq_cid;
drop sequence seq_scid;create table stuinfo(        --学生stuid int primary key,sname varchar2(50) unique,age int not null constraint CK_sage check(age>=18 and age<=30),addr varchar2(50),sex char(2) default 'M'constraint CK_sexs check(sex in('M','F'))
);create sequence seq_stuid start with 10001 increment by 1;create table course(        --科目cid int primary key,cname varchar2(50)
); create sequence seq_cid start with 10001 increment by 1;create table score(      --成绩scid int primary key,stuid intconstraint FK_stuid references stuinfo(stuid),courseid intconstraint FK_courseid references course(cid),score int
);create sequence seq_scid start with 10001 increment by 1;insert into course values(seq_cid.nextval,'J2EE精讲');
insert into course values(seq_cid.nextval,'Oracle');
insert into course values(seq_cid.nextval,'html网页设计');
insert into course values(seq_cid.nextval,'Java基础');insert into stuinfo values(seq_stuid.nextval,'张果老',22,null,'M');
insert into stuinfo values(seq_stuid.nextval,'李豹',22,null,'M');
insert into stuinfo values(seq_stuid.nextval,'老胡',22,'北京','M');
insert into stuinfo values(seq_stuid.nextval,'老江',24,'湖南','M');
insert into stuinfo values(seq_stuid.nextval,'张无忌',26,'衡阳','M');
insert into stuinfo values(seq_stuid.nextval,'二师兄',28,'长沙','M');
insert into stuinfo values(seq_stuid.nextval,'凤姐',24,'上海','F');
insert into stuinfo values(seq_stuid.nextval,'元芳',28,'上海','M');
insert into stuinfo values(seq_stuid.nextval,'离歌',23,'上海','M');
insert into stuinfo values(seq_stuid.nextval,'八戒',24,'上海','M');
insert into stuinfo values(seq_stuid.nextval,'赵柳',22,'北京','F');insert into score values(seq_scid.nextval,10005,10001,95);
insert into score values(seq_scid.nextval,10005,10002,58);
insert into score values(seq_scid.nextval,10005,10003,56);
insert into score values(seq_scid.nextval,10005,10004,81);
insert into score values(seq_scid.nextval,10005,10002,80);insert into score values(seq_scid.nextval,10001,10001,78);
insert into score values(seq_scid.nextval,10001,10003,81);
insert into score values(seq_scid.nextval,10001,10004,92);insert into score values(seq_scid.nextval,10002,10003,30);
insert into score values(seq_scid.nextval,10002,10003,78);
insert into score values(seq_scid.nextval,10003,10003,66);
insert into score values(seq_scid.nextval,10004,10003,66);
insert into score values(seq_scid.nextval,10006,10003,78);
insert into score values(seq_scid.nextval,10007,10003,76);
insert into score values(seq_scid.nextval,10008,10002,81);
insert into score values(seq_scid.nextval,10009,10002,90);
insert into score values(seq_scid.nextval,10010,10003,42);insert into score values(seq_scid.nextval,10002,10001,80);
insert into score values(seq_scid.nextval,10004,10002,78);
insert into score values(seq_scid.nextval,10008,10003,69);
insert into score values(seq_scid.nextval,10008,10001,69);select * from stuinfo;
select * from course;
select * from score;

操作

--聚合函数 多行函数
--求员工的最高底薪,最低底薪,平均底薪和底薪总和
select max(sal),min(sal),avg(sal),sum(sal) from emp;--按部门统计,每个部门的最高底薪,最低底薪,平均底薪和底薪总和
select de.dname,ep.ename from emp ep,dept de where de.deptno = ep.deptno group by de.dname,ep.ename;select deptno,max(sal),min(sal),avg(sal),sum(sal) from emp group by deptno;--all 查询某列所有的值
--查询所有学生的地址
select all addr from student;--distinct 过滤重复数据
--统计学生来自哪个地区
selelct distinct addr from student--count 统计总共有多少个学生
select distinct count(*) from student--统计学生来自多少个地区
select count(distinct addr) from student--其他函数
--为空赋值函数
--查询学生姓名和地址,如果地址为空则显示地址不详
select sname,nvl(addr,'地址不详') 地址 from student--取值条件
--查询学生姓名和性别,如果是男则显示m,如果是女,则显示f
select sname,case sex when '男' then 'M' when '女' then 'F' end '性别' from student;
select sname,decode(sex,'男','M','F') 性别 from student;--显示部门信息,如果是ACCOUNTING则显示会计部,如果是RESEARCH则显示研发部,如果是SALES则显示销售部,如果OPERATIONS则显示市场部,否则显示行政部
select deptno,deptno(dname,'ACCOUNTING','会计部','RESEARCH','研发部') from dept;--分析函数
--排序
--语法: order by 列名1 [desc/asc],列名 [desc/asc]
--问题--按学号名排序
select * from student order by sid;--按学号降序排序
select * from student order by sid desc;
--升序则asc--row_number() 排序:如果排序字段的值相等,序号也不中断 1,2,3,4,5,6,7
select empno,ename,sal,job,row_number() over(order by sal desc) from emp--RANK 具有相等值的行排位相同,序数随后跳跃 1、2、2、4、5、5、7
select empno,ename,sal,job, RANK() over(order by sal desc) from emp;--DENSE_RANK 具有相等值的行排位相同,序号是连续的 1、2、2、3、4、5、5、6、7
select empno,ename,sal,job,DENSE_RANK() over(order by sal desc) from emp;--分页查询
/*rownum:1.ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM。ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。2.如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。select empno,ename from emp where rownum>2                    */select * from student where sid=1001;select * from student where rownum=2;/*3.那如何才能找到第二行以后的记录呢?可以使用子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。 select * from (select rownum no,empno,ename from emp) where no>2;  */select * from (select rownum no,sname from student) where no>2/*4.如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录。  select rownum,empno,ename from emp where rownum <3;     */select * from student where rownum>3;/*5.综上几种情况,可能有时候需要查询rownum在某区间的数据,可以看出rownum对小于某值的查询条件是为true的,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们可以写以下语句,先让它返回小于等于3的记录行,然后在主查询中判断新的rownum的别名列大于等于2的记录行。但是这样的操作会在大数据集中影响速度。select * from (select rownum no,empno,ename from emp where rownum<=3 ) where no >=2;  */select * from emp; --ROWNUM是一个序列--进行第一次筛选   <最大值 10select a.*, rownum from (select * from emp) a where rownum<=10;--注意a表示查询结果的别名--进行第二次筛选select * from(select a.*,rownum rn from(select * from emp) a where rownum<=10) where rn>=5;
--查出所有姓'张'的学员信息
select * from stuInfo where sname like '张%';--查出所有addr字段为'NULL'值的学员的信息
select * from stuInfo where addr is null;--查出成绩在60到70分之间的学员的id号
select stuid from score where score between 60 and 70;--查出地址是北京和上海的学生的信息
select * from stuInfo where addr in('北京','上海');
select * from stuInfo where addr='北京' or addr='上海';--查出成绩在60到70分之间的学员的姓名和分数
select sname,score from stuInfo sf,score sc where sf.stuid=sc.stuid and score between 60 and 70;/*
种类:
1.内联结(inner join): 仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行. 内联接消除与另一个表中任何不匹配的行.
2.外联结:外联接会返回from子句中提到的至少一个表的所有行,只要这些行符合任何where或having条件。左外联接 left join:左边表中所有的行,右边表中没有的字段用null代替。右外联接 right join:右边表中所有的行, 左边表中没有的字段用null代替。完整外联结 full join:两表数据都返回,没有的地方用null代替。
3.交叉联结(cross join)
*/--内联结语法:select 列名  from 表名 inner join 表名2 on 联结条件
--案例: 显示课程名及成绩
select cname,score from course cs inner join score sc on cs.cid=sc.courseid;--左外联接语法: select 列名 from 表名1 left join 表名2 on 联结条件
--特点: 优先查出表名1中所有的符合条件的数据,如果表名2中没有这个对应的数据,则用NULL填充值
--案例描述: 学生表中有一位学员1号'赵柳',没有参加过任何考试,下面请查出所有没有参加过任何考试的学员
select * from stuInfo sf left join score sc on sf.stuid=sc.stuid where score is null;--右外联接与左外联接正好相反:
select * from stuInfo sf right join score sc on sf.stuid=sc.stuid where score is null;--完整外联接
select * from stuInfo sf  join score sc on sf.stuid=sc.stuid;--交叉联接:左表中的每一行与右表中的每行都组合成。笛卡尔乘积=左表数据行*右表数据行
select * from stuInfo cross join score;
select * from dept;
select * from emp;
select * from dept cross join emp;--56条--right join:以right join关键字右边的表为基准表,也就是右边表中有的数据全部显示,
--左边表中没有对应的数据时,显示为空
select * from stuInfo sf right join score sc on sf.stuid=sc.stuid;
select * from stuInfo sf right join score sc on sf.stuid=sc.stuid;insert into stuInfo values(seq_stuid.nextval,'周星驰',22,null,'M');--显示学生姓名,课程名及成绩
select sname,cname,score from stuInfo sf inner join score sc on sf.stuid=sc.stuid inner join course cs on cs.cid=sc.courseid;--查询所有学生的姓名、课程名和成绩,如果该生没有参加过任何考试,也需显示出来
select sname,cname,score from stuInfo sf full join score sc on sf.stuid=sc.stuid full join course cs on cs.cid=sc.courseid;--查出学员在'Oracle'这门课程中的总成绩和平均成绩,最高分数,最低分数
--连接查询
select '连接查询',sum(score),avg(score),max(score),min(score) from score sc,course cs where sc.courseid = cs.cid and cs.cname='Oracle';--嵌套查询
select '连接查询',sum(score),avg(score),max(score),min(score) from score sc where sc.courseid = (select cid from course cs.cname='Oracle');--内联查询
select '连接查询',sum(score),avg(score),max(score),min(score) from score sc inner join course cs on sc.courseid=cs.cid where cs.cname='Oracle';--查询每门课程的平均成绩,显示课程名称,平均分
select cname,avg(score) from course cs,score sc where sc.courseid = cs.cid group cname;--查出学员在'html网页设计'这门课程中不及格的学生人数
select count(*) 不及格人数 from course cs,score sc where sc.courseid=cs.cid and cs.cname='html网页设计' and sc.score<60;

【Oracle】学习笔记(五)高级查询相关推荐

  1. MySQL学习笔记-03高级查询、多表联合查询、聚合函数、子查询、视图、存储过程、权限、

    关于作者 金山老师:从事Java.大数据.Python职业化培训6年,项目管理.软件开发14年.欢迎添加我的微信号[jshand],最近建了一些微信交流群,扫描下方二维码添加公众号,回复:进群 文章目 ...

  2. oracle 5表关联查询,Oracle学习笔记5 - 表查询

    Oracle学习笔记五 --- 表查询  下面使用scott用户,用到的表见底部 1.查看表结构 desc [表名] desc emp 2.distinct命令,去除重复行 3.练习 查找SMIT ...

  3. mysql的sqlyog学习笔记(高级查询部分)(代码用命令行显示 )

    索引 分组查询 简单分组 可以实现分组前的筛选 可以实现分组后的筛选 可以实现排序 按多个字段分组 连接查询(SQL99语法) 内连接 语法: 等值连接 简单查询 添加筛选条件 添加分组+筛选 添加分 ...

  4. Oracle学习笔记(七)——分组统计查询

    Oracle学习笔记(七)--分组统计查询 基础统计函数的使用 分组统计操作的实现,结合多表查询使用分组统计 常用统计函数 COUNT(*|[DISTINCT]字段) MAX(字段,日期或数字) MI ...

  5. StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

    StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 原文: StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 Connec ...

  6. Oracle学习笔记 字符集概述

    Oracle 学习笔记 字符集概述 这节课开始讲oracle里面的字符集 偏重于原理和简单的一些判断以及实现 字符集它涉及到很多的东西 比如建库和操作系统环境 这节课把字符集的原理性的东西以及常见的操 ...

  7. oracle学习笔记 Oracle体系结构概述

    oracle学习笔记 Oracle体系结构概述 从这节开始,开始讲oracle数据库体系结构. 首先从总体上,从概述上把oracle整体的体系结构讲一下, 然后接下来的时间我们会一块一块的将oracl ...

  8. oracle update单引号,Oracle学习笔记:update的字段中包括单引号

    平时update的时候直接更改字段内的值,例如: update table_temp set name = 'Hider' where id = 100; 但更新后的值中包括单引号,则不能按以上方式进 ...

  9. oracle学习笔记 参数文件及数据库的启动和关闭

    oracle学习笔记 参数文件及数据库的启动和关闭 我们这节课把oracle的参数文件以及oracle的启动关闭讲一下 一)参数文件作用 先看oracle的参数文件 它由来已久了 我们知道oracle ...

  10. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

最新文章

  1. DG环境数据库RMAN备份策略制定
  2. 计算机硬件的基本组成概述
  3. java 向下转型_Java_向下转型
  4. 主c++ 辅lua luabind protobuf
  5. css3 点击爆炸下落
  6. Intellij IDEA + Maven + Cucumber 项目 (三):简单解释RunCukesTest.java
  7. 【51单片机快速入门指南】9:省电模式(低功耗)
  8. Dual-arm cooperation and implementing for robotic harvesting tomato using binocular vision(摘西红柿机器人)
  9. sql server datetime取年月_快速定位数据库性能问题,RDS推出慢SQL统计分析
  10. [轉]function, new function, new Function
  11. 排序算法之 归并排序
  12. 华为宣布了,鸿蒙 OS 2.0 开放源代码
  13. 开发步骤_社交app开发步骤,送给不懂app开发的你
  14. C++机器学习经典资料
  15. PHP数据库CURD接口与实现(接口实战)
  16. 912. 排序数组(中等 各种排序 数组)
  17. 【sv】局部数据存储: 自动存储vs静态存储
  18. 蘑菇街面经(自己的第一次秋招面试)
  19. 【Datawhale组队学习Pytorch】Task 完结篇
  20. post和get传参(重点)

热门文章

  1. 2022年湖南省自考考试学前儿童发展练习题及答案
  2. JAVA-数据结构与算法-修路问题(普里姆算法)和公交站问题(克鲁斯卡尔算法)
  3. 无偿分享 简单易用 贝茨训练法 调节睫状肌 近视恢复训练
  4. 好记性不如烂笔头——Vuex篇
  5. 1003. 我要通过!
  6. 《弃子长安》第八章 昨日黄花
  7. 夕阳桥断 Linux(centos6.5)下安装jenkins Jenkins 的前身是 Hudson 是一个可扩展的持续集成引擎。 通俗的来讲,jenkins就是一个可以实现自动化部署的一个插
  8. nyist120 校园网络 (Tarjan算法 / 强连通分量)
  9. STUFF函数介绍及使用场景
  10. case zhen语句_SQL中的条件判断语句(case when zhen if,ifnull)用法