进阶查询
# 0.前言
MySQL除了能做基本的条件查询操作外, 还可以用来过滤数据, 比如分组统计, 排序等
通过, SELECT的子句, 可以完成复杂的操作, 除了where子句, 还有如下4个, 一般称select 子句
- group by
- having
- order by
- limit
注意
子句的顺序不能颠倒, 如下
SELECT 字段 FROM 数据表
where子句
group by子句
having子句
order by 子句
limit 子句;
1
2
3
4
5
6
2
3
4
5
6
# 1.group by子句
分组的目的是为了统计, 因此分组通常和聚合函数连用
聚合函数
- count: 计算总数
- sum: 求和
- max: 最大值
- min: 最小值
- avg: 平均值
聚合函数用法示例
查出最贵的商品价格
SELECT max(shop_price) FROM `goods`;
1
查出最便宜的商品的价格
SELECT min(shop_price) FROM `goods`;
1
查询该店所有商品的库存总量
SELECT sum(goods_number) FROM `goods`;
1
查询所有商品的平均价
SELECT avg(shop_price) FROM `goods`;
1
查询该店一共有多少种商品
SELECT count(*) FROM `goods`;
1
SELECT sex, count(*) FROM `stu` GROUP BY `sex`; // 更推荐
SELECT sex, count(sex) FROM `stu` GROUP BY `sex`;
1
2
2
练习
需求: 统计每个栏目下最贵的商品
思路:
- 第一步: 按照栏目(cate_id)对所有的数据进行分组
- 第二步: 使用聚合函数求最大值
分组统计
第一步: 分组
SELECT cate_id FROM goods group by cate_id;
1
第二步: 统计
SELECT `cate_id`, max(shop_price)
FROM `goods`
GROUP BY `cate_id`;
1
2
3
2
3
# 2.having子句
having跟where一样, 用来做条件的判断和数据的筛选过滤
在MySQL中,我们可以使用where进行条件的过滤, 也可以使用having.
示例
# 可以用where也可以用having
SELECT * FROM `t1` WHERE `age` > 18;
SELECT * FROM `t1` HAVING `age` > 18;
1
2
3
2
3
演示
where和having的区别
- where中的条件是
表字段
- having中的条件是
结果集
示例
查询差价>200的商品信息
# 使用where
SELECT `goods_name`, market_price-shop_price as `chajia`
FROM `goods`
WHERE market_price-shop_price > 200;
1
2
3
4
2
3
4
# 使用having
SELECT `goods_name`, market_price-shop_price as `chajia`
FROM `goods`
HAVING chajia > 200;
1
2
3
4
2
3
4
group和having综合示例
查询该店每个栏目下面积压的总货款
SELECT `cate_id`, sum(goods_number*shop_price) as `jiya`
FROM `goods`
GROUP BY `cate_id`;
1
2
3
2
3
查询积压货款>1000的栏目
SELECT `cate_id`, sum(goods_number*shop_price) as `jiya`
FROM `goods`
GROUP BY `cate_id`
HAVING `jiya`>1000;
1
2
3
4
2
3
4
结论
- having通常和group by连用
- having的判断条件是结果集
# 3.order by子句
order by就是实现对数据的排序操作. 一共有两种情况:
- 一种是升序排列(asc)
- 一种是降序排列(desc)
应用场景:
各种排序场合,如新闻按点击量排序, 商品按价格排序, 文章按更新时间排序等
示例
按价格由高到低排序
SELECT `goods_name`, `shop_price`
FROM `goods`
ORDER BY `shop_price` desc;
1
2
3
2
3
多个字段同时排序
按栏目由低到高排序,栏目内部按价格由高到低排序
SELECT `cate_id`, `goods_name`, `shop_price`
FROM `goods`
ORDER BY `cate_id` asc, `shop_price` desc;
1
2
3
2
3
# 4.limit 子句
limit子句用于限定数目
应用场景:
最新的5遍文章, 成绩倒数3名的学生, 点击量最高的10件商品
分页!!!
limit子句有两种语法
语法
# 带一个参数, 表示显示多少条
limit N
# 带二个参数, 表示从N条(偏移量)开始, 显示M条
limit N,M
1
2
3
4
2
3
4
示例
查询价格最高的前三的商品
SELECT `goods_name`, `shop_price`
FROM `goods`
ORDER BY `shop_price` DESC
LIMIT 3;
1
2
3
4
2
3
4
分页示例
每页5件商品, 显示第2页的数据
SELECT `id`, `goods_name`
FROM `goods`
LIMIT 5,5;
1
2
3
2
3
分页公式: 偏移量 = (当前页码-1) * 每页显示数
尝试
每页3件商品, 显示第4页的数据
SQL: _________
如果觉得有帮助, 可以微信扫码, 请杰哥喝杯咖啡~
上次更新: 2021/09/03, 15:32:17