(21)Oracle表查询进阶
转到基本查询
一、多表查询
笛卡尔积:每张表的列数相加,行数相乘。
连接条件:得出笛卡尔积后需要用where条件筛选出正确的数据。连接条件至少需要n张表减1个
1.等值连接
连接条件为等号
select t1.a,t1.b,t1.c,t2.d from table t1,t2 where t1.c=t2.c
2.不等值连接
select t1.a,t1.b,t1.c,t2.d from table t1,t2 where t1.c between t2.e and t2.f --between and 小值在前,大值在后
3.外连接(把对于连接条件不成立的数据包含在最近的结果中)
SELECT 语句必须拥有相同数量的列,相似的数据类型,和相同的顺序。这种条件下能合并表
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
union 去重,union all不去重
inner join(join)内连接
左外连接:当连接条件不成立时,等号左边的表依然被包含在结果中
left join
右外连接:当连接条件不成立时,等号右边的表依然被包含在结果中
right join
full join
4.自连接
一张表起两个别名,当做两张表来用。
自接连不适合查询大表
5.层次查询
对于树型结构的单表查询
select * from table connect by 上一层字段=本层字段 start with 分支的定点字段=xxx;
如果从根节点开始查询还可以写成 : start with 上层字段 is null
select * from table connect by 上一层字段=本层字段 start with 上层字段 is null;
注意 :上层字段和本层字段是不同的两个列
二、行转列
先建表,插入数据
create table fruits(id int,name varchar(20),place varchar(20),amount int); ---- 创建表
/
insert into fruits values(1, '苹果','河北', 1000);
/
insert into fruits values(2, '苹果','浙江', 1000);
/
insert into fruits values(3, '苹果','河北', 1000);
/
insert into fruits values(4, '橘子','浙江', 1000);
/
insert into fruits values(5, '橘子','河北', 1000);
/
insert into fruits values(6, '葡萄','浙江', 1000);
/
insert into fruits values(7, '芒果','浙江', 1000);
/
insert into fruits values(8, '芒果','浙江', 1000);
/
行转列sql
select * from (select PLACE,NAME,AMOUNT from FRUITS) pivot (sum(AMOUNT) for NAME in('苹果','橘子' as 橙子,'葡萄' 葡萄))
pivot(聚合函数 for 列名 in(类型)
等同于
WITH t AS (SELECT PLACE, NAME, AMOUNT FROM FRUITS)
SELECT *
FROM t PIVOT (SUM (AMOUNT)
FOR NAME
IN ('苹果', '橘子' AS 橙子, '葡萄' 葡萄))
使用 with as 的原因:1优化速度 2方便阅读
三、条件控制
SELECT name,
score,
CASE --如果
WHEN score >= 90 THEN '优' --当...那么...
WHEN (80 <= score AND score < 90) THEN '良'
WHEN (60 <= score AND score < 80) THEN '中'
ELSE '差'
END --结束
AS 评价
FROM student
WHERE 1 = 1
ORDER BY score DESC
四、分组查询
分组函数
1.avg()平均(avg函数会过滤掉空值), sum()求和
select avg(字段名) ,sum(字段名) from table
2.min()最小值,max()最大值
select min(字段名), max(字段名) from table
3.count()统计个数
select count(*) from table
select count(字段名) from table
select count( distinct 字段名) from table --去掉某字段重复数据后,再统计行数
4.nvl() 为空时替换
select count(nvl(字段名,0)) from table --当字段名有数据为空时,会把他替换成第二个参数
5.gourp by
select 需要分组的字段, 分组函数(需要统计的字段) from table group by 需要分组的字段
select a,b,c, max(x) from table group by a,b,c --所有未包含在分组函数的列,都必须在 group by 中表示出来
当执行多个列分组时,先执行 a分组,分组后b如果有重复再执行b分组。
6. having
where 和 having 都是筛选条件,区别是 where 子句中不能使用分组函数
select a,avg(b) from table group by a having avg(b) ;
其他条件下通用
select a,avg(b) from table group a by having a=10;
select a,avg(b) from table where=10 group by a;
在sql的优化角度考虑尽量使用where
7.分组查询的中order by
可以按照: 列,别名,表达式,序号排列
select a,avg(b) from table group by a order by avg(b) ; --按b升序排列
select a,avg(b) as 平均工资 from table group by a order by 平均工资 ;--按别名
select a,avg(b) as from table group by a order by 2; --按序号
8.分组嵌套
平均工资的最大值
select max(avg(b)) from table group by b;
9.group by 增强语句
group by rollup(a,b)
五、子查询
select * from t1 where t1.a>(select t2.b from t2 where ...);
注意问题
.可以写子查询的位置: where ,select ,having,from
.不可以使用子查询的位置 group by
六、排重
select PROD_NORM_CODE,REMARK from T_MD_PROD_NORM GROUP BY PROD_NORM_CODE,REMARK having count(PROD_NORM_CODE)>1
正则表达式 查询所有是数字的
REGEXP_LIKE(列名,'(^[+-]?\d{0,}\.?\d{0,}$)');
剔除改字段下非数字数据,然后转成数字,四舍五入保留三位小数
select round (to_number(列名),3) as 列名 from table1 where REGEXP_LIKE(列名,'(^[+-]?\d{0,}\.?\d{0,}$)');
(21)Oracle表查询进阶的更多相关文章
- oracle 表查询(2)
使用逻辑操作符号 问题:查询工资高于500 或者是岗位为MANAGER 的雇员,同时还要满足他们的姓名首字母为大写的J? or job = 'MANAGER') and ename LIKE 'J%' ...
- oracle 表查询(1)
oracle 表基本查询 介绍在我们讲解的过程中我们利用scott 用户存在的几张表(emp,dept)为大家演示如何使用select语句,select 语句在软件编程中非常有用,希望大家好好的掌握. ...
- (六)Oracle 的 oracle表查询关键字
参考:http://www.hechaku.com/Oracle/oracle_tables2.html 1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们 ...
- 第五章、Django之多表查询进阶与事务
目录 第五章.Django之多表查询 一.聚合查询 二.分组查询 三.F与Q查询 四.查询优化 五.Django开启事务 六.自定义char字段 七.ORM常用字段 第五章.Django之多表查询 一 ...
- oracle表查询
使用scott用户中存在的emp.dept表等做演示 一.单表查询 查看表结构:desc dept; 查看所有列:select * from dept: 查询指定列:select ename,sal, ...
- oracle 表查询二
1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J?select * from emp where (sal > 500 or ...
- 七、oracle 表查询二
1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J?select * from emp where (sal > 500 or ...
- oracle 表查询(二)
1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J?select * from emp where (sal > 500 or ...
- 七 oracle 表查询二
1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J?select * from emp where (sal > 500 or ...
随机推荐
- [NOIP2012]疫情控制(二分答案+倍增+贪心)
Description H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 ...
- L1-039 古风排版 (20 分)
L1-039 古风排版 (20 分) 中国的古人写文字,是从右向左竖向排版的.本题就请你编写程序,把一段文字按古风排版. 输入格式: 输入在第一行给出一个正整数N(<),是每一列的字符数.第 ...
- 序列化模块--json模块--pickle模块-shelve模块
什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传播到远程,因为硬盘或网络传输时只能接受bytes 例: 把内存数据 转成字符 # data ={# 'roles ...
- java多线程的常用方法
介绍一些多线程中的常用方法: //启动方法 a.start(); //返回代码正在被哪个线程调用的信息 a.currentThread(); //返回线程的名字 a.currentThread().g ...
- CSC.exe(C#编译器命令行)
不要在普通的命令行窗口中编译,请先打开C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Visual Studio 2010 ...
- 2015暑假训练(UVALive 5983 - 5992)线段树离线处理+dp
A: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83690#problem/A 题意:N*M的格子,从左上走到右下,要求在每个点的权值 ...
- 玲珑杯”ACM比赛 Round #15
手速狗从西安回来一只浑浑噩噩,好不容易迎来一场送饭比赛体验一把河南的优势,结果被高中生狂虐,无缘奖金..我的奖品梦就这样一次次被打破.... A -- Reverse the lights 最后半小时 ...
- CodeForces Round #521 (Div.3) B. Disturbed People
http://codeforces.com/contest/1077/problem/B There is a house with nn flats situated on the main str ...
- ZigBee学习五 无线温度检测
ZigBee学习五 无线温度检测 1)修改公用头文件GenericApp.h typedef union h{ uint8 TEMP[4]; struct RFRXBUF { unsigned cha ...
- UVALive 6609 Minimal Subarray Length(RMQ-ST+二分)
题意:给定长度为N的数组,求一段连续的元素之和大于等于K,并且让这段元素的长度最小,输出最小长度即可,若不存在这样的元素集合,则输出-1 题目链接:UVAlive 6609 做法:做一个前缀和pref ...