zoukankan      html  css  js  c++  java
  • SQL 强化练习 (十三)

    这几天都在整帆软报表, 还要弄 RPA ... 咱说呢, 这些破玩意, 是提升了业务人员的工作效率, 但, 极大降低了我的工作效率, 明明写代码就能解决, 非要各种 点点点... 文档也不全, 就很难受, 举步维艰, 这是我近段时间的感受, 发现百度, google 真的不是万能的. 有些问题, 就是前人没有的, 而且很多, 没有参考... 无所谓了, 自己的修炼还是得继续, sql 这块继续熟练使用, 争取练到我用Python的那种, 随心所欲的地步, 一点心愿吧.

    表关系

    需求 01

    查询男生, 女生的人数

    分析

    group by 性别, count(学号) 即可, so easy

    select
      gender as 性别,
      count(distinct s_id) as 人数 
    from student
    group by gender
    
    

    发现取别名的时候, 直接用中文还蛮好使的

    +--------+--------+
    | 性别   | 人数   |
    +--------+--------+
    | 女     |      1 |
    | 男     |      3 |
    +--------+--------+
    2 rows in set (0.00 sec)
    
    

    分组, 其实这里也可用 case when 来实现分组统计, 而不用 group by

    select
      sum(case when gender = '男' then 1 else 0 end) as 男同志人数,
      count(case when gender = '女' then 1 else null end) as 女同志人数 
    from student
    

    case when 的时候, sum 和 count 都可以实现功能. 计数而已嘛.

    +-----------------+-----------------+
    | 男同志人数      | 女同志人数      |
    +-----------------+-----------------+
    |               3 |               1 |
    +-----------------+-----------------+
    1 row in set (0.00 sec)
    
    

    需求 02

    查询名字中带有 "王" 字的学生信息

    查询 姓王的学生信息
    查询 名字为2个字的学生信息
    查询 名字为3个字, 中间为 "小" 的学生信息

    分析

    模糊查询走一波

    select * from student where s_name like "%王%";
    select * from student where s_name like "王%";
    select * from student where s_name like "%__";
    select * from student where s_name like "_小_";
    

    虽然简单, 但还是经常用的, 具体来查看一波详情吧还是.

    mysql> select * from student where s_name like "%王%";
    +------+--------+------------+--------+
    | s_id | s_name | birth_date | gender |
    +------+--------+------------+--------+
    | 0001 | 王二   | 1989-01-01 | 男     |
    +------+--------+------------+--------+
    1 row in set (0.00 sec)
    
    mysql>
    mysql> select * from student where s_name like "王%";
    +------+--------+------------+--------+
    | s_id | s_name | birth_date | gender |
    +------+--------+------------+--------+
    | 0001 | 王二   | 1989-01-01 | 男     |
    +------+--------+------------+--------+
    1 row in set (0.00 sec)
    
    mysql>
    mysql> select * from student where s_name like "%__";
    +------+-----------+------------+--------+
    | s_id | s_name    | birth_date | gender |
    +------+-----------+------------+--------+
    | 0001 | 王二      | 1989-01-01 | 男     |
    | 0002 | 星落      | 1990-12-21 | 女     |
    | 0003 | 胡小适    | 1991-12-21 | 男     |
    | 0004 | 油哥      | 1996-10-01 | 男     |
    +------+-----------+------------+--------+
    4 rows in set (0.00 sec)
    
    mysql>
    mysql> select * from student where s_name like "_小_";
    +------+-----------+------------+--------+
    | s_id | s_name    | birth_date | gender |
    +------+-----------+------------+--------+
    | 0003 | 胡小适    | 1991-12-21 | 男     |
    +------+-----------+------------+--------+
    1 row in set (0.00 sec)
    

    需求 03

    查询 1996 年出生的学生信息

    分析

    时间处理呗, year, month, day, date, datetime .. 这些. 在数据分析中, 时间是个特别重要的字段. 环比, 同比, 本周, 上月, 最近3月, 半年.... 这些频率是非常高的.

    select * from student where year(birth_date) = '1996'
    
    +------+--------+------------+--------+
    | s_id | s_name | birth_date | gender |
    +------+--------+------------+--------+
    | 0004 | 油哥   | 1996-10-01 | 男     |
    +------+--------+------------+--------+
    1 row in set (0.00 sec)
    
    

    从字符串时间提取, month, year, day ...

    mysql> select month('2020-4-16');
    +--------------------+
    | month('2020-4-16') |
    +--------------------+
    |                  4 |
    +--------------------+
    1 row in set (0.00 sec)
    
    mysql>
    mysql> select day('2020-4-16');
    +------------------+
    | day('2020-4-16') |
    +------------------+
    |               16 |
    +------------------+
    1 row in set (0.00 sec)
    
    mysql>
    mysql> select year('2020-4-16');
    +-------------------+
    | year('2020-4-16') |
    +-------------------+
    |              2020 |
    +-------------------+
    1 row in set (0.00 sec)
    

    整理几个常用的时间函数, 记个笔记

    • curedate() 返回当前日期
    • curtime() 返回当前时间
    • now() 返回当前的日期和时间
    • week(date) 返回 该日期 是一年中的第几周

    ....

    小结

    • 日常练练 group by, 同时 case when 也能实现类似的 分组统计功能
    • 模糊查询 like, 通配符 % , 占位符 _ , 正则表达式 regexp
    • 时间函数 curdate, curtime, year, month , day ....
  • 相关阅读:
    C# 翻页设计:首页,上一页,下一页,末页 ,跳转
    sqlsever2008数据库的备份与还原
    解决treeview的同一节点单击多次的执行问题
    juery mobile select下来菜单选项提交form问题
    利用 lucene.net 实现高效率的 WildcardQuery ,记一次类似百度搜索下拉关键字联想功能的实现。
    字符编码笔记:ASCII,Unicode和UTF-8 转
    由三目运算符 == ? : 引起的一个问题,醉了,基础不过关。记录一下,比较简单的一个问题,只是为了记录一下
    记一次排错,windows日志 模块 DLL C:Windowssystem32inetsrvaspnetcore.dll 未能加载。返回的数据为错误信息。
    windows xp 连接USB网络打印机服务器(通用所有usb网络打印机服务器的安装)
    try catch中用了 Response.Redirect 引发的线程异常终止
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/12716362.html
Copyright © 2011-2022 走看看