使用 python 在 mysql 中进行查询(SELECT 篇)

328 阅读8分钟

什么是CRUD

任何持久存储系统(如 MySQL)的四个基本功能都拼写为 CRUD:

  • create

  • read

  • update

  • delete

这些是每个基本 MIySQL 命令都反映的关键概念。

单词本身没有任何技术意义,但概念非常重要。它们代表了您在使用的每个关系数据库系统中可以执行的四个活动。

在 MySQL 中查询

为了最好地了解如何通过MySQL for Python提交查询,重要的是要确保您了解如何在MySQL本身中提交查询。

MySQL 语句具有基本结构。在遵循设定的结构中,它们像自然语言语句一样形成。作为一个计算机程序,可以理解的是,它对信息陈述的反应非常差,对问题的反应也只是中等水平。几乎所有的MySQL语句都有一个不知所措的语气,表达你的命令。这反映了客户端-服务器关系。计算机是仆人,它的存在是为了将自己作为客户或主人(如果您愿意)执行命令。

简单MySQL语句的语法结构与您每天使用的语言没有什么不同。

其中英语将具有:

  • Give me everything from the staff table!

MySQL:

  • SELECT*FROM staff;

让我们看一下MySQL语句,将其与英语进行详细比较。

SELECT

MySQL不支持像Give Me这样的自然语言搜索。相反,像包括Python在内的其他编程语言一样,MySQL有一组保留的关键字。这些基本上是常见核心操作的单个同义词。对于数据检索,关键字是 SELECT。它可能是GIMME或任何类似的方式来表达同样的事情,但MySQL与Python的Zen是一致的:

There should be one-and preferably only one-obvious way to do it

因此,MySQL开发人员决定使用一个恰好符合SQL标准的关键字。

*(星号)

通过阅读您的正则表达式,我相信您能识别出这个通用量词。虽然它是最常用的元字符之一,但MySQL支持几个元字符,您可以使用它们来细微地处理搜索。

MySQL在不同的上下文中支持不同类型的元字符。以下是元字符的完整列表。(请注意,在给定情况下,并非所有方法都受支持。

.:匹配任意单个字符 

?:匹配零个或一个字符

*:匹配零个或多个字符 

+:匹配一个或多个字符 

{n}:匹配表达式 n 次

{m, n}:匹配表达式的最小值为 m 和最大值为 n 次

{n, }:匹配表达式 n 次或更多次

^:表示行首的位级指示符 

$:表示行尾的位级指示符

[[:<:]]:匹配单词的开头

[[:>:]]:匹配单词的结尾

[:class:]:匹配字符类

[:alpha:]:对于字母

[:空格:]:用于空格

[:p unct:]:用于标点符号

[:upper:]:用于大写字母

[abc]:匹配包含的字符之一

[^xyz]:匹配除括起来的字符以外的任何字符 

|:分隔表达式中的替代项

对于 SELECT 命令,星号是唯一支持的元字符。但是,除了星号之外,SELECT 还支持用于量化结果的几个参数:

  • ALL:所有匹配的行(与使用星号 (*) 同义)

  • DISTINCT:将结果集排序为唯一值

  • DISTINCTROW:整个记录是唯一的

这些中的每一个都可以在要量化的字段之前作为前缀,如下所示:

SELECT DISTINCT ID FROM MENU;

这将从菜单表中返回 id 列的值,并从结果中删除任何重复项。

FROM

与英语一样,MySQL需要一些上下文才能检索任何内容。在英语中,如果一个人简单地说给我!如果没有针对预期上下文的非语言提示,听众会理所当然地感到困惑。所以在这里我们告诉MySQL我们希望它从当前数据库中的哪个表中提取信息。

请注意,这在技术上是可选的。但是,将其关闭通常意味着您正在使用MySQL的内置数据集。例如,下面是一个使用当前日期、用户和版本的内置函数的语句(\G 与 \g 的命令相同,但它告诉 MySQL 垂直显示结果):

image.png

STAFF

这只是要搜索的表的名称。在英语中,人们可能渴望从许多地方获得一些东西。这就是为什么我们需要澄清我们想要远桌上的项目。另一方面,MySQL只能理解数据库和表,因此将紧跟在FROM关键字之后的任何内容理解为表的名称。

;(分号)

分号是 MySQL 中的默认语句分隔符。

创建MySQL脚本或通过其shell与MySQL动态交互,在语句末尾留下分号将导致第二次提示,或者,如果您使用,则会抛出错误。正如我们稍后将看到的,MySQL for Python 和 Python 本身的语法要求以不同的方式显示行尾。因此,在 Python 中传递 MySQL 查询时,我们不需要以分号结束任何语句。

您可能想知道为什么MySQL查询的某些部分是大写的。

它是MySQL语句的标准表示格式,以大写字母表示MySQL语句的静态或标准元素。但是,语句的可变部分区分大小写,必须使用与创建它们相同的大小写进行调用(否则,MySQL将引发错误)。

如果您从MySQL提示符直接与MySQL交互,则大写问题并不重要。在那里,MySQL将理解您的语句,无论它们是全部大写还是小写。但是,无论是在 Python 还是在 MySQL 脚本中。您的代码中,适当的大写对于使您的 SQL 语句以及对下一个开发人员可读性至关重要

其中分号是MySQL shell中的语句分隔符,反斜杠(\)用于分隔语句中的行。因此,如果您想分解语句,但在按回车键时不执行它,只需在语句的每一行末尾使用反斜杠即可。

例如:

image.png

WHERE

WHERE 用于声明 MySQL 缩小搜索结果范围的条件。该子句的基本语法为:

[where where_condition]

例如:

image.png

GROUP BY

GROUP BY 允许您根据以下三个参数之一对结果进行分组:

  • col_name:是表的列之一的名称

  • expr:是正则表达式

  • position:是表格中的位置

分组后,您可以告诉MySQL分别通过ASC和DESC以ASCending或DESCending顺序列出结果。前者是默认值。此外,MySQL通过使用WITH ROLLUP在结果末尾提供了一个总结行。

GROUP BY 子句的语法为:

GROUP BY {col_name | expr| position} [ASC |DESC], [WITH ROLLUP] 若要了解 GROUP BY 的效果,可以从表中检索所有值。

image.png

仅在一列上使用 GROUP BY 可以按字母顺序为我们提供相同的列表:

image.png

如果我们对某些鱼(例如,金枪鱼和黄鳍金枪鱼)有多个条目,它也可以用来按字段值进行计数。

image.png

HAVING

由于已经讨论了 WHERE 子句,人们可能会正确地想知道 - HAVING 子句的意义何在?

WHERE 子句用于简单事实,不支持聚合函数。

HAVING 子句用于聚合函数。它可以用来替换 WHERE,但这样做通常被视为糟糕的编码,因为它违反了 SQL 标准。

HAVING 子句用于根据聚合函数量化结果。因此,它通常与 GROUP BY 子句结合使用。

HAVING 子句的基本语法是:

HAVING where_condition

继续前面的菜单示例,一个基本示例是:

image.png

对于更接近现实生活的示例,想要了解哪些客户租用最多视频的视频租赁商店可能会使用如下所示的查询:

image.png

这将显示客户编号,后跟总自定义超过 40 个视频的每个客户的租赁记录中的总租赁数量。

ORDER BY

顾名思义,ORDER BY子句用于告诉MySQL如何对查询结果进行排序。此子句的基本语法结构如下:

[ORDER BY {col_name| expr | position}[ASC |DESC],...]

虽然 ORDER BY 子句可以与 GROUP BY 修饰符结合使用,但这通常不是必需的。

以下两个示例说明了原因:

image.png

由于 ORDER BY 是在 GROUP BY 之后应用的,因此它在很大程度上消除了对分组的需求。

LIMIT

LIMIT 子句用于限制结果集中返回的行数。它接受两个正整数作为参数。第一个数字表示开始计数的点,对于该过程,从零开始计数。第二个数字表示将第一个数字递增多少次以确定所需的限制。

LIMIT 子句的语法如下:

LIMIT {[offset,] row_count | row_count OFFSET offset)

以下四个示例显示了如何使用 LIMIT 来整齐地减少返回的结果。

以迭代方式使用,递增 LIMIT 子句的参数允许您逐步浏览结果。

在第一个示例中,LIMIT 应用于按字母顺序排列的鱼名列表。

我们之前用于 GROUP BY 的表相同。

请注意,ID 号不按顺序排列。

image.png

为了使 ID 号正确排序,我们使用 ORDER BY 子句在将 LIMIT 子句的限制应用于数据之前。

image.png

最后两个示例说明了如何将 LIMIT 应用于可以轻松返回分数(如果不是数百或数千)命中的搜索。

image.png

LIMIT 和 HAVING 可能看起来非常相似,因为它们都可以缩小聚合范围。它们之间的区别在于MySQL应用它们的时间.在MySQL操作查询之前,HAVE作为搜索的参数应用。另一方面,LIMIT 子句在返回搜索结果后应用。


文正在参加「技术专题19期 漫谈数据库技术」活动