oracle简单学习总结(四)――高级查询(二)

2014-11-24 16:22:25 · 作者: · 浏览: 5
SELECT COUNT(pid) FROM bookinfortable t;
\
说明:返回pid非空的数量
sql:SELECT COUNT( DISTINCT pid) FROM bookinfortable ;
\
说明:该查询返回bookinfortable表中不同pid个数,不包括空的。如果不加DISTINCT,则返回的是非空的个数。
6.2 AVG
sql:SELECT AVG(t.pay) FROM booktypetable t WHERE t.pay>2000;
\
说明:增加了WHERE条件,WHERE条件先执行,在进行均分
6.3 MAX(),MIN()
sql:SELECT MAX(publishdate) 最大日期,MIN(publishdate) 最小日期 FROM bookinfortable;
\
6.4 分组统计
前提:对booktypetable增加一行相同type的数据
\
sql: SELECT type,SUM(pay) FROM booktypetable GROUP BY type;
\
说明:按类型分组,有多少种不同类型就分多少组,并将相同组的工资进行求和。分组查询允许在查询列表中包含分组列,在查询列中,不能使用分组列以外的其他列,否则会产生错误信息。
6.5 HAVING
重点:区分 having 与 where
1、having子句与where都是设定条件的语句。
2、优先执行顺序:where子句>(sum,min,max,avg,count)>having子句
3、对分组数据再次判断时要用having。如果不用这些关系就不存在使用having。直接使用where就行了。
where sql :select t.type,t.manager, max(t.pay) from booktypetable t where t.manager!='李莘' group by( t.type,t.manager ) ;
\
having sql:select t.type, max(t.pay) from booktypetable t group by t.type having max(t.pay)>3500;
\
where and having sql:select t.type,t.manager, max(t.pay) from booktypetable t where t.manager!='李莘'group by( t.type,t.manager ) having max(t.pay)>3500;
\
说明:HAVING从句的限定条件中要出现组函数。如果同时使用WHERE条件,则WHERE条件在分组之前执行,HAVING条件在分组后执行。
6.6 order by 排序
sql:select t.type 类型, t.manager 管理员,t.pay 工资 from booktypetable t order by 工资;
\
说明:order by后面可以跟别名也可以跟 数据库字段
6.7 组函数的嵌套使用
sql:select min(avg(t.pay)) from booktypetable t GROUP BY t.type;
\
错误:select t.type,min(avg(t.pay)) from booktypetable t GROUP BY t.type;这个语句是错误的,因为各类型平均工资的最低值不是属于某个部门的
说明:该查询先统计各部门的平均工资,然后求得其中的最大值。虽然在查询中有分组列,但在查询字段中不能出现分组列。
6.8 子查询
通过把一个查询的结果作为另一个查询的一部分,可以实现这样的查询功能。。子查询比主查询先执行,结果作为主查询的条件,在书写上要用圆括号扩起来,并放在比较运算符的右侧。子查询可以嵌套使用,最里层的查询最先执行。子查询可以在SELECT 、INSERT 、UPDATE 、DELETE等语句中使用。
sql:SELECT b.* FROM booktypetable b WHERE b.pay>(SELECT t.pay FROM booktypetable t WHERE t.manager='王磊');
\
sql:SELECT b.* FROM booktypetable b WHERE b.pay>(SELECT t.pay FROM booktypetable t WHERE t.manager='赵元') and b.type=(SELECT t.type FROM booktypetable t WHERE t.manager='赵元');
\
说明:两个子查询出现在两个条件中,用AND连接表示需要同时满足。在子查询中也可以使用组函数。
sql:SELECT t.manager,t.pay FROM booktypetable t WHERE t.pay >(SELECT AVG(pay) FROM booktypetable);
\
6.9 多行子查询
原表中增加数据
\
sql:SELECT b.* FROM booktypetable b WHERE b.pay < ANY (SELECT t.pay FROM booktypetable t WHERE t.type ='杂志') AND b.type <> '杂志';
\
说明:如果子查询返回多行的结果,则我们称它为多行子查询。多行子查询要使用不同的比较运算符号,它们是IN、ANY和ALL。
6.10 多列子查询
如果子查询返回多列,则对应的比较条件中也应该出现多列,这种查询称为多列子查询。
例:查询职务和部门与SCOTT相同的雇员的信息。
* 再次强调rownum的查询
6.10 集合运算
操 作 描 述 UNION 并集,合并两个操作的结果,去掉重复的部分 UNION ALL 并集,合并两个操作的结果,保留重复的部分 MINUS 差集,从前面的操作结果中去掉与后面操作结果相同的部分 INTERSECT 交集,取两个操作结果中相同的部分