zoukankan      html  css  js  c++  java
  • SQL 日常练习 (十六)

    最近接触了一波 RPA, 可以用来做一些数据采集的事情, 或者任意控制电脑上的软件, 感觉上是挺厉害的, 但我就是不想用, 尽管我尝试了一波, 最后还是放弃 了, 我还是喜欢纯代码的工作方式, 最为讨厌哪些软件来辅助工作, 然后..我竟然直接拒绝了客户的任务需求, 理由是跟我技术栈无关, 我是个文科生, 学不会为由. 我觉得,我还是对自己是比较了解的, 我只会做我感兴趣的事情, 喜欢就会做, 不喜欢就不做, 不论是学生时代起还是工作后, 从来不改变自己的信念和性格. "复归于婴儿" , 这也可能是我一生的追求吧.

    我也有我自己的职业规划, 职业兴趣, 一直在不断积淀, 不能走偏了. 数据这块, 我的历程顺序是,

    • 商业市场理论 -> 市场研究与预测 -> 数据建模与挖掘 -> 数据采集 -> 数据清洗 -> 数据分析 -> 数据可视化 BI

    而我的学习是,

    • 先学文科, 后学理科; 工作是先做业务, 再做技术, 到现在业务技术都能驾驭.

    这个不寻常的顺序, 我一步步走过来, 就全是挑战, 智力和精力上的挑战, 还好, 卒或有所闻, 一直在路上.

    扯远了, 继续练练 sql, 虽然都是些简单的, 但, 我就是要反复练习到极致, 成为我除 Python 外的第二核心硬技能

    表关系

    需求 01

    查询 课程成绩在 80 分以上 的课程名称, 分数和学生姓名

    分析

    从 score 中, 先查出大于80 的 c_id 和 s_id 分别再匹上 课程表 和学生表即可

    select
      a.*,b.*,c.*
    from score as a
    -- 匹上课程名称
    inner join course as b
      on a.c_id = b.c_id 
    -- 披上学生姓名
    inner join student as c 
      on a.s_id = c.s_id
    
    where a.score > 80
    

    先全部捞出来看一把这个查询集

    +------+------+-------+------+--------+------+------+--------+------------+--------+
    | s_id | c_id | score | c_id | c_name | t_id | s_id | s_name | birth_date | gender |
    +------+------+-------+------+--------+------+------+--------+------------+--------+
    | 0001 | 0002 |    90 | 0002 | 数学   | 0001 | 0001 | 王二   | 1989-01-01 | 男     |
    | 0001 | 0003 |    99 | 0003 | 英语   | 0003 | 0001 | 王二   | 1989-01-01 | 男     |
    +------+------+-------+------+--------+------+------+--------+------------+--------+
    2 rows in set (0.00 sec)
    
    

    然后只选择出需要的字段即可.

    select
      b.c_name as 课程名称,
      a.score as 分数,
      c.s_name as 学生姓名
    
    from score as a
    -- 匹上课程名称
    inner join course as b on a.c_id = b.c_id 
    -- 匹上学生姓名
    inner join student as c on a.s_id = c.s_id
    where a.score > 80
    
    +--------------+--------+--------------+
    | 课程名称     | 分数   | 学生姓名     |
    +--------------+--------+--------------+
    | 数学         |     90 | 王二         |
    | 英语         |     99 | 王二         |
    +--------------+--------+--------------+
    2 rows in set (0.00 sec)
    

    需求 02

    查询 不及格学生的学号, , 姓名, 的课程, 并按课程号, 从大到小排列

    分析

    这种级别的, 完全秒杀它.

    select * 
    from score as a 
    where a.score < 60 
    

    这样就过筛选出, 哪些是不及格的 学号, 课程号, 然后跟上面的一样, 关联表, 匹配上来即可.

    select 
    
      c.s_id as 学号,
      c.s_name as 姓名,
      b.c_name as 课程名称
    
    from score as a 
    
    inner join course as b on a.c_id = b.c_id 
    inner join student as c on a.s_id = c.s_id
    
    where a.score < 60 
    
    order by b.c_id desc
    

    我的数据集是没有不及格的兄弟的, 就不查询了. 套路都是一样的.

    需求 03

    课程编号为 0002 且 课程成绩在80分以上的学生学号和姓名

    分析

    反正都是日常练练而已, 都是秒杀, 没啥难度的, 一通百通啦.

    select 
    
      b.s_id as 学号,
      b.s_name as 姓名,
      c.c_name as 课程名称
    
    from score as a 
    
    inner join student as b 
      on a.s_id = b.s_id
    
    inner join course as c 
      on a.c_id = c.c_id 
    
    where (a.c_id = 0002) and (a.score > 80)
    
    +--------+--------+--------------+
    | 学号   | 姓名   | 课程名称     |
    +--------+--------+--------------+
    | 0001   | 王二   | 数学         |
    +--------+--------+--------------+
    1 row in set (0.00 sec)
    
    

    小结

    • 先在多写一方面是熟悉, 也是在写成自己一种风格, 比如排版风格, 不仅仅要有 Pythonic , 也要有 sql_style
    • 写 sql 心得, 就是从机器逻辑去写, 先写from , 在 join, where, group by , having, order by ... 最后再 select..
    • join 还是要多用, on 的 多条件, 还有 内置函数等的用法, 果然 sql 之路还是很长呀.
  • 相关阅读:
    Java 替换 PPT 中的图片
    Java 转换 PDF 版本
    Java 在Word文档中添加艺术字
    Java 删除 Excel 中的空白行和列
    Java 为 PPT 中的图形添加阴影效果
    nginx作用及其配置
    Dockerfile
    Zookeeper学习
    vagrant up启动报错Call to WHvSetupPartition failed
    Vagrant安装启动linux,VitrtualBox,Centos7
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/12775181.html
Copyright © 2011-2022 走看看