zoukankan      html  css  js  c++  java
  • MySQL常用SQL

    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

      '等级';

    【例】

     

    CREATE TABLE `result` (
    `Time` date NOT NULL,
    `is_result` varchar(5) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    插入数据:

    INSERT INTO `test`.`result`(`Time`, `is_result`) VALUES ('2020-05-09', '胜');
    INSERT INTO `test`.`result`(`Time`, `is_result`) VALUES ('2020-05-09', '胜');
    INSERT INTO `test`.`result`(`Time`, `is_result`) VALUES ('2020-05-09', '胜');
    INSERT INTO `test`.`result`(`Time`, `is_result`) VALUES ('2020-05-09', '胜');
    INSERT INTO `test`.`result`(`Time`, `is_result`) VALUES ('2020-05-10', '胜');
    INSERT INTO `test`.`result`(`Time`, `is_result`) VALUES ('2020-05-10', '胜');
    INSERT INTO `test`.`result`(`Time`, `is_result`) VALUES ('2020-05-10', '胜');

    思路:

    1.查询出胜的次数,按时间分组;
    2.查询出负的次数,按时间分组
    3.联结查询,根据时间相等。

    查询胜利的次数

    select Time ,count(1) from tbl where is_result = '胜' GROUP BY time

    查询失败的次数

    select Time ,count(1) from tbl where is_result = '负' GROUP BY time

     一次查出胜的次数和负的次数,按时间分组 结果得出

    SELECT Time AS "时间",

    COUNT(CASE is_result WHEN "胜" THEN "胜" END) AS "胜",

    COUNT(CASE is_result WHEN "负" THEN "负" END) AS "负"

    FROM result GROUP BY Time;

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

     

  • 相关阅读:
    软阈值迭代算法(ISTA)和快速软阈值迭代算法(FISTA)
    伍德伯里矩阵恒等式(Woodbury matrix identity)
    压缩感知:一种新型亚采样技术
    运输层--------运输层与网络层的关系、UDP、TCP
    单链表的基本操作(二)
    单链表的基本操作(一)
    c++中的数据类型转换
    链表总的首元结点、头结点、头指针的区别
    封装设计基础知识点
    git的使用总结
  • 原文地址:https://www.cnblogs.com/DeryKong/p/12876967.html
Copyright © 2011-2022 走看看