sql 冲冲冲....

也没啥可犹豫, 作为一名数据分析师, 必须掌握的技能, 就要熟练到写 Python 那样的感觉, 就应该可以了, 但目前还是差的比较远, 原因是, 没有相关的一些比较复杂一些的接触, 日常用的 sql 就相关简单, 字段筛选, 表连接, 分组聚合... 虽然都能写出来, 但总是不够自信的. 因此才经常从网上搬砖, 来练习 sql. 这一系列虽然都是关于咱最熟悉的 学生表, 选课表, 教师表 .. 之类的. 但真实业务中也是差不多的, 只是表变得更多和逻辑关系更复杂一些而已. 继续练习吧, 这种东西就是熟能生巧.

表关系

需求 01

查询不同老师, 所教不同课程平均分从高到低显示

分析

分别以, 课程, 老师的视角, 来处理平均分

首先呢, 先从 课程 的视角来做 group by , 看看不同课程的平均分.

select
sc.c_id,
c.c_name,
avg(sc.score) as avg_score
from score as sc
-- 课程名称
inner join course as c
on sc.c_id = c.c_id
group by sc.c_id
-- 降序
order by avg_score desc
+------+--------+-----------+
| c_id | c_name | avg_score |
+------+--------+-----------+
| 0003 | 英语 | 86.3333 |
| 0001 | 语文 | 80.0000 |
| 0002 | 数学 | 76.6667 |
+------+--------+-----------+
3 rows in set (0.00 sec)

蛮简单的, 即根据课程编号分组, 平均成绩做聚合, inner 上课程名称, 最后降序排列即可.

第二种理解, 是以 教师 来做 group by , 来求平均分.

select
t.t_id,
t.t_name,
avg(sc.score) as avg_score from score as sc
inner join course as c
on sc.c_id = c.c_id
-- 再关联 teacher -> t_name
inner join teacher as t
on c.t_id = t.t_id group by t.t_id, t.t_name order by avg_score desc
+------+--------+-----------+
| t_id | t_name | avg_score |
+------+--------+-----------+
| 0003 | NULL | 86.3333 |
| 0002 | 仲尼 | 80.0000 |
| 0001 | 欧拉 | 76.6667 |
+------+--------+-----------+
3 rows in set (0.00 sec)

需求 02

使用分段 [100-85), [85-70), [70-60), [<60) 来统计各科成绩. 分别统计个分数段的人数, 课程id, 课程名称.

分析

先看看基本会涉及的 score 和 course 表, 关联起来

select
c.c_id,
c.c_name from score as sc
inner join course as c
on sc.c_id = c.c_id group by c.c_id, c.c_name
+------+--------+
| c_id | c_name |
+------+--------+
| 0001 | 语文 |
| 0002 | 数学 |
| 0003 | 英语 |
+------+--------+
3 rows in set (0.00 sec)

然后来进行分段统计啦, 要进行判断, 肯定是要用到 case when ... 来操作的.

select
c.c_id,
c.c_name,
-- 分组统计
sum(case when sc.score <= 100 and sc.score > 85 then 1 else 0 end) "100-85",
-- 计数用 count 更直观
count(case when sc.score <= 85 and sc.score > 70 then 1 else null end) "85-70",
sum(case when sc.score <= 70 and sc.score >= 60 then 1 else 0 end) "70-60",
count(case when sc.score < 60 then 1 else null end) "< 60" from score as sc
inner join course as c
on sc.c_id = c.c_id group by c.c_id, c.c_name
+------+--------+--------+-------+-------+------+
| c_id | c_name | 100-85 | 85-70 | 70-60 | < 60 |
+------+--------+--------+-------+-------+------+
| 0001 | 语文 | 0 | 2 | 0 | 0 |
| 0002 | 数学 | 1 | 1 | 1 | 0 |
| 0003 | 英语 | 1 | 2 | 0 | 0 |
+------+--------+--------+-------+-------+------+
3 rows in set (0.00 sec)

因此, 这里的技巧呢, 还是用了 case when 的用法, 外面再套一个聚合函数. 理解 sum 和 count 都能够实现这个 条件分组和统计的功能. 这个就看自己喜好了. 我个人还是喜欢用 sum 一点, 虽然 count 比较更直观, 这可能是跟我之前用 Tableau 的关系, 它默认的聚合字段就是 sum 嘛, 习惯了. 其实都行的.

也写了挺多的sql练习了, 总体的感觉是, 首先, 是要理清楚它需要哪些字段的参与, 以及多表关联的 key, 当不知道该怎么做的时候, 不妨将其拼接 join 起来, 再一步步查询; 然后就是理解 sql 的执行顺序, 先执行 from , 然后是 where, 在是 group by ... having .... 后面才到 select 因此, 我们在写 sql 的时候, 可以将自己当做 "机器" , 先写 from .. join ... where .. group by .. 最后才写 select , order by .. 这些. 这个思路非常关键,我觉得.

小结

  • group by 要非常熟练使用, 就只要涉及聚合, 就要用, 注意 select 字段必须在 group by 中
  • 条件求和, 用 case when .. 做一个标记值, 再在外面套一个 sum 或 count 都可以
  • 根据 sql 执行顺序来写SQL,这样其实更能加深理解, from > where > group by > having > select ...

SQL 强化练习 (十一)的更多相关文章

  1. 【转载】 强化学习(十一) Prioritized Replay DQN

    原文地址: https://www.cnblogs.com/pinard/p/9797695.html ------------------------------------------------ ...

  2. SQL强化(一)保险业务

    保险业务 : 表结构 : sql语句 : /*1. 根据投保人电话查询出投保人 姓名 身份证号 所有保单 编号 险种 缴费类型*/SELECTt2.cust_name,t2.idcard,t4.pro ...

  3. 强化学习(十一) Prioritized Replay DQN

    在强化学习(十)Double DQN (DDQN)中,我们讲到了DDQN使用两个Q网络,用当前Q网络计算最大Q值对应的动作,用目标Q网络计算这个最大动作对应的目标Q值,进而消除贪婪法带来的偏差.今天我 ...

  4. SQL强化练习(面试与学习必备)

    一.经典选课题A 1.1.请同时使用GUI手动与SQL指令的形式创建数据库.表并添加数据. 题目:设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教 ...

  5. SQL语句(十一)函数查询

    (十一)函数查询 1. 聚合函数 对一组值进行计算,得到一个返回值 SUM(), 求和 AVG(), 求平均 MIN(), 求最小 MAX(), 求最大 COUNT(), 计数,即个数 --例1 求所 ...

  6. SQL系列(十一)—— 函数(function)

    SQL中的函数也非常多,而且不同的DBMS提供了相应的特殊函数.但是常用的共性函数大致可以分为以下几种: 函数类型 函数 数值函数 1.算术计算:+.-.*./ 2.数值处理:ABS()绝对值处理.P ...

  7. SQL强化(三) 自定义函数

    ---恢复内容开始--- Oracle中我们可以通过自定义函数去做一些逻辑判断,这样可以减少查询语句,提高开发效率 create  -- 创建自定义函数 or replace -- 有同名函数就替换, ...

  8. SQL强化(二) 在Oracle 中写代码

    一  : 关于查询中的转换 -- 字符串转换 一 : decode 函数 转换 SELECT DECODE ( PROTYPE.PRO_TYPE_DATE, 'L', '长', 'm', '短', ' ...

  9. sql sever基本语法总结

    一.数据库导入表 1.先用sql语句创建相应的表,包括表的字段和字段类型 2.导入数据,选择相应的表名,不带'$'符号的表名 二.创建数据库 create datatable 数据库名 三.查看表里的 ...

  10. 强化学习(十二) Dueling DQN

    在强化学习(十一) Prioritized Replay DQN中,我们讨论了对DQN的经验回放池按权重采样来优化DQN算法的方法,本文讨论另一种优化方法,Dueling DQN.本章内容主要参考了I ...

随机推荐

  1. [NOIP2018] 旅行 题解

    明显要以 \(1\) 为起点. 原图是树 这种情况下,走路不能回头,只能用 \(dfs\) 的思路走.当然肯定每次都走较小的那棵子树,\(vector\) 存图后排序即可达到这种效果. 时间复杂度 \ ...

  2. Nginx 拒绝错误SNI请求以防止源站被扫描

    Nginx 1.19.4 版本更新了一个新的配置,允许使用 ssl_reject_handshake 这个参数来拒绝错误 SNI 请求的握手,可以防止被类似Censys互联网扫码工具扫描出源站ip 在 ...

  3. HTTPS 与 HTTP 的区别在哪?

    HTTP与HTTPS作为互联网数据传输的核心协议,其通信机制与安全特性深刻影响着现代网络应用的可靠性与用户体验.本文将解析两者的通信流程.安全机制及核心差异. 一.HTTP的通信机制 先来看看HTTP ...

  4. docker下安装Harbor

    安装docker-compose # 安装docker-compose curl -L https://github.com/docker/compose/releases/download/1.18 ...

  5. python基础-函数(函数参数、返回值、执行、传参、作用域、函数名)

    前言 !!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失.观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:2022 Python的web开发(完整版) 入门全套教程,零基础 ...

  6. python xlrd 读取表格 单元格值被覆盖

    代码实现顺序: 按行读取 按列读取 满足if条件 单元格值赋值给字典 实现代码: datas = []# 定义一个空列表 for i in range (3,nrows): sheet_data={} ...

  7. 值得推荐的IT公司名单(国企篇)

    大家好,今天我们来盘点一下值得推荐的国企,这些企业在行业内具有举足轻重的地位,不仅主营业务突出,福利待遇优厚,尤其是研发岗位的薪资区间,更是让人眼前一亮. 十大顶尖央企国企,待遇优厚如天花板级别!(排 ...

  8. 三分钟教学:手把手教你实现Arduino发布第三方库

    三分钟教学:手把手教你实现Arduino发布第三方库 原文链接: 手把手教你实现Arduino发布第三方库 摘要 Arduino 发布第三方库的流程包括:构建库的基本框架后将其打包并上传至 GitHu ...

  9. go 逐行读取文件

    前言 文件 I/O,特别是对文件的读写是编程语言中重要的功能.通常,我们需要逐行读取文件. GO 提供了 bufio 软件包,实现了有缓冲的 I/O.它包装一个 io.Reader 或 io.Writ ...

  10. 如何学习 ROS+PX4

    博客地址:https://www.cnblogs.com/zylyehuo/ 参考 https://www.bilibili.com/video/BV1vx4y1Y7Tu?spm_id_from=33 ...