zoukankan      html  css  js  c++  java
  • mysql数据库基本操作(五)

    表纪录之查(单表查询)2

           上一篇讲了4类查询的方式,现在接着上一篇继续看还有哪些方式。

    group by 分组查询

          顾名思义,分组查询要分组,因为mysql5.7之后默认不支持group by语句,需要改配置文件,我没有去改,如果需要用到group by的可以百度一下如何修改配置文件,再练习下面这个例子。

    group by 分组查询:
            CREATE TABLE order_menu(
                 id INT PRIMARY KEY auto_increment,
                 product_name VARCHAR (20),
                 price FLOAT(6,2),
                 born_date DATE,
                 class VARCHAR (20)
                                    );


             INSERT INTO order_menu (product_name,price,born_date,class) VALUES ("苹果",20,20170612,"水果"),
                                                 ("香蕉",80,20170602,"水果"),
                                                 ("水壶",120,20170612,"电器"),
                                                 ("被罩",70,20170612,"床上用品"),
                                                 ("音响",420,20170612,"电器"),
                                                 ("床单",55,20170612,"床上用品"),
                                                 ("草莓",34,20170612,"水果");


                -- 注意,按分组条件分组后每一组只会显示第一条记录

                -- group by字句,其后可以接多个列名,也可以跟having子句,对group by 的结果进行筛选。


                        -- 按位置字段筛选
                           select * from order_menu group by 5;

                        -- 练习:对购物表按类名分组后显示每一组商品的价格总和
                           select class,SUM(price)from order_menu group by class;

                        -- 练习:对购物表按类名分组后显示每一组商品价格总和超过150的商品
                           select class,SUM(price)from order_menu group by class
                                                            HAVING SUM(price)>150;



                       /*
                       having 和 where两者都可以对查询结果进行进一步的过滤,差别有:
                         <1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛选;
                         <2>使用where语句的地方都可以用having进行替换
                         <3>having中可以用聚合函数,where中就不行。
                       */


                -- GROUP_CONCAT() 函数
                SELECT id,GROUP_CONCAT(name),GROUP_CONCAT(JS) from ExamResult GROUP BY 
    
    

     聚合函数

             聚合函数感觉像python的内置函数,先不要管聚合函数要干嘛,先把要求的内容查出来再包上聚合函数即可。(一般和分组查询配合使用),直接开始吧,根据聚合函数功能不同,我们先看 统计表中所有记录的聚合函数:

           1.COUNT(列名):统计行的个数

           我们可以用来统计学生个数吧:

    select count(*) from result;

            统计一下语文成绩80分以上同学的个数试试:

     select count(*) from result where chinese>80;
    View Code

           注意:count(*)统计所有行;     count(字段)不统计null值.比如我统计一下语文成绩的个数:

    select count(chinese) from result;

          2.SUM(列名):统计满足条件的行的内容和

           求和函数在各种语言里面用的都还比较多,我们先求一个语文成绩的总分:

    select sum(chinese) as 语文总成绩 from result;

          各科成绩都求个总分吧:

    select sum(chinese) as 语文总成绩,
        -> sum(english) as 英语总成绩,
        -> sum(math) as 数学总成绩 from result;

         有了总成绩,是不是可以求所有成绩和平均分啦?

    select sum(chinese)/count(*) from result;     #包括Lily的
    select sum(chinese)/count(chinese) from result;    #不包括Lily的

          3. AVG(列名):

         求平均值,这个可以直接求平均值了,就不用sum那样了,试一下:

    select AVG(chinese) from result;

     

           这个和sum求的不包括Lily的平均一样,说明AVG会自己去除null。

           4.Max、Min

           这个也很好理解了,最大值最小值。先看看英语最高分是多少:

     select MAX(english) from result;

          不多说了,直接找到总分最高和最低的,注意两个最低分的区别。

    select MAX(english+chinese+math) from result;
    select MIN(english+chinese+math) from result;
    select MIN(ifnull(english,0)+ifnull(chinese,0)+ifnull(math,0)) from result;

          注意:null 和所有的数计算都是null,所以需要用ifnull将null转换为0!ifnull(Chinese,0),其他的聚合函数就不做过多介绍了,用法都很简单。

    limit使用

          当数据很多是,我们只想显示部分,就可以用limit来控制,我只显示第一行:

    select * from result limit 1;

          看一下下面一条是什么意思:

    select * from result limit 2,5;

          从结果得到答案,就是跳过前2行,再显示后面5行,用法很简单。

    使用正则表达式查询

          在python中学过正则表达式模块re,在sql中同样存在正则,其实我们上一篇说where的时候,说的就是正则,这里再补充几个例子:

          1.找名字以P开头的信息,这个和p%很像:

    select * from result where name REGEXP '^p';

         2.找名字以y结尾的信息:

    select * from result where name REGEXP 'y$';

        3.找名字以p开头且重复至少1次的所有数据,因为重复两次我们没有这样的数据嘛:

    select * from result where name REGEXP 'p{1}';

            sql 的正则和python的用法其实很像的,掌握一种另一种就很容易明白,这里就不多讲了。还有一点需要注意的是where、order by、group by这些运行的先后顺序,Mysql在执行sql语句时的执行顺序:from先于where先于select先于group by先于having先于order by,了解了这个顺序,再看看那些报错就清晰很多了,这个还是需要记住的,很重要。

  • 相关阅读:
    c#面向对象基础技能——学习笔记(五)委托技术在开发中的应用
    c#面向对象基础技能——学习笔记(三)基于OOP思想研究对象的【方法】
    c#面向对象基础技能——学习笔记(二)基于OOP思想研究对象的【属性】
    使用移位寄存器产生重复序列信号“100_0001”,移位寄存器的级数至少为?
    设计一个异步双端口RAM,深度为16,数据位宽为8bit
    soda水1块钱,硬币有五毛和一块两种:
    画状态机,接收1,2,5分钱的卖报机,每份报纸5分钱
    三极管
    画出可以检测10010串的状态图
    NOT、NAND、NOR符号
  • 原文地址:https://www.cnblogs.com/pengfy/p/10900751.html
Copyright © 2011-2022 走看看