用例

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. 据说电脑上可以刷朋友圈啦!又多了个上班摸鱼的途径?
  2. failed to open log file_log日志功能及设置方法
  3. 【Linux】一步一步学Linux——Centos7.5安装图解(08)
  4. eclipse加载maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-plugin:2.4.3解决方案...
  5. 领域应用 | 智能导购?你只看到了阿里知识图谱冰山一角
  6. 解决svn cannot set LC_CTYPE locale的问题
  7. BBED for PostgreSQL
  8. 物理渲染-基于物理的光照模型
  9. linux查看磁盘挂载dntf,从Windows设置Linux服务器的公钥认证(ppk私钥)
  10. 深入理解设计模式-建造者模式(生成器模式)
  11. VMware tools 安装失败
  12. android 动态磁贴,善用动态磁贴和Xbox游戏
  13. HBuilder(H5+App)中集成腾讯云通信IM功能
  14. 前端 Vue 浏览器调试工具 Vue.js devtools 安装
  15. 一元三次方程求根公式详细逐步推导
  16. JAVA个版本新特性
  17. 英语新闻听力之专有名词
  18. PHP的ereg()与eregi()的不同及相同点。对比
  19. 【开发日志-已归档】2021-06
  20. 计算机网络ppp,计算机网络 第7章 PPP和Internet接入.ppt

热门文章

  1. Cisco Firepower 1000 Series FTD Software 7.2.0 ASA Software 9.18.1
  2. Albumentation库 bbox使用案例代码
  3. Oracle分区表概述、分类、使用方法及注意事项
  4. 【牛客网-前端笔试题】——Javascript专项练习
  5. 《你好啊,程序员》学习笔记
  6. 这10个小技巧,让你的Python数据分析加速50%!
  7. 【胖张】献给跟我一样的菜鸟
  8. 引入echarts的js文件报错——Cannot read properties of null (reading ‘getAttribute‘)
  9. 纳米金颗粒修饰核酸产品|碳纳米管载核酸-DNA/RNA材料|解析说明
  10. displaytag用法总结