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,了解了这个顺序,再看看那些报错就清晰很多了,这个还是需要记住的,很重要。

posted @ 2019-05-22 10:02  彭方炎QAQ  阅读(476)  评论(0编辑  收藏  举报