组函数,分组,子查询(031)

一.分组

            1.组函数操作行集,给出每组的结果。这些集合可能是整个表或者是表分的组。

            2.组函数和单行函数的区别

                单行函数对每行的结果做处理,组函数只对分组的函数做处理。

                单行函数对每个结果集返回一个结果,组函数对每个组返回一个结果。

            3.组函数的类型

                age,count,min,max,sum

            4.组函数的语法

                select [column],function(column)...

                from table

                [where condition]

                [group by column]

                [order by column]

            5.组函数使用原则

                参数数据类型可以是:char ,varchar1, number,date

                所有组函数忽视空值,可以用nvl,nvl2,函数代替空值

二.函数的使用

        1.avg,sum

            两个函数的参数只能是数值类型

            实列:

                求员工表中平均薪水与薪水总额

                select avg(salary),sum(salary) from employees'

        2.min和max

            参数类型可以是:数字,字符,日期

            实列:

            求员工表中的最高薪水和最低薪水

            select mun(salary),min(salary) from employees

        3.count

            返回一个表中的行数

        三种格式:

        count(*)

           返回所有行数,包括有数值的,重复行,空值,如果有where ,则返回满足条件的行数

        实列:

        返回查询结果的 行数:

        select count(*) from employees;

        count(expr)

        返回有expr指定的列,返回非空的行数

        实列:

        显示部门80中有奖金的员工人数

            select count(commission_pct) from employees e  where e.commission_id=80

            count(distinct expr)

        除去重复行的函数

        4.组函数和null值

        使用nvl函数处理组函数忽视的空值,是空值的行也查询出来

        实列:

            计算有佣金的员工的平均值

            select avg(commission_pct) from employees

            计算所有员工的佣金的平均值

            select avg(nvl(commission_pct,0)) from employees

   三.创建数据组

        1.根据查询的结果集划分跟小的组,用group by实现

        2.group by子句可以把表中的行划分为组,然后用组函数返回每一组的信息。

        3.分组原则

            (1)select子句中出现的列必须出现在

                group by子句中,否则会出现一个错误信息。

            (2)可以使用where子句将分组前的数据过滤。

            (3)group by子句中不能用列的别名

            (4)group by包含的列中的字段默认升序排列。

            (5)select子句是可以不包含group by中的列

                实列:

                    显示出每个部门付给每个工作岗位的合计薪水报告

select department_id, sum(salary), job_id from employees group by job_id , department_id order by department_id

        4.group by的执行顺序

                数据查询-->数据分组 -->执行组函数

四.having子句

        1.having于group by联合使用,用来过滤分组后的数据。having弥补了where函数

与聚合函数不能联合使用的不足。

        2.过滤的列如果是组函数处理过的列需要加上组函数

实列:

        显示最高薪水大于10000的部门的部门编号和最高薪水

select department_id,max(salary) from employees group by department_id having max(salary)>10000;

----------------------------子查询---------------------------------------------------------


一.子查询简介

        1.字查询是 一个select语句,他是嵌套在另一个select语句中的子句

        2.语法结构

        select select_list from table where exper operator(select select_list from table)

        3.子查询在查询之前执行一次,子查询的结果被用于主查询。

        4.可以将子查询放在 where子句中,having子句中,from子句中

        5.查询原则

            (1)子查询放在圆括号中

            (2)将子查询放在比较条件的右边

            (3)在单行子查询中用单行运算符,多行字查询中用多行运算符。

        6.子查询的类型

            单行子查询:子查询语句值返回一行的查询

            多行子查询:子查询返回多行的查询

二.单行子查询

        1.仅返回一行,使用单行比较运算符

        2.单行运算符


        3.实列:

            显示哪些job_id和员工141相同的员工的名字与job_id

select job_id,last_name from employees group by job_id having job_id=(select job_id from employees where employee_id =141);

        4.实列:

            显示job_id于员工141相同,并且薪水高于143的那些员工:

select salary ,job_id from employees where job_id=(select job_id from employees where employee_id=141) and salary>(select salary from employees where employee_id=143)

        5.子查询中使用组函数

            实列:显示所有薪水等于最低薪水的员工的last_name,job_id,salary:

select last_name,job_id,salary from employees where salary=(select min(salary) from employees );

        6.代子查询的having的子句

            实列:显示所有最低薪水小于部门50的最低薪水的部门号和最低薪水

select dapartment_id ,min(salary) from employees group by department_id having min(salary)<(select min(salary) from employees where department_id=50)

三.多行子查询

        1.返回多于一行,使用多行比较符

        2.多行比较符


        3.in运算符

            实列:

            查询各部门收入为部门最低的哪些成员,显示名字,薪水,部门id

select first_name,salary,department_id from employees where salary in (select min(salary) from employees group by department_id)

        4.any运算符

            <  any意思是小于最大值,>any意思是大于最大值

            实列:

            显示工作岗位不是 IT_PROG 的雇员,并且

            这些雇员的的薪水少于 IT_PROG 工作岗位的雇员的 ID、名字、工作岗位和薪水

select employee_id,last_name,job_id, salary from employees where job_id<>'IT_PROG' and salary < any(select salary from employees where jon_id='IT_PROG')

        5.all运算符

            <ALL 意思是小于最小值。>ALL 意思是大于最大值。

            ANY 与 ALL 的区别:

            ANY: >ANY 表示至少大于一个值,即大于最小值。

            ALL: >ALL 表示大于每一个值,既大于最大值。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 2017/3/14 RDBMS:关系型数据库管理系统 关系模型独立于语言 SQL有几种不同类型的语言:数据定义语言...
    ancherl阅读 1,668评论 0 6
  • oracle 数据库的scott帐号。 <>作为查询条件时,可以使用!= 来替换。 SQL> select * f...
    庄栋栋阅读 2,227评论 0 0
  • 1、隐式连接 1、笛卡尔乘积笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2...
    AKyS佐毅阅读 2,071评论 0 1
  • 16用大众孰知的标签取名字 站在客户的角度,深度挖掘客户最底层的需求点,卖友肌多好多好没有比自信,冻龄,白,没有鱼...
    yuyu7926阅读 521评论 0 0
  • 鹰不需鼓掌,也在飞翔。小草没人心疼,也在成长。拼搏时请不要放弃,坚持注定有孤独彷徨,质疑嘲笑,也无妨! 欣姐新研发...
    欣姐_3536阅读 151评论 0 1