请选择 进入手机版 | 继续访问电脑版
楼主: 时光人
1002 1

SQL进行数据分析 [推广有奖]

  • 3关注
  • 34粉丝

院士

23%

还不是VIP/贵宾

-

威望
1
论坛币
26907 个
通用积分
428.8060
学术水平
95 点
热心指数
109 点
信用等级
91 点
经验
39960 点
帖子
1629
精华
3
在线时间
579 小时
注册时间
2019-2-25
最后登录
2023-4-26

时光人 学生认证  发表于 2020-9-17 15:47:56 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
作为数据科学家,您需要处理大量数据。对于小型数据集,也许您只是将此信息存储在CSV文件中,然后将其加载到Pandas中。但是,这并不是真正的可扩展解决方案,如果您不断更新和插入新数据,效果也不会很好。您需要一个数据库;可以轻松插入,更新和阅读信息的地方。在数据库中存储数据的主要方法有两种:关系数据库将数据以行的形式存储在具有预定义结构的表中,而非关系数据库将数据独立地存储为文档。这篇文章将重点介绍从关系数据库访问数据。

关系数据库表与Pandas数据框非常相似,每一行对应一个特定的对象,而列则用于存储该对象的不同特征。例如,一个网站可能在其数据库中有一个表,用于存储其用户信息(用户名,名字,姓氏等)。
ID        名字        姓        用户名        密码
1个        杰里米        约旦        密码        密码
2        约翰        雪        冬天来了        自我支撑
3        安德森        帕克        是的        breezylovejoy
当我们想从关系数据库中获取信息时,我们可以通过查询(询问)来实现。具体来说,我们使用结构化查询语言(SQL)与数据库对话并访问数据。甲架构定义信息如何被存储在表内,实质上描述什么类型的信息被存储在每一列。

SQL能够搜索,过滤和合并可能存储在多个表中的数据。在本文中,我将讨论用于数据分析的常见SQL命令。

快速链接供参考
基本SQL命令
SELECT/FROM:指定感兴趣的列和表
LIMIT:限制查询结果
ORDER BY:指定返回的订单结果
WHERE:使用比较或逻辑运算符过滤数据
LIKE:用于匹配相似的值,而不是严格相同的值
BETWEEN:仅选择指定范围内的行
IN:指定要包含的值列表
AND:选择满足两个指定条件的行
OR:选择满足指定条件之一的行
NOT:选择不满足指定条件的行
IS NULL:选择指定列中具有空值的行
中级SQL命令
聚合函数(基于列)
COUNT(column):计算指定列中的行数
SUM(column):将所有值添加到指定列中
MIN/MAX(column):返回指定列中的最低/最高值
AVG(column):计算指定列中的平均值
GROUP BY:将记录分成组
HAVING:用于使用比较或逻辑运算符过滤组
DISTINCT:仅返回唯一值,不重复
CASE (WHEN/THEN/ELSE/END):SQL的if / then逻辑
数据联接
JOIN (ON):合并来自多个表的数据
INNER JOIN :排除所有不匹配的记录
LEFT JOIN:排除在联接表中找到的不匹配记录
RIGHT JOIN:排除在原始表中找到的不匹配记录
FULL OUTER JOIN:返回每个表中匹配和不匹配的所有记录
UNION (ALL):合并多个查询的结果
SQL命令的操作顺序
SQL数据类型(外部链接)
基本SQL命令

每个SQL查询绝对需要两个命令,即想要的数据(SELECT)和该数据的存储位置(FROM)。使用该SELECT命令,您可以指定要检索的表的列,而FROM指定要从中检索数据的表。“ *”符号是“ all”的简写,因此,如果您想从上面的示例表中获取所有用户字段,则可以执行类似的查询SELECT * FROM users。

的AS关键字将创建别名为在检索到的数据的列。
  1. SELECT first_name AS "First Name"
  2. FROM users
复制代码
您还可以合并来自不同列(在同一行中)的值。
  1. SELECT unread_count + read_count AS total_count
  2. FROM emails
复制代码
要限制查询结果LIMIT的大小,可以在查询末尾使用命令,然后是样本大小。
  1. SELECT *
  2. FROM users
  3. LIMIT 100
复制代码

您可以使用命令ORDER BY指定列以对返回的结果进行排序。默认顺序是升序,但是您可以DESC在指定列后返回结果的降序后添加关键字。您还可以指定多个列作为排序依据。

  1. SELECT *
  2. FROM users
  3. ORDER BY year, month DESC
复制代码

如果要过滤结果,则可以使用WHERE命令指定想要的结果,然后是要过滤的列以及比较或逻辑表达式。例如,您可以在数据库中查询用户年龄大于21岁的记录。

  1. SELECT *
  2. FROM users
  3. WHERE age > 21
复制代码

逻辑运算符

如果要过滤相似记录的集合,则可以使用来指定相似性LIKE(或ILIKE对于某些类型的SQL忽略字符串中的大小写)。该%符号可用作通配符,它​​可以表示任何字符或一组字符。要将通配符限制为仅一个字符,可以使用_符号。
  1. SELECT *
  2. FROM users
  3. WHERE name LIKE 'Bill%' -- returns for Bill, Billy, Billie, etc.
复制代码
要访问特定时间段,特定年龄组或您可能感兴趣的任何其他范围的数据,可以使用BETWEEN命令指定要过滤的结果范围。上限和下限都包括在搜索结果中。

  1. SELECT *
  2. FROM users
  3. WHERE age BETWEEN 20 AND 30
复制代码
对于更具体的范围,您可以使用IN命令指定要包括的每个值。

  1. SELECT *
  2. FROM users
  3. WHERE age IN (20, 22, 24, 26)
复制代码
AND和OR用于在数据上指定过滤器时组合多个表达式,其中AND仅返回满足所有规范的OR值,而将返回至少满足规范之一的值。
NOT 可用于否定任何表达式。
IS NULL将检查指定列中的数据是否为空。通常,它与NOT关键字结合使用以仅访问不包含空值的记录。

  1. SELECT *
  2. FROM users
  3. WHERE age IS NOT NULL
复制代码

中级SQL命令
汇总功能

COUNT(column)用于返回给定列中包含非空值的行数。您可以通过对索引列进行计数或使用来返回总行数*。
  1. -- returns total number of users
  2. SELECT COUNT(*)
  3. FROM users

  4. -- returns number of users where last_name is not blank
  5. SELECT COUNT(last_name)
  6. FROM users
复制代码

SUM(column) 提供指定列中所有数值的总和。
MIN(column)在列中提供最小值。对于包含文本的列,“ A”被认为是最小值。MAX(column)在列中提供最大值。对于包含文本的列,“ Z”被认为是最大值。
AVG(column) 计算数字列的算术平均值,忽略空值。
到目前为止,我们仅在整个数据集上使用了聚合函数。但是,可以将数据分为几组并独立地汇总每个组。假设您有一张表格,其中包含过去几年公司的每日股票价格,并且您想查看该时间段内每月的股票平均价格。您可以通过按年和月(GROUP BY)对记录进行分组来实现此目的,然后合计每组中的各个记录以找到平均值(AVG)。
  1. SELECT year,
  2.        month,
  3.        AVG(daily_open) AS monthly_avg
  4. FROM google_stock_price
  5. GROUP BY year, month
  6. ORDER BY month, year
复制代码
尽管先前讨论的WHERE命令可用于过滤单个记录,但HAVING用于过滤组。例如,您可以查询股票价格数据库以仅报告价格波动较大的月份的月平均值。同一组比较和逻辑运算符可用于过滤组。聚合器的功能(在此情况下,MAX和MIN)分别为每个组工作。

  1. SELECT year,
  2.        month,
  3.        AVG(daily_open) AS monthly_avg
  4. FROM google_stock_price
  5. GROUP BY year, month
  6. HAVING MAX(daily_open) - MIN(daily_open) > 50
  7. ORDER BY month, year
复制代码

如果您的表在记录之间有重复的值,则可以用于DISTINCT返回一组唯一值,或者在DISTINCT用于多列的情况下返回值的唯一组合。您还可以放置DISTINCT在聚合函数内部,以仅对唯一的一组值执行聚合。

  1. -- example using DISTINCT for multiple columns
  2. SELECT DISTINCT year, month
  3. FROM google_stock_price

  4. -- example using DISTINCT within an aggregator function (suppose there are multiple stock price records per day)
  5. SELECT year,
  6.        month,
  7.        COUNT(DISTINCT day) AS days_in_month
  8. FROM google_stock_price
复制代码
SQL可以在查询期间使用来执行“ if / then”逻辑CASE。总体结构是提供有关大小写为真的情况下(CASE-> THEN)的说明,如果大小写为非真假的情况下(ELSE-> END或just END)的说明。对于多个“ if”语句,您可以指定每种情况的处理方式(WHEN-> THEN)。

案例陈述可以在SELECT和GROUP BY陈述中使用。
  1. SELECT first_name,
  2.        last_name,
  3.        CASE WHEN age < 18
  4.        THEN 'child'
  5.        WHEN age >= 18
  6.        THEN 'adult'
  7.        ELSE NULL
  8.        END AS legal_age_classification
  9. FROM users

  10. -- count the number of records in each age bracket
  11. SELECT CASE WHEN age >= 7 AND age < 22 THEN 'gen_z'
  12.             WHEN age >= 22 AND age < 38 THEN 'gen_y'
  13.             WHEN age >= 38 AND age < 53 THEN 'gen_x'
  14.             WHEN age >= 53 THEN 'baby_boomer'
  15.             ELSE 'unassigned'
  16.             END AS age_group,
  17.             COUNT(1) AS count
  18. FROM users
  19. GROUP BY age_group

  20. -- reorient the age bracket count horizontally (like a pivot table)
  21. SELECT COUNT(CASE WHEN age >= 7 AND age < 22 THEN 1 ELSE NULL END) AS gen_z_count,
  22.        COUNT(CASE WHEN age >= 22 AND age < 38 THEN 1 ELSE NULL END) AS gen_y_count,
  23.        COUNT(CASE WHEN age >= 38 AND age < 53 THEN 1 ELSE NULL END) AS gen_x_count,
  24.        COUNT(CASE WHEN age >= 53 THEN 1 ELSE NULL END) AS baby_boomer_count
  25. FROM users
复制代码
合并来自不同来源的数据
数据联接用于合并存储在多个表中的相关信息。外键用于描述一个表中的记录如何与另一表中的信息相关。

如下所述,有许多不同的方法可以在两个表之间组合信息。这些方法定义了如何处理没有关联到其他表中的记录的记录。要了解以下如何加入讨论的工作,请查看此交互式演示。

注意:如果两个表具有相同的列名,则需要为结果中的列创建别名。这是通过完成的SELECT column AS alias。

为了合并来自多个表的数据,必须有一个公共字段将一个表中的记录与另一个表中的记录相关联。在这种情况下,我们可以通过使用JOIN指定包含相关信息的表并ON提供两个表之间的关系来合并记录。这就是说,当原始表中的记录与联接表中的记录匹配时,将两个记录合并。您还可以在ON语句中提供其他逻辑,以进一步控制要联接的记录。最后,您还可以指定要匹配的多个外键;如果在两个表之间共有两列,则同时使用这两个键有时可以提高查询的准确性。

  1. SELECT *
  2. FROM users
  3. JOIN emails
  4. ON users.id = emails.user_id
复制代码
专家提示:您还可以通过在表名后面添加别名来为表创建别名。
  1. SELECT *
  2. FROM really_long_name_for_table_of_users users -- here, users is an alias
  3. JOIN emails
  4. ON users.id = emails.user_id AND users.join_date > '20150214'
  5. -- example of additional logic used in the ON statement
复制代码

默认情况下,SQL执行内部联接。对于这种方法,仅返回与两个表相关的结果(不包括所有其他记录)。您也可以使用INNER JOIN代替显式定义内部联接JOIN,尽管这两个命令是同义词。


所有联接都会返回通过联接条件匹配的行,但是内部联接会排除所有不匹配的行。但是,即使记录与另一个表中的任何记录都不匹配,也可以包含记录-这被称为外部联接。不匹配的记录将包含通常从联接表中检索到的值的空值。


一个左连接(LEFT JOIN)返回原始表(通过指定的所有匹配的记录FROM),除了匹配的记录。不匹配的记录将包含从第二个表中检索到的字段的空值(通过指定JOIN)。


一个右连接(RIGHT JOIN)则正好相反,返回第二个表(通过指定的所有匹配的记录JOIN),除了匹配的记录。不匹配的记录将包含原始表(通过中指定FROM)中找不到的字段的空值。


一个完整的外部联接(FULL JOIN)返回的所有记录,匹配和不匹配,两个表。


您可以组合多个查询,通过创建一个将一个查询的结果堆叠在另一个查询的顶部UNION。默认情况下,UNION不会在结果中重复任何相同的行。如果要在查询中完全添加所有结果,则必须使用进行指定UNION ALL。为了使两个查询与一个联合兼容,它们必须具有相同的列数,并且在两个查询中每一列应具有相同的数据类型。
  1. SELECT *
  2. FROM table1

  3. UNION ALL

  4. SELECT *
  5. FROM table2
复制代码


操作顺序
建立SQL查询时,请务必记住命令的执行顺序。人们经常说,SQL命令的词汇顺序和逻辑顺序是不同的。它们的意思是我们用简单的英语(词汇)构成查询的方式并不总是与计算机执行查询所需的信息(逻辑)顺序相匹配。
  • FROM
  • ON
  • WHERE
  • GROUP BY
  • Aggregation functions (COUNT, SUM, MIN/MAX, AVG)
  • HAVING
  • SELECT
  • DISTINCT
  • UNION, INTERSECT, EXCEPT
  • ORDER BY
  • LIMIT, TOP





二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据分析 sql horizontally Aggregation inner join

已有 1 人评分经验 收起 理由
cheetahfly + 100 精彩帖子

总评分: 经验 + 100   查看全部评分

escaflowne1985 在职认证  发表于 2021-2-5 09:04:14 |显示全部楼层 |坛友微信交流群

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-28 23:52