如何编写简单查询
已发表: 2022-03-21如何查询 SQL 数据库:
- 确保您有一个数据库管理应用程序(例如 MySQL Workbench、Sequel Pro)。
- 如果没有,请下载数据库管理应用程序并与您的公司合作以连接您的数据库。
- 了解您的数据库及其层次结构。
- 找出您的表格中有哪些字段。
- 开始编写 SQL 查询以提取所需数据。
听说过 SQL 吗? 您可能在数据分析的背景下听说过它,但从没想过它会适用于您作为营销人员。 或者,您可能会想,“这是为高级数据用户准备的。 我永远做不到。”
好吧,你大错特错了! 最成功的营销人员都是数据驱动的,而数据驱动最重要的部分之一就是快速从数据库中收集数据。 SQL 是最流行的工具。
如果您的公司已经将数据存储在数据库中,您可能需要学习 SQL 才能访问数据。 但不用担心——您来对地方了。 让我们直接跳进去。
为什么使用 SQL?
SQL(通常发音为“sequel”)代表结构化查询语言,当公司有大量数据需要处理时使用它。 SQL 的美妙之处在于,在将数据存储在关系数据库中的公司工作的任何人都可以使用它。 (很有可能,你的确实如此。)
例如,如果您在一家软件公司工作并希望获取客户的使用数据,您可以使用 SQL 来实现。 如果您正在帮助开发一个包含客户购买数据的电子商务公司的网站,您可以使用 SQL 找出哪些客户正在购买哪些产品。 当然,这些只是众多可能应用中的一小部分。
这样想:你有没有在 Excel 中打开一个非常大的数据集,只让你的电脑死机甚至关机? SQL 允许您一次仅访问数据的某些部分,因此您不必将所有数据下载到 CSV 中、对其进行操作并可能使 Excel 过载。 换句话说,SQL 负责您可能习惯在 Excel 中进行的数据分析。
如何编写简单的 SQL 查询
在我们开始之前,请确保您有一个允许您从数据库中提取数据的数据库管理应用程序。 一些选项包括 MySQL 或 Sequel Pro。
首先下载这些选项之一,然后与您公司的 IT 部门讨论如何连接到您的数据库。 您选择的选项将取决于您产品的后端,因此请与您的产品团队核实以确保您选择了正确的选项。
了解数据库的层次结构
接下来,重要的是要习惯您的数据库及其层次结构。 如果您有多个数据数据库,则需要仔细研究要使用的数据的位置。
例如,假设我们正在使用有关美国人的多个数据库。 输入查询“SHOW DATABASES;”。 结果可能显示您有几个用于不同位置的数据库,包括一个用于新英格兰的数据库。
在您的数据库中,您将拥有不同的表,其中包含您要使用的数据。 使用上面的相同示例,假设我们想找出其中一个数据库中包含哪些信息。 如果我们使用查询“SHOW TABLES in NewEngland;”,我们会发现我们有新英格兰每个州的表:people_connecticut、people_maine、people_massachusetts、people_newhampshire、people_rhodeisland 和 people_vermont。
最后,您需要找出表中有哪些字段。 字段是您可以从数据库中提取的特定数据。 例如,如果要拉取某人的地址,字段名称可能不只是“地址”——它可能分为地址城市、地址状态、地址压缩。 为了弄清楚这一点,请使用查询“Describe people_massachusetts;”。 这提供了您可以使用 SQL 提取的所有数据的列表。
让我们使用我们的新英格兰示例快速查看层次结构:
- 我们的数据库是:新英格兰。
- 我们在该数据库中的表是:people_connecticut、people_maine、people_massachusetts、people_newhampshire、people_rhodeisland 和 people_vermont。
- people_massachusetts 表中的字段包括:address_city、address_state、address_zip、hair_color、age、first_name 和 last_name。
现在,让我们编写一些简单的 SQL 查询来从我们的 NewEngland 数据库中提取数据。
基本 SQL 查询
要了解如何编写 SQL 查询,让我们使用以下示例:
2003 年出生的马萨诸塞州有哪些红头发的人按字母顺序排列?
选择
SELECT 选择要在图表中显示的字段。 这是您要从数据库中提取的特定信息。 在上面的示例中,我们希望找到符合其余条件的人。
这是我们的 SQL 查询:
选择
名,
姓
;
从
FROM 精确定位您要从中提取数据的表。 在前面的部分中,我们了解到新英格兰的六个州分别有六个表:people_connecticut、people_maine、people_massachusetts、people_newhampshire、people_rhodeisland 和 people_vermont。 因为我们专门寻找马萨诸塞州的人,所以我们将从该特定表中提取数据。
这是我们的 SQL 查询:
选择
名,
姓
从
people_massachusetts
;
在哪里
WHERE 允许您过滤更具体的查询。 在我们的示例中,我们希望过滤查询以仅包含 2003 年出生的红头发的人。让我们从红头发过滤器开始。
这是我们的 SQL 查询:
选择
名,
姓
从
people_massachusetts
在哪里
头发颜色=“红色”
;
如果您想查看马萨诸塞州的所有人以及他们的头发颜色,hair_color 可能是您最初的 SELECT 语句的一部分。 但是,如果您想过滤以仅查看红头发的人,则可以使用 WHERE 语句来实现。
之间
除了等于 (=),BETWEEN 是另一个可用于条件查询的运算符。 对于介于指定最小值和最大值之间的值,BETWEEN 语句为真。
在我们的例子中,我们可以使用 BETWEEN 从特定年份提取记录,例如 2003 年。这是查询:
选择
名,
姓
从
people_massachusetts
在哪里
出生日期在“2003-01-01”和“2003-12-31”之间
;
和
AND 允许您向 WHERE 语句添加其他条件。 请记住,除了 2003 年出生的人之外,我们还想过滤红头发的人。由于我们的 WHERE 语句被红头发标准占用,我们如何才能过滤特定的出生年份呢?
这就是 AND 语句的用武之地。在这种情况下,AND 语句是一个日期属性——但不一定非要如此。 (注意:请与您的产品团队核对日期格式,确保格式正确。)
这是我们的 SQL 查询:
选择
名,
姓
从
people_massachusetts
在哪里
头发颜色=“红色”
和
出生日期在“2003-01-01”和“2003-12-31”之间
;
或者
OR 也可以与 WHERE 语句一起使用。 使用 AND 时,两个条件都必须为真才能出现在结果中(例如,头发颜色必须是红色并且必须在 2003 年出生)。 对于 OR,任一条件都必须为真才能出现在结果中(例如,头发颜色必须是红色或必须在 2003 年出生)。
下面是 OR 语句在运行中的样子:
选择
名,
姓
从
people_massachusetts
在哪里
hair_color = '红色'
或者
出生日期在“2003-01-01”和“2003-12-31”之间
;
不是
在 WHERE 语句中使用 NOT 来显示指定条件不成立的值。 如果我们想拉出所有没有红头发的马萨诸塞州居民,我们可以使用以下查询:
选择
名,
姓
从
people_massachusetts
哪里没有
hair_color = '红色'
;
订购方式
计算和组织也可以在查询中完成。 这就是 ORDER BY 和 GROUP BY 函数的用武之地。首先,我们将使用 ORDER BY 和 GROUP BY 函数查看 SQL 查询。 然后,我们将简要了解两者之间的区别。
ORDER BY 子句允许您按您在 SELECT 语句中指定的任何字段进行排序。 在这种情况下,让我们按姓氏排序。
这是我们的 SQL 查询:
选择
名,
姓
从
people_massachusetts
在哪里
hair_color = '红色'
和
出生日期在“2003-01-01”和“2003-12-31”之间
订购方式
姓
;
通过...分组
GROUP BY 类似于 ORDER BY,但聚合了具有相似性的数据。 例如,如果您的数据中有任何重复项,则可以使用 GROUP BY 来计算字段中的重复项数。
这是您的 SQL 查询:
选择
名,
姓
从
people_massachusetts
在哪里
hair_color = '红色'
和
出生日期在“2003-01-01”和“2003-12-31”之间
通过...分组
姓
;
由 VS 订购通过...分组
为了展示 ORDER BY 语句和 GROUP BY 语句之间的区别,让我们简单地跳出马萨诸塞州的示例,看看一个非常简单的数据集。 以下是四名员工的身份证号码和姓名的列表。
如果我们在此列表中使用 ORDER BY 语句,员工的姓名将按字母顺序排序。 结果将如下所示:
如果我们改为使用 GROUP BY 语句,则员工将根据他们在初始表中出现的次数进行计数。 请注意,Peter 在初始表中出现了两次,因此结果如下所示:
跟我到现在? 好的,让我们回到我们一直在创建的关于 2003 年出生的马萨诸塞州红头发人的 SQL 查询。
限制
根据数据库中的数据量,运行查询可能需要很长时间。 这可能会令人沮丧,特别是如果您在查询中出错并且现在需要等待才能继续。 如果你想测试一个查询,LIMIT 函数可以让你限制你得到的结果的数量。
例如,如果我们怀疑马萨诸塞州有成千上万的人有红头发,我们可能希望在完全运行之前使用 LIMIT 测试我们的查询,以确保我们得到了我们想要的信息。 例如,假设我们只想查看结果中的前 100 人。
这是我们的 SQL 查询:
选择
名,
姓
从
people_massachusetts
在哪里
hair_color = '红色'
和
出生日期在“2003-01-01”和“2003-12-31”之间
订购方式
姓
限制
100
;
插入
除了从关系数据库中检索信息之外,SQL 还可用于修改数据库的内容。 当然,您需要权限才能更改公司的数据。 但是,如果您曾经负责管理数据库的内容,我们将分享一些您应该知道的查询。
首先是 INSERT INTO 语句,用于将新值放入数据库。 如果我们想向马萨诸塞州的表中添加一个新人,我们可以通过首先提供我们要修改的表的名称以及我们要添加到的表中的字段来实现。 接下来,我们将要添加的每个相应值写入 VALUE。
该查询可能如下所示:
插入
people_massachusetts (address_city, address_state, address_zip, hair_color, age, first_name, last_name)

价值观
(剑桥,马萨诸塞州,02139,金发女郎,32 岁,Jane,Doe)
;
或者,如果要向表中的每个字段添加值,则无需指定字段。 这些值将按照它们在查询中列出的顺序添加到列中。
插入
people_massachusetts
价值观
(剑桥,马萨诸塞州,02139,金发女郎,32 岁,Jane,Doe)
;
如果您只想向特定字段添加值,则必须指定这些字段。 假设我们只想插入一条包含 first_name、last_name 和 address_state 的记录——我们可以使用以下查询:
插入
people_massachusetts (first_name, last_name, address_state)
价值观
(Jane,Doe,马萨诸塞州)
;
更新
如果您想用不同的值替换数据库中的现有值,可以使用 UPDATE。 例如,如果有人在数据库中记录为红头发,而实际上他们的头发是棕色的,该怎么办? 我们可以使用 UPDATE 和 WHERE 语句更新这条记录:
更新
people_massachusetts
放
hair_color = '棕色'
在哪里
first_name = '简'
和
姓氏 = 'Doe'
;
或者,假设您的表中存在问题,其中“address_state”的某些值显示为“Massachusetts”,而其他值显示为“MA”。 要将“MA”的所有实例更改为“Massachusetts”,我们可以使用一个简单的查询并一次更新多条记录:
更新
people_massachusetts
放
address_state = '马萨诸塞州'
在哪里
地址状态 = MA
;
使用 UPDATE 时要小心。 如果您没有使用 WHERE 语句指定要更改的记录,您将更改表中的所有值。
删除
DELETE 从您的表中删除记录。 与 UPDATE 一样,请务必包含 WHERE 语句,以免意外删除整个表。
或者,如果我们碰巧在 people_massachusetts 表中找到了几条实际居住在缅因州的记录,我们可以通过定位 address_state 字段来快速删除这些条目,如下所示:
删除自
people_massachusetts
在哪里
address_state = '缅因州'
;
奖励:高级 SQL 提示
现在您已经学习了如何创建一个简单的 SQL 查询,让我们讨论一些其他技巧,您可以使用这些技巧将您的查询提升一个档次,从星号开始。
*(星号)
当您向 SQL 查询添加星号字符时,它会告诉查询您希望在结果中包含所有数据列。
在我们一直使用的马萨诸塞州示例中,我们只有两个列名:first_name 和 last_name。 但是假设我们想要在结果中看到 15 列数据——在 SELECT 语句中输入所有 15 列名称会很痛苦。 相反,如果您将这些列的名称替换为星号,则查询将知道将所有列拉入结果中。
下面是 SQL 查询的样子:
选择
*
从
people_massachusetts
在哪里
头发颜色=“红色”
和
出生日期在“2003-01-01”和“2003-12-31”之间
订购方式
姓
限制
100
;
%(百分比符号)
百分号是一个通配符,意味着它可以表示数据库值中的一个或多个字符。 通配符有助于查找共享常见字符的记录。 它们通常与 LIKE 运算符一起用于在数据中查找模式。
例如,如果我们想获取表中邮政编码以“02”开头的每个人的姓名,我们可以编写以下查询:
选择
名,
姓
在哪里
address_zip LIKE '02%'
;
在这里,“%”代表“02”之后的任何数字组,因此此查询会查找任何具有以“02”开头的 address_zip 值的记录。
过去 30 天
一旦我开始定期使用 SQL,我发现我的一个首选查询涉及试图找出哪些人在过去 30 天内采取了行动或满足了一组特定条件。
假设今天是 2021 年 12 月 1 日。您可以通过将birth_date 设为 2021 年 11 月 1 日和 2021 年 11 月 30 日之间的跨度来创建这些参数。该 SQL 查询如下所示:
选择
名,
姓
从
people_massachusetts
在哪里
头发颜色=“红色”
和
出生日期在“2021-11-01”和“2021-11-30”之间
订购方式
姓
限制
100
;
但是,这需要考虑哪些日期涵盖了过去 30 天,并且您必须不断更新此查询。
相反,要使日期自动跨越过去 30 天,无论是哪一天,您可以在 AND 下键入:birth_date >= (DATE_SUB(CURDATE(),INTERVAL 30))
(注意:您需要与您的产品团队仔细检查此语法,因为它可能会根据您用于提取 SQL 查询的软件而有所不同。)
因此,您的完整 SQL 查询将如下所示:
选择
名,
姓
从
people_massachusetts
在哪里
头发颜色=“红色”
和
出生日期 >= (DATE_SUB(CURDATE(),INTERVAL 30))
订购方式
姓
限制
100
;
数数
在某些情况下,您可能需要计算字段条件出现的次数。 例如,假设您要计算从马萨诸塞州统计的人出现不同头发颜色的次数。 在这种情况下,COUNT 会派上用场,因此您不必手动添加不同头发颜色的人数或将该信息导出到 Excel。
下面是那个 SQL 查询的样子:
选择
发色,
计数(头发颜色)
从
people_massachusetts
和
出生日期在“2003-01-01”和“2003-12-31”之间
通过...分组
发色
;
平均
AVG 计算查询结果中属性的平均值,不包括 NULL 值(空)。 在我们的示例中,我们可以使用 AVG 来计算查询中马萨诸塞州居民的平均年龄。
下面是我们的 SQL 查询的样子:
选择
平均(年龄)
从
people_massachusetts
;
和
SUM 是您可以在 SQL 中执行的另一个简单计算。 它计算查询中所有属性的总值。 因此,如果我们想将马萨诸塞州居民的所有年龄相加,我们可以使用以下查询:
选择
总和(年龄)
从
people_massachusetts
;
最小值和最大值
MIN 和 MAX 是两个 SQL 函数,它们为您提供给定字段的最小值和最大值。 我们可以使用它来识别马萨诸塞州表中年龄最大和最年轻的成员:
此查询将为我们提供最旧的记录:
选择
最小(年龄)
从
people_massachusetts
;
这个查询给了我们最旧的:
选择
MAX(年龄)
从
people_massachusetts
;
加入
有时您可能需要在一个 SQL 查询中访问来自两个不同表的信息。 在 SQL 中,您可以使用 JOIN 子句来执行此操作。
(对于那些熟悉 Excel 公式的人来说,当您需要在 Excel 中组合来自两个不同工作表的信息时,这类似于使用 VLOOKUP 公式。)
假设我们有一张表,其中包含所有马萨诸塞州居民的用户 ID 及其出生日期的数据。 此外,我们还有一个完全独立的表格,其中包含所有马萨诸塞州居民的用户 ID 和他们的头发颜色。
如果我们想弄清楚 2003 年出生的马萨诸塞州居民的头发颜色,我们需要访问两个表中的信息并将它们组合起来。 这是因为两个表共享一个匹配的列:用户 ID。
因为我们从两个不同的表中调用字段,所以我们的 SELECT 语句也将略有变化。 我们需要指定它们来自哪个表,而不是仅仅列出我们想要包含在结果中的字段。 (注意:星号函数在这里可能会派上用场,因此您的查询在结果中包含两个表。)
要从特定表中指定字段,我们所要做的就是将表名与字段名结合起来。 例如,我们的 SELECT 语句会说“table.field”——用句点分隔表名和字段名。
在这种情况下,我们还假设了一些事情:
- 马萨诸塞州生日表包括以下字段:first_name、last_name、user_id、birthdate
- 马萨诸塞州头发颜色表包括以下字段:user_id、hair_color
因此,您的 SQL 查询将如下所示:
选择
生日_马萨诸塞州.first_name,
生日_马萨诸塞州.last_name
从
生日_马萨诸塞州加入头发颜色_马萨诸塞州使用(user_id)
在哪里
头发颜色=“红色”
和
出生日期在“2003-01-01”和“2003-12-31”之间
订购方式
姓
;
此查询将使用同时出现在birthdate_massachusetts 表和haircolor_massachusetts 表中的字段“user_id”连接两个表。 然后,您可以看到一张 2003 年出生的红头发人的表格。
案子
如果要根据满足的条件向查询返回不同的结果,请使用 CASE 语句。 按顺序评估条件。 一旦满足条件,则返回相应的结果,并跳过所有后续条件。
如果不满足任何条件,您可以在末尾包含 ELSE 条件。 如果没有 ELSE,则如果不满足任何条件,查询将返回 NULL。
下面是一个使用 CASE 根据查询返回字符串的示例:
选择
名,
姓
从
people_massachusetts
案子
WHEN hair_color = 'brown' THEN '这个人有一头棕色的头发。
WHEN hair_color = 'blonde' THEN '这个人有一头金发。
WHEN hair_color = 'red' THEN '这个人有一头红头发。
ELSE '头发颜色未知。
结尾
;
营销人员应该知道的基本 SQL 查询
恭喜。 您已准备好运行自己的 SQL 查询! 虽然您可以使用 SQL 做更多事情,但我希望您发现此基础知识概述对您有所帮助,这样您就可以亲自动手了。 凭借扎实的基础知识,您将能够更好地导航 SQL 并处理一些更复杂的示例。
编者注:这篇文章最初发表于 3 月 25 日,为了全面性已经更新。