mysql数据库结束语_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;

6cdaab2df0430dcf3cbebf1498e87fb5.png

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

409741c71b82244e42a8dc34c45aa6f2.png

b8caf6a7f0ff94ebebc445bcc752de79.png

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

View Code

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

select count(chinese) from result;

c75a2e427a5fbf55d4e5da288aa0e10c.png

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

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

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

c585c86b4b710e556c92d06d53135766.png

各科成绩都求个总分吧:

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

a1f4e1c16c8c45b02297d50d62a94b31.png

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

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

3. AVG(列名):

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

select AVG(chinese) from result;

be6258f94bb37d37509f15aab99281db.png

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

4.Max、Min

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

select MAX(english) from result;

937f820f84bfee528ae4481cce01a304.png

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

select MAX(english+chinese+math) fromresult;select MIN(english+chinese+math) fromresult;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;

08306778edf6a8598eb47720beddf9eb.png

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

select * from result limit 2,5;

58d7b6df2ef38c97f330f75d3d406c21.png

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

使用正则表达式查询

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

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

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

7f696acf08217ee364f65beb833f5702.png

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

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

995bc97e02c474e9cd29269b07f9aff8.png

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

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

95fe5b53b72642a7541a7227db1f14d7.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值