作者:贾胜杰,硕士,退役军人,电气工程专业,现成功转行K12领域数据挖掘工程师,不仅在数据清理、分析和预测方向,而且在自制力和高效学习方面都有丰富经验。
编辑:王老湿

本篇文章包含的知识点有:分组,子查询,链接表,聚合,条件判断,时间序列的处理以及数据清理。文章末尾再附上SELECT子句顺序数据分析师的SQL思维导图

知识清单

数据分组

创建分组(GROUP BY)

之前学到的筛选操作都是基于整个表去进行的,那如果想要依据某列中的不同类别(比如说不同品牌/不同性别等等)进行分类统计时,就要用到数据分组,在SQL中数据分组是使用GROUP BY子句建立的。

在使用GROUP BY时需要注意的几点:

  • GROUP BY子句可以包含任意数量的列,因而可以对分组进行多重嵌套,如按照班级和性别进行分组的话,结果中班级A包含男生组和女生组,班级B也包含男生组和女生组;

  • GROUP BY子句必须出现在WHERE子句之后,ORDER BY之前。

使用示例:

SELECT col_1,COUNT(*) AS num_col
FROM table_1
GROUP BY col_1;

以上即可实现按col_1列中的不同类目进行行数统计。

过滤分组(HAVING)

在SQL入门中我们学过WHERE,它是对行数据进行筛选过滤的,那么,如果我想对创建的分组数据进行筛选过滤呢?这时候,你就要用到HAVING子句了,它与WHERE的操作符一致,只是换了关键字而已。

使用示例:

SELECT col_1,COUNT(*) AS num_col
FROM table_1
GROUP BY col_1
HAVING COUNT(*) >= 2;

这里我们就筛选出了具有两个以上类别的分组。

⚠️使用HAVING时应该结合GROUP BY子句。

子查询与临时表格

我们之前所涉及到的都是从数据库中检索数据的单条语句,但当我们想要检索的数据并不能直接从数据库表中获取,而是需要从筛选后的表格中再度去查询时,就要用到子查询和临时表格了。

子查询与临时表格所完成的任务是一致的,只不过子查询是通过嵌套查询完成,而另一种是通过WITH创建临时表格进行查询。

构建子查询

构建子查询十分简单,只需将被查询的语句放在小括号里,进行嵌套即可,但在使用时一定要注意格式要清晰。

使用示例:

SELECT *
FROM (SELECT day,channel, COUNT(*) AS eventsFROM web_events GROUP BY 1,2 -- 按照第一列(day)和第二列(channel)进行分组ORDER BY 3 DESC) sub -- 小括号内的查询语句即为子查询
GROUP BY channel
ORDER BY 2 DESC;

如上,我们创建了一个子查询,放在小括号里,并将其命名为sub。在子查询中也注意到了各个子句上下对齐,这样条例更清晰。

临时表格(WITH

这种方法,就是使用WITH将子查询的部分创建为一个临时表格,然后再进行查询即可。

我们还是使用上面子查询的例子,这次用临时表格的形式实现:

WITH sub AS(
SELECT day,channel, COUNT(*) AS events
FROM web_events
GROUP BY 1,2
ORDER BY 3 DESC) -- 创建临时表格SELECT *
FROM sub  -- 对临时表格进行检索
GROUP BY channel
ORDER BY 2 DESC; -- 这里是根据临时表格的第二列(channel)进行排序

如上,我们将被嵌套的子查询单独拎出来,用WITH创建了一个临时表格,再之后又使用SELECT根据该表格进行查询。

链接表

基本链接(JOIN)

SQL最强大的功能之一就是能在数据查询的执行中进行表的链接(JOIN)。

在关系数据库中,将数据分解为多个表能更有效地存储,更方便地处理,但这些数据储存在多个表中,怎样用一条SELECT语句就检索出数据呢?那就要使用链接。

创建链接的方式很简单,如下便是使用WHERE创建链接:

SELECT col_1,col_2,col_3
FROM table_1,table_2
WHERE table_1.id = table2.id;

如上,col_1和col_2属于table_1表中,col_3属于table_2表中,而这两个表使用相同的id列进行匹配。这种方法被称为等值链接,也就是内链接,我们可以使用如下的语句,更直观地实现内连接:

SELECT col_1,col_2,col_3
FROM table_1 INNER JOIN table_2
ON table_1.id = table2.id;

当然你也可以使用别名,简化输入,并且标明各列与表的隶属关系:

SELECT t1.col_1,t1.col_2,t2.col_3
FROM table_1 t1 INNER JOIN table_2 t2
ON t1.id = t2.id;

如上代码同样适用于左链接、右链接和外链接:

  • LEFT JOIN : 获取FROM语句后的表格中的所有行,对于那些不存在于 JOIN 语句后的表格中的数据填充None;

  • RIGHT JOIN : 获取JOIN语句后的表格中的所有行,对于那些不存在于 FROM语句后的表格中的数据填充None;

  • FULL JOIN: 只要其中一个表中存在匹配,就返回数据,结果是两表的并集。

自链接

自链接经常用于对子查询的简化,如下示例:

假如要获取与Allen同一公司的所有顾客信息,那就需要你先筛选出Allen所在的公司,然后再根据该公司筛选出所有的顾客。使用子查询的方式如下:

SELECT id,customer_name,company_name,phone_number
FROM customers
WHERE company_name = (SELECT company_nameFROM customersWHERE customer_name = 'Allen')

如果改为自链接的方式如下:

SELECT c1.id, c1.customer_name, c1.company_name, c1.phone_number
FROM customers c1,customers c2
WHERE c1.company_name = c2.company_name
AND c2.customer_name = 'Allen';

结果是一样的,但是使用自链接的处理速度比子查询要快得多。

组合查询(UNION)

UNION用于合并两个或多个SELECT 语句的结果集,使用方法也很简单,只要在多条SELECT语句中添加UNION关键字即可。

⚠️UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。而且UNION返回的结果只会选取列中不同的值(即唯一值)。

使用UNION的场合情况:

  • 在一个查询中从不同的表返回结果;

  • 对一个表执行多个查询返回结果。

示例:

多数情况下,组合相同表的多个查询所完成的任务与具有多个WHERE子句的一个查询是一样的。

-- 语句1:原始语句
-- 查询一
SELECT customer_name,phone_number
FROM customers
WHERE customer_state IN ('str1','str2');--查询二
SELECT customer_name,phone_number
FROM customers
WHERE customer_state = 'str3';-- 语句2:使用UNION链接SELECT customer_name,phone_number
FROM customers
WHERE customer_state IN ('str1','str2')
UNION
SELECT customer_name,phone_number
FROM customers
WHERE customer_state= 'str3'
ORDER BY customer_name;-- 在最后添加了ORDER BY对所有SELECT语句进行排序,这里只是为了示例在使用UNION时如何进行排序。-- 语句3:使用WHERESELECT customer_name,phone_number
FROM customers
WHERE customer_state IN ('str1','str2')
OR customer_state = 'str3';

虽然这里看起来使用UNIONWHERE更复杂,但对于较复杂的筛选条件,或者从多个表中检索数据时,使用UNION更简单一些。

想学数据分析但不会Python,过来看看SQL吧(下)~相关推荐

  1. 想学数据分析但不会Python,过来看看SQL吧(上)~

    作者:贾胜杰,硕士,退役军人,电气工程专业,现成功转行K12领域数据挖掘工程师,不仅在数据清理.分析和预测方向,而且在自制力和高效学习方面都有丰富经验. 编辑:王老湿 SQL SQL基础:语法,检索, ...

  2. 干货 | 想学数据分析不知道该读什么书、从哪本读,翻遍专业知识类网站最全的整理!

    作为一名工作两年的产品新人,想学一些数据分析的知识,推荐的书多又杂,并且没有一个阅读顺序,实在是不知道该怎么办才好. 整理了各大网站关于学习数据分析的文章,整理如下,希望把这篇文章分享给处于和我一样想 ...

  3. 想学数据分析(人工智能)需要学哪些课程?

    转自:Robin Shen 前言--正本清源:优化理论(运筹学),研究的是如何求解目标函数在约束条件下的最优解.机器学习.人工智能中的绝大部分问题,到最后基本都会归结为求解优化问题,因此学习优化理论是 ...

  4. 不想学python-没想到,学会Python即使不做程序员都能月入过万!

    昨天,我公司面试了 1 个同学,应聘新媒体运营,专业能力还不错.他简历上技能栏还写着会 Python,我问了他一个通过爬虫采集数据的问题,他都顺畅的答出来了. 最后聊薪资时,他说期待 7000,我直接 ...

  5. 心得丨一文告诉你想学数据分析该读什么书、从哪本读起

    作者:三郎 因工作原因要学习一些数据的知识,从人人都是产品经理网站上并没有找到一篇从入门到进阶成体系的文章,且查找的分享都是数据体系中一个分支的分支,整体看起来烟雾缭绕,经一位前辈点播还是先从书籍中建 ...

  6. python不想学了-不要再被Python洗脑了!!

    Python 作为一种解释型技术脚本语言,越来越被认可为程序员新时代的风口语言. 无论是刚入门的程序员,还是年薪百万的 BATJ 的技术大牛都无可否认:Python的应用能力是成为一名码农大神的必要项 ...

  7. 金融数据分析用哪些分析软件Python,R还是SQL?

    前言 [金融数据分析]建议使用Python + SQL 首先,Python和R都适合做金融数据分析,但Python在市场欢迎度.易学程度.库生态丰富度.接口拓展性等上面都表现更好,学习性价比更高 其次 ...

  8. 20万RMB!学数据分析的朋友一定要看!

    所有喜欢数据分析,想学数据分析的朋友注意!20W奖金的2022 帆软 BI 数据分析大赛来了!建议你报名参加,理由非常直接: 免费报名,报表实战锻炼能力 主办方贴心提供工具.数据源 结识到各行业的数据 ...

  9. 数学不好、英语不好、非本专业,想学python数据分析,能安排吗?

    全世界有3.14 % 的人已经关注了 数据与算法之美 "非本专业想转型做数据分析,有救吗?" "数学不好,英语不好,想学Python数据分析,有救吗?" &qu ...

最新文章

  1. Makefile详解(一)-介绍及总述
  2. qtablewidget 数据量大效率很低_让大牛带你走进大数据分析:R基础及应用的潮流尖端,享受RHadoop...
  3. 五十四、快速上手uniapp
  4. mysql全文索引FULLTEXT的哈希与BTREE方法对比
  5. 视力检查-2019年2月2日
  6. 共享计算机脱机访问计算机,让Windows7脱机共享访问更安全 -电脑资料
  7. C/C++面试题总结
  8. 完全独立与IIS的后门
  9. DDD(领域驱动设计)概述
  10. Rhino6.5软件安装包详细安装教程
  11. 暗黑管理系列:发红包的管理杠杆率和量级作用
  12. 机器学习基本 之 名词解释
  13. 《刻意练习》读书分享
  14. python爬虫--小说爬取
  15. PHP定时执行计划任务
  16. css单位-vh/vw
  17. 基于Android实现的锁屏软件APP设计
  18. 我的思维工具(三)收益半衰期
  19. 关于印发《深圳市福田区稳企惠民纾困“十条”政策》的通知
  20. 助力中小企业级连云端,促进工业互联网平台蓬勃发展,全套解决方案。附:技术产品...

热门文章

  1. 最好用的日志分析工具ELK
  2. 如何查看Linux是32位还是64位
  3. 解决nginx 504 Gateway Time-out的一些方法
  4. linux编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14
  5. PHP通过GET方法参数为数组请求
  6. Mysql用navicat操作导出查询结果
  7. stata 导出 相关系数表_Stata: 空间权重矩阵的构建
  8. MySQL连表分组统计使用count查询出数据不准确问题解决方案
  9. php教学小结,php小结
  10. Nginx的405 not allowed错误解决