zoukankan      html  css  js  c++  java
  • 分组查询知识点以及案例

      1 #进阶5:分组查询
      2 /*
      3 语法:    SELECT 分组函数,列(要求出现在group by的后面)
      4           from 表
      5                     GROUP BY 分组的列表
      6                     [order by子句]
      7 注意:    查询列表必须特殊,要求是分组函数和group by后出现的字段
      8 特点:
      9           1、分组查询中断筛选条件为两类
     10                        数据源              位置                     关键字
     11           分组前筛选   原始表              GROUP BY子句的前面      WHERE
     12                     分组后筛选   分组后的结果集      GROUP BY子句的后面      HAVING
     13                     ①分组函数做条件肯定是放在having子句中
     14                     ②能用分组前筛选的,就优先考虑使用分组.
     15                     2.GROUP BY子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(用得较少)
     16                     3、也可以添加排序(排序放在整个分组查询的最后)
     17 */
     18 #引入:查询每个部门的平均工资
     19 SELECT avg(salary ) FROM employees;
     20 
     21 #简单的分组查询
     22 #案例1:查询每个工种的最高工资
     23 SELECT MAX(salary),job_id
     24 FROM employees
     25 GROUP BY job_id;
     26 
     27 #案例2、查询每个位置上的部门个数
     28 SELECT COUNT(*),location_id
     29 FROM departments
     30 GROUP BY location_id;
     31 
     32 #添加筛选条件
     33 #案例1:查询有幸中包含a字符的,每个部门的平均工资
     34 
     35 SELECT avg(salary),department_id
     36 FROM employees
     37 WHERE email LIKE '%a%'
     38 GROUP BY department_id;
     39 
     40 #案例2:查询有奖金的每个领导手下员工的最高工资
     41 SELECT MAX(salary),manager_id
     42 FROM employees
     43 WHERE commission_pct is not NULL
     44 GROUP BY manager_id;
     45 
     46 #添加复杂的筛选条件
     47 
     48 #案例1:查询那个部门的员工个数>2
     49 #①查询每个部门的员工个数
     50 SELECT COUNT(*),department_id
     51 FROM employees
     52 GROUP BY department_id;
     53 
     54 #②根据①的结果进行筛选,查询那个部门的员工个数>2
     55 SELECT COUNT(*),department_id
     56 FROM employees
     57 GROUP BY department_id
     58 HAVING COUNT(*)>2;
     59 
     60 #案例2:查询每个工种有奖金的员工的最高工资>12000的工种变化
     61 #① 查询每个工种有奖金的员工的最高工资
     62 
     63 SELECT MAX(salary),job_id
     64 FROM employees
     65 WHERE commission_pct is not NULL
     66 GROUP BY job_id;
     67 
     68 #②根据①结果继续筛选,最高工资>12000
     69 SELECT MAX(salary),job_id
     70 FROM employees
     71 WHERE commission_pct is not NULL
     72 GROUP BY job_id
     73 HAVING MAX(salary)>12000;
     74 
     75 #案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及最低工资
     76 SELECT manager_id,MIN(salary)
     77 FROM employees
     78 WHERE manager_id>102
     79 GROUP BY manager_id
     80 HAVING MIN(salary)>5000;
     81 
     82 #按表达式或函数分组
     83 
     84 #案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
     85 SELECT COUNT(*) c,LENGTH(last_name) len_name
     86 FROM employees
     87 GROUP BY len_name
     88 HAVING C>5;
     89 
     90 #按多个字段分组
     91 
     92 #案例:查询每个部门每个工种的员工的平均工资
     93 SELECT avg(salary) ,department_id,job_id
     94 FROM employees
     95 GROUP BY job_id,department_id;
     96 
     97 #添加排序
     98 #案例:查询每个部门每个工种的员工的平均工资,按平均工资的高低来排序
     99 SELECT avg(salary) ,department_id,job_id
    100 FROM employees
    101 WHERE department_id is not NULL
    102 GROUP BY job_id,department_id
    103 HAVING avg(salary)>10000
    104 ORDER BY avg(salary) desc;
    105 
    106 #1.查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序
    107 SELECT MAX(salary) a,MIN(salary) i,avg(salary) avg,SUM(salary) sum
    108 FROM employees
    109 GROUP BY job_id
    110 ORDER BY job_id ;
    111 
    112 
    113 #2.查询员工最高工资和最低工资的差距( DIFFERENCE114 SELECT  MAX(salary)-MIN(salary) difference
    115 FROM employees;
    116 
    117 
    118 #3.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
    119 SELECT min(salary),manager_id
    120 FROM employees
    121 WHERE manager_id is not null
    122 GROUP BY manager_id
    123 HAVING MIN(salary)>=6000;
    124 
    125 #4.查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
    126 SELECT department_id, COUNT(*),avg(salary) a
    127 FROM employees
    128 GROUP BY department_id
    129 ORDER BY a DESC;
    130 
    131 
    132 #5.选择具有各个job_id的员工人数
    133 SELECT COUNT(*),job_id
    134 FROM employees
    135 WHERE job_id is not NULL
    136 GROUP BY job_id;
  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/deyo/p/13238227.html
Copyright © 2011-2022 走看看