高级查询

Posted dahua7758521

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级查询相关的知识,希望对你有一定的参考价值。

使用别名作为该字段的名字
别名本身不区分大小写,而且不能含有空格。若希望别名区分大小写或含有空格,那么可以在别名上使用双引号括起来.
select ename ,sal*12 sal from emp


子查询 是一条select语句,嵌套在其他SQL语句中,为的是给该SQL提供数据以支持其执行操作。
select ename ,sal from emp
where sal>(select sal from emp where ename=‘CLARK‘)

在ddl中使用子查询
可以根据子查询的结果快速创建一张表 子查询函数和表达式必须用别名
as可以作为连接语句的操作符
create table employee
as
select e.ename,e.empno,e.job,e.sal,
d.dname,d.loc from emp e,dept d
where e.deptno(+)=d.deptno

dml 中使用子查询

delete from emp
where deptno=(select deptno from emp where name=‘CLARK‘)

子查询常用于select语句中

子查询根据查询结果集的不同分为:
单行单列子查询:常用于过滤条件可以配合:
=,<,<=,>,>=使用
多行单列子查询:常用于过滤条件,由于查询出多个值,在判断=时要用in
判断>,>=等操作要配合ANY,ALL
多行多列子查询:常看做一张表

select ename ,job,deptno from emp
where deptno IN(select deptno from emp where job=‘SALESMAN‘)
AND job<>‘SALESMAN‘


select ename ,sal from emp
where sal> all(select sal from emp where job in(‘CLERK‘,‘SALESMAN‘))

 

EXISTS 关键字
exists 后面跟一个子查询,当该子查询出至少一条记录时,则exists表达式成立并返回

select dname ,deptno from dept d
where
exists(select * from emp e
where e.deptno=d.deptno)

 

select dname ,deptno from dept d
where
not exists(select * from emp e
where e.deptno=d.deptno)

子查询在from子句中的使用
当一个子查询是多列子查询,通常将该子查询的结果集当做一张表看,待并基予它进行二次查询

select e.ename,e.sal,e.deptno
from emp e, (select avg(sal) avg_sal ,deptno from emp
group by deptno) t
where e.deptno=t.deptno
and e.sal>t.avg_sal


子查询在select 子句中使用
可以将查询的结果当做外层查询记录中的一个字段值显示

分页查询

将查询表中数据时分段查询,而不是一次性将所有数据查询出来
有时查询的数据量非常庞大,这会导致系统资源消耗大,影响速度长,数据
冗余严重。
为此当遇到这种情况时,一般使用分页查询解决。
不同数据库语法不一样(方言)


rownum 不存在与任何一张表中,但是所有的表都可以查询该字段,该字段随着查询自动生成的,方式是:每当可以从表中查询出一条记录时,该字段的值即为该条记录的行号,从1开始逐次递增。

select rownum ,empno,sal,job from emp

不能使用rownum>1以上的数字判断,否则查询不出任何数据

ROWNUM是当oracle进行select查询表数据时,
确定一条数据需要时,才会对其进行编号(伪劣的
值),这就导致,没有数据被查出前,rownum永远
没有值。所以rownum不能在第一次查询时作为
where条件。

SELECT * from (select rownum rn ,empno,sal,job from emp) where rn between 5 and 10


select *
from(SELECT rownum rn ,t.*
from (select empno,sal,job
from emp
order by sal desc ) t)
where rn between 5 and 10

rownum:有数据了才有值
where里出现:有值才有数据
所以这里有一个矛盾

分页的三步:
1:排序
2:编号
3:取范围


分页的算法:
page:页数 pagesize:一页的条数
start :(page-1)*pagesize+1
end :page*pagesize


SELECT ename, job, sal,
DECODE(job,
‘MANAGER‘, sal * 1.2,
‘ANALYST‘, sal * 1.1,
‘SALESMAN‘, sal * 1.05,
sal
) bonus
FROM emp


decode 在group by分组中的应用可以将字段值不同的记录看做一做

按字段内容排序
SELECT *
FROM dept
ORDER BY
DECODE(dname,
‘OPERATIONS‘,0,
‘ACCOUNTING‘,1,
‘SALES‘,2,
3)

排序函数允许对结果集按照指定的字段分组,在组内再按照指定的字段排序,
最终生成组内编号
row_number():生成组内连续且唯一的编号
SELECT
ename,sal,deptno,
ROW_NUMBER()
OVER(PARTITION BY deptno
ORDER BY sal DESC) rank
FROM
emp

rank():生成组内不连续且不唯一的编号
排序的列若值相同,会得到相同的编号
SELECT
ename,sal,deptno,
RANK()
OVER(PARTITION BY deptno
ORDER BY sal DESC) rank
FROM
emp

dense_rank():生成组内连续但不唯一的编号
排序的列若值相同,会得到相同的编号
SELECT
ename,sal,deptno,
DENSE_RANK()
OVER(PARTITION BY deptno
ORDER BY sal DESC) rank
FROM
emp

 

CREATE table sales_tab(
year_id number not null,
month_id number not null,
day_id number not null,
sales_value number(10,2) not null
);
insert into sales_tab
select trunc(dbms_random.value(2010,2012)) as year_id,
trunc(dbms_random.value(1,13) )as month_id,
trunc(dbms_random.value(1,32) )as day_id,
round(dbms_random.value(1,100) ,2)as sales_value
from dual
connect by level<=1000;

集合操作


union、 union all 并集

intersect 交集

minus 差集


高级分组函数用在group by 子句中,每个高级分组函数都有一套分组策略

rollup():分组原则,参数主次递减,一直到所有参数都不要,每一种分组都统计一次结果并且并在一个结果集显示。

select year_id,month_id,day_id,sum(sales_value)
from sales_tab
group by
rollup(year_id,month_id,day_id)

cube() 每种组合都要来一次

 


GROUP BY
ROLLUP(a,b,C)

abc ab a 整体

GROUP BY
CUBE(y,m,d)

ymd,ym,yd,md,y,m,d,整体一次


grouping sets: 每个参数是一种分组方式,然后将这些分组统计后并在一个结果集显示。

SELECT
year_id,month_id,day_id,SUM(sales_value)
FROM sales_tab
GROUP BY
GROUPING SETS(
(year_id,month_id,day_id),
(year_id,month_id)
)
ORDER BY year_id,month_id,day_id

 

以上是关于高级查询的主要内容,如果未能解决你的问题,请参考以下文章

高级查询(嵌套查询)和(相关子查询)

SQL(高级查询)

Mysql 基础 高级查询

mysql高级查询

Hibernate 的查询语言 HQL 与高级查询

高级查询,关联查询