zoukankan      html  css  js  c++  java
  • 几个重要的关键字where+group by +having +order by + limit

    where
    从硬盘上读取数据时的一个过滤条件

    where支持的运算符见图1

    where 的筛选过程
    在没有索引的情况下 挨个比较 效率低
    所以我们应该给表添加索引

    group by
    作用 用于给数据分组
    为什么要分组? 思考生活为什么要分组
    1.在生活中是为了方便管理
    2.在数据库中是为了 方便统计

    准备数据
    create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);
    insert into emp values (1,"刘备","男","市场","总监",5800),
    (2,"张飞","男","市场","员工",3000),
    (3,"关羽","男","市场","员工",4000),
    (4,"孙权","男","行政","总监",6000),
    (5,"周瑜","男","行政","员工",5000),
    (6,"小乔","女","行政","员工",4000),
    (7,"曹操","男","财务","总监",10000),
    (8,"司马懿","男","财务","员工",6000);

    按照部门给数据分组
    select *from emp group by dept;
    有两种情况
    1.sql_mode中 没有设置 ONLY_FULL_GROUP_BY 显示每个组的第一条记录 没有意义 所以新版中 自带ONLY_FULL_GROUP_BY
    2.sql_mode中有设置 ONLY_FULL_GROUP_BY 直接报错
    原因是: * 表示所有字段都要显示 但是 分组后 记录的细节被隐藏 只留下了
    这意味着:只有出现在group by 后面的字段才能被显示
    分组是为了统计分组数据 如何统计?
    需要使用到聚合函数


    聚合函数:
    将一堆数据经过计算,得到一个数据
    sum() 求和
    avg() 求平均数
    max()/min() 求最大值 / 最小值
    count() 个数


    2.查询每个部⻔门有⼏几个⼈人
    select dept,count(*) from emp group by dept;

    3.计算每个部⻔门的平均⼯工资
    select avg(salary) from emp group by dept;

    总结 什么时候需要使用分组 只要你的需求中 带有 每个这样的字眼 就需要分组
    每个岗位 每个部门 每个性别

    5.查询平均⼯工资⼤大于5000的部
    select avg(salary) from emp where avg(salary) > 5000 group by dept;
    where 语句后面 不能使用聚合函数
    select avg(salary) from emp;

    总结where 条件不能用于筛选分组后的数据


    group_concat 用于分组后 将组中的某些字段拼接成字符串
    select dept,group_concat(name) from emp group by dept;

    其实 没啥意义 为啥? 你为什么要分组?是为了统计数据 如果你不需要统计 就没有必要分组



    having
    用于对分组后的数据进行过滤
    having不会单独出现 都是和group by 一起出现

    与where的区别
    相同点: 都用于过滤数据
    不同点:
    1.where是最先执行 用于读取硬盘数据
    having 要等到数据读取完之后 才能进过滤 比where晚执行
    2.where中不能使用聚合函数
    having中可以

    需求:
    5.查询平均⼯工资⼤大于5000的部
    select dept,avg(salary) from emp group by dept h0aving avg(salary) > 500;

    6.查询工资最高的人的姓名和他的工资
    需要用到子查询

    是什么 干什么 怎么用?


    order by [desc,asc]
    用于对记录进行 排序

    desc为降序
    asc为升序

    按照工资的从低到高顺序 显示所有的员工
    select *from emp order by salary;
    默认为升序

    修改为降序
    select *from emp order by salary desc;

    按照每个部门的平均工资 降序排序
    select dept,avg(salary) from emp group by dept order by avg(salary) desc;


    limit *******
    用于限制显示的条数
    limit [start,]count

    # 看看表里前三条数据
    select *from emp limit 3;

    # 看看表里的3-5条
    select * from emp limit 2,3;

    # 查看工资最高的那个人的信息
    select *from emp order by salary desc limit 1;

    limit 常用于 数据的分页展示 比如腾讯新闻 的上拉加载新的而一页
    select *from emp limit 0,10; 第一页 页数 减1 乘以条数 得到起始位置
    select *from emp limit 10,10; 第2页
    select *from emp limit 20,10; 第3页
  • 相关阅读:
    java语言基础--标识符、关键字
    #考研碎碎念#3
    #考研笔记#计算机之word问题
    #考研#计算机文化知识1(局域网及网络互联)
    #学习笔记#jsp
    #学习笔记#JSP数据交互
    考研随笔2
    考研随笔1
    几个人
    全局变量
  • 原文地址:https://www.cnblogs.com/1832921tongjieducn/p/11128893.html
Copyright © 2011-2022 走看看