码迷,mamicode.com
首页 > 数据库 > 详细

MySQL常用SQL

时间:2020-05-12 20:30:56      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:需求   常用   left join   avg   文档   dev   lse   lis   条件   

MySQL常用SQL

订单表:orders(id、no、user_id、shop_id、total_fee、phone、paid_at、status、created_at、updated_at)

订单明细表:order_items(id、order_id、shop_id、product_id、category_id、price、quantity、total_fee、created_at、updated_at、coupon_id)

菜单表:categories(id、name、remark、created_at、updated_at)

商品表:products(id、name、description、category_id、support_takeaway、created_at、updated_at)

SKU表:skus(id、product_id、name、price、sort、created_at、updated_at) 

 

1、消除取值重复的行(distinct)

select distinct name as ‘商品名称 ‘ from products;

 

2、分组统计(group by)

查询各商品分类下有多少商品

select c.id,c.name as "分类名称", count(*) as "商品数量" from products p left join categories c on p.category_id=c.id group by p.category_id;

 

查询每个的分类id和商品名称及分类下的商品的平均价格

select c.id,c.name as "分类名称", avg(s.price) as "分类下商品平均价格" from products p left join categories c on p.category_id=c.id LEFT JOIN skus s ON s.product_id=p.id group by p.category_id;

 

3、聚合函数的条件筛选

having 关键字后面直接跟聚集函数,在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

【例】查询分类下的商品数量大于30的分类ID号和分类下商品数量

SELECT p.category_id AS "分类", count(p.id) AS "分类下商品数量" FROM products p GROUP BY category_id HAVING count(p.id)>30;

 

【例】查询每个订单内包含的商品分类大于等于5的订单号和订单包含的商品分类数量

SELECT o.id,o.`no` AS "订单号",count(oi.id) AS "订单内商品种类数量" FROM orders o LEFT JOIN order_items oi on o.id=oi.order_id GROUP BY oi.order_id HAVING count(oi.id)>=5;

 

4、CASE WHEN 语句的用法

第一种用法:CASE后面跟列名,when后面跟对应值

CASE case_value

  WHEN when_value THEN statement_list

  [WHEN when_value THEN statement_list] ...

  [ELSE statement_list]

END

【例】查询订单是否使用了优先券(orders的prior字段:0 未使用,其他为已使用)

SELECT id,`no`,

CASE prior

  WHEN 0 THEN "未使用优先券"

  ELSE "使用了优先券"

END "是否使用优先券" 

FROM orders 

ORDER BY
id ASC
LIMIT 10;

 

当sex值为0时当前列显示“男”,否则显示“女”,sql写法如下

SELECT
  ( CASE sex WHEN 0 THEN ‘男‘ ELSE ‘女‘ END ) AS 性别,
  avg( score ) AS 平均分
FROM
  grade
GROUP BY
  sex;

 

第二种用法:case后面空白,when后面跟着判断条件

CASE

  WHEN search_condition THEN statement_list

  [WHEN search_condition THEN statement_list]

  ...

  [ELSE statement_list]

END 

针对于这种写法,我们考虑这样一种需求,学生成绩是有评分的,大于等于90分的学生是A,小于90分大于等于60分的学生是B, 其余的学生是C,现在要查询评分为A、B、C的学生成绩的平均分分别是多少,因为成绩评分并不是单独的一列,所以不能简单的 使用 group by 来分组实现了,但是可以利用 case when 语句实现,写起来也很简单,看看下面的sql语句就知道了!

select

  (case

    when score >= 90 then ‘A‘

    when score < 60 then ‘C‘

    else ‘B‘

  end) as ‘等级‘, 

   avg(score) as 平均分

from

  grade

group by

  ‘等级‘;

 

总结
case when 语句共有两种写法,使用时要区别两种用法的差异。
使用 case when 语句可以实现修改数值的对应关系,还可以按照复杂的条件进行分组。
关于 case when 语句的详细用法,有兴趣的同学可以参考一下官方文档:13.6.5.1 CASE Syntax

 

MySQL常用SQL

标签:需求   常用   left join   avg   文档   dev   lse   lis   条件   

原文地址:https://www.cnblogs.com/DeryKong/p/12876967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!